2
0

if-conversion-edgemasks.ll 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. ; RUN: opt -S -loop-vectorize < %s | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  3. target triple = "x86_64-apple-macosx10.9.0"
  4. @a = global i32* null, align 8
  5. @b = global i32* null, align 8
  6. @c = global i32* null, align 8
  7. ; Don't create an exponetial IR for the edge masks needed when if-converting
  8. ; this code.
  9. ; PR16472
  10. ; CHECK-NOT: %6000000 =
  11. define void @_Z3fn4i(i32 %p1) {
  12. entry:
  13. %cmp88 = icmp sgt i32 %p1, 0
  14. br i1 %cmp88, label %for.body.lr.ph, label %for.end
  15. for.body.lr.ph:
  16. %0 = load i32*, i32** @b, align 8
  17. %1 = load i32*, i32** @a, align 8
  18. %2 = load i32*, i32** @c, align 8
  19. br label %for.body
  20. for.body:
  21. %indvars.iv = phi i64 [ 0, %for.body.lr.ph ], [ %indvars.iv.next, %_ZL3fn3ii.exit58 ]
  22. %arrayidx = getelementptr inbounds i32, i32* %0, i64 %indvars.iv
  23. %3 = load i32, i32* %arrayidx, align 4 %4 = trunc i64 %indvars.iv to i32
  24. %and.i = and i32 %4, 1
  25. %tobool.i.i = icmp eq i32 %and.i, 0
  26. br i1 %tobool.i.i, label %if.end.i, label %if.then.i
  27. if.then.i:
  28. %and.i.i = lshr i32 %3, 2
  29. %and.lobit.i.i = and i32 %and.i.i, 1
  30. %5 = xor i32 %and.lobit.i.i, 1
  31. %or.i.i = or i32 %5, %3
  32. %cmp.i = icmp sgt i32 %or.i.i, 0
  33. %conv.i = zext i1 %cmp.i to i32
  34. br label %if.end.i
  35. if.end.i:
  36. %tobool.i87 = phi i1 [ true, %if.then.i ], [ false, %for.body ]
  37. %p1.addr.0.i = phi i32 [ %conv.i, %if.then.i ], [ %3, %for.body ]
  38. %6 = trunc i64 %indvars.iv to i32
  39. %and1.i = and i32 %6, 7
  40. %tobool2.i = icmp eq i32 %and1.i, 0
  41. br i1 %tobool2.i, label %if.end7.i, label %if.then3.i
  42. if.then3.i:
  43. %p1.addr.0.lobit.i = lshr i32 %p1.addr.0.i, 31
  44. %and6.i = and i32 %p1.addr.0.i, 1
  45. %or.i = or i32 %p1.addr.0.lobit.i, %and6.i
  46. br label %if.end7.i
  47. if.end7.i:
  48. %p1.addr.1.i = phi i32 [ %or.i, %if.then3.i ], [ %p1.addr.0.i, %if.end.i ]
  49. br i1 %tobool.i87, label %if.then10.i, label %if.end13.i
  50. if.then10.i:
  51. %cmp11.i = icmp sgt i32 %p1.addr.1.i, 0
  52. %conv12.i = zext i1 %cmp11.i to i32
  53. br label %if.end13.i
  54. if.end13.i:
  55. %p1.addr.2.i = phi i32 [ %conv12.i, %if.then10.i ], [ %p1.addr.1.i, %if.end7.i ]
  56. br i1 %tobool.i.i, label %_Z3fn2iii.exit, label %if.then16.i
  57. if.then16.i:
  58. %and17.i = lshr i32 %p1.addr.2.i, 3
  59. %and17.lobit.i = and i32 %and17.i, 1
  60. br label %_Z3fn2iii.exit
  61. _Z3fn2iii.exit:
  62. %p1.addr.3.i = phi i32 [ %and17.lobit.i, %if.then16.i ], [ %p1.addr.2.i, %if.end13.i ]
  63. %7 = trunc i64 %indvars.iv to i32
  64. %shr.i = ashr i32 %7, 1
  65. %and.i18.i = and i32 %shr.i, 1
  66. %tobool.i19.i = icmp ne i32 %and.i18.i, 0
  67. br i1 %tobool.i19.i, label %if.then.i20.i, label %if.end.i.i
  68. if.then.i20.i:
  69. %cmp.i.i = icmp sgt i32 %p1.addr.3.i, 0
  70. %conv.i.i = zext i1 %cmp.i.i to i32
  71. br label %if.end.i.i
  72. if.end.i.i:
  73. %p1.addr.0.i21.i = phi i32 [ %conv.i.i, %if.then.i20.i ], [ %p1.addr.3.i, %_Z3fn2iii.exit ]
  74. %and1.i.i = and i32 %shr.i, 7
  75. %tobool2.i.i = icmp eq i32 %and1.i.i, 0
  76. br i1 %tobool2.i.i, label %if.end7.i.i, label %if.then3.i.i
  77. if.then3.i.i:
  78. %p1.addr.0.lobit.i.i = lshr i32 %p1.addr.0.i21.i, 31
  79. %and6.i.i = and i32 %p1.addr.0.i21.i, 1
  80. %or.i22.i = or i32 %p1.addr.0.lobit.i.i, %and6.i.i
  81. br label %if.end7.i.i
  82. if.end7.i.i:
  83. %p1.addr.1.i.i = phi i32 [ %or.i22.i, %if.then3.i.i ], [ %p1.addr.0.i21.i, %if.end.i.i ]
  84. br i1 %tobool.i19.i, label %if.then10.i.i, label %if.end13.i.i
  85. if.then10.i.i:
  86. %cmp11.i.i = icmp sgt i32 %p1.addr.1.i.i, 0
  87. %conv12.i.i = zext i1 %cmp11.i.i to i32
  88. br label %if.end13.i.i
  89. if.end13.i.i:
  90. %p1.addr.2.i.i = phi i32 [ %conv12.i.i, %if.then10.i.i ], [ %p1.addr.1.i.i, %if.end7.i.i ]
  91. %and14.i.i = and i32 %shr.i, 5
  92. %tobool15.i.i = icmp eq i32 %and14.i.i, 0
  93. br i1 %tobool15.i.i, label %_Z3fn2iii.exit.i, label %if.then16.i.i
  94. if.then16.i.i:
  95. %and17.i.i = lshr i32 %p1.addr.2.i.i, 3
  96. %and17.lobit.i.i = and i32 %and17.i.i, 1
  97. br label %_Z3fn2iii.exit.i
  98. _Z3fn2iii.exit.i:
  99. %p1.addr.3.i.i = phi i32 [ %and17.lobit.i.i, %if.then16.i.i ], [ %p1.addr.2.i.i, %if.end13.i.i ]
  100. %8 = trunc i64 %indvars.iv to i32
  101. %tobool.i11.i = icmp eq i32 %8, 0
  102. br i1 %tobool.i11.i, label %_ZL3fn3ii.exit, label %if.then.i15.i
  103. if.then.i15.i:
  104. %and.i12.i = lshr i32 %p1.addr.3.i.i, 2
  105. %and.lobit.i13.i = and i32 %and.i12.i, 1
  106. %9 = xor i32 %and.lobit.i13.i, 1
  107. %or.i14.i = or i32 %9, %p1.addr.3.i.i
  108. br label %_ZL3fn3ii.exit
  109. _ZL3fn3ii.exit:
  110. %p1.addr.0.i16.i = phi i32 [ %or.i14.i, %if.then.i15.i ], [ %p1.addr.3.i.i, %_Z3fn2iii.exit.i ]
  111. %arrayidx2 = getelementptr inbounds i32, i32* %1, i64 %indvars.iv
  112. store i32 %p1.addr.0.i16.i, i32* %arrayidx2, align 4 %arrayidx4 = getelementptr inbounds i32, i32* %0, i64 %indvars.iv
  113. %10 = load i32, i32* %arrayidx4, align 4 br i1 %tobool.i.i, label %_Z3fn1ii.exit.i26, label %if.then.i.i21
  114. if.then.i.i21:
  115. %and.i.i18 = lshr i32 %10, 2
  116. %and.lobit.i.i19 = and i32 %and.i.i18, 1
  117. %11 = xor i32 %and.lobit.i.i19, 1
  118. %or.i.i20 = or i32 %11, %10
  119. br label %_Z3fn1ii.exit.i26
  120. _Z3fn1ii.exit.i26:
  121. %p1.addr.0.i.i22 = phi i32 [ %or.i.i20, %if.then.i.i21 ], [ %10, %_ZL3fn3ii.exit ]
  122. br i1 %tobool.i87, label %if.then.i63, label %if.end.i67
  123. if.then.i63:
  124. %cmp.i61 = icmp sgt i32 %p1.addr.0.i.i22, 0
  125. %conv.i62 = zext i1 %cmp.i61 to i32
  126. br label %if.end.i67
  127. if.end.i67:
  128. %p1.addr.0.i64 = phi i32 [ %conv.i62, %if.then.i63 ], [ %p1.addr.0.i.i22, %_Z3fn1ii.exit.i26 ]
  129. br i1 %tobool2.i, label %if.end7.i73, label %if.then3.i71
  130. if.then3.i71:
  131. %p1.addr.0.lobit.i68 = lshr i32 %p1.addr.0.i64, 31
  132. %and6.i69 = and i32 %p1.addr.0.i64, 1
  133. %or.i70 = or i32 %p1.addr.0.lobit.i68, %and6.i69
  134. br label %if.end7.i73
  135. if.end7.i73:
  136. %p1.addr.1.i72 = phi i32 [ %or.i70, %if.then3.i71 ], [ %p1.addr.0.i64, %if.end.i67 ]
  137. br i1 %tobool.i87, label %if.then10.i76, label %if.end13.i80
  138. if.then10.i76:
  139. %cmp11.i74 = icmp sgt i32 %p1.addr.1.i72, 0
  140. %conv12.i75 = zext i1 %cmp11.i74 to i32
  141. br label %if.end13.i80
  142. if.end13.i80:
  143. %p1.addr.2.i77 = phi i32 [ %conv12.i75, %if.then10.i76 ], [ %p1.addr.1.i72, %if.end7.i73 ]
  144. br i1 %tobool.i.i, label %_Z3fn2iii.exit85, label %if.then16.i83
  145. if.then16.i83:
  146. %and17.i81 = lshr i32 %p1.addr.2.i77, 3
  147. %and17.lobit.i82 = and i32 %and17.i81, 1
  148. br label %_Z3fn2iii.exit85
  149. _Z3fn2iii.exit85:
  150. %p1.addr.3.i84 = phi i32 [ %and17.lobit.i82, %if.then16.i83 ], [ %p1.addr.2.i77, %if.end13.i80 ]
  151. br i1 %tobool.i19.i, label %if.then.i20.i29, label %if.end.i.i33
  152. if.then.i20.i29:
  153. %cmp.i.i27 = icmp sgt i32 %p1.addr.3.i84, 0
  154. %conv.i.i28 = zext i1 %cmp.i.i27 to i32
  155. br label %if.end.i.i33
  156. if.end.i.i33:
  157. %p1.addr.0.i21.i30 = phi i32 [ %conv.i.i28, %if.then.i20.i29 ], [ %p1.addr.3.i84, %_Z3fn2iii.exit85 ]
  158. br i1 %tobool2.i.i, label %if.end7.i.i39, label %if.then3.i.i37
  159. if.then3.i.i37:
  160. %p1.addr.0.lobit.i.i34 = lshr i32 %p1.addr.0.i21.i30, 31
  161. %and6.i.i35 = and i32 %p1.addr.0.i21.i30, 1
  162. %or.i22.i36 = or i32 %p1.addr.0.lobit.i.i34, %and6.i.i35
  163. br label %if.end7.i.i39
  164. if.end7.i.i39:
  165. %p1.addr.1.i.i38 = phi i32 [ %or.i22.i36, %if.then3.i.i37 ], [ %p1.addr.0.i21.i30, %if.end.i.i33 ]
  166. br i1 %tobool.i19.i, label %if.then10.i.i42, label %if.end13.i.i46
  167. if.then10.i.i42:
  168. %cmp11.i.i40 = icmp sgt i32 %p1.addr.1.i.i38, 0
  169. %conv12.i.i41 = zext i1 %cmp11.i.i40 to i32
  170. br label %if.end13.i.i46
  171. if.end13.i.i46:
  172. %p1.addr.2.i.i43 = phi i32 [ %conv12.i.i41, %if.then10.i.i42 ], [ %p1.addr.1.i.i38, %if.end7.i.i39 ]
  173. br i1 %tobool15.i.i, label %_Z3fn2iii.exit.i52, label %if.then16.i.i49
  174. if.then16.i.i49:
  175. %and17.i.i47 = lshr i32 %p1.addr.2.i.i43, 3
  176. %and17.lobit.i.i48 = and i32 %and17.i.i47, 1
  177. br label %_Z3fn2iii.exit.i52
  178. _Z3fn2iii.exit.i52:
  179. %p1.addr.3.i.i50 = phi i32 [ %and17.lobit.i.i48, %if.then16.i.i49 ], [ %p1.addr.2.i.i43, %if.end13.i.i46 ]
  180. br i1 %tobool.i11.i, label %_ZL3fn3ii.exit58, label %if.then.i15.i56
  181. if.then.i15.i56:
  182. %and.i12.i53 = lshr i32 %p1.addr.3.i.i50, 2
  183. %and.lobit.i13.i54 = and i32 %and.i12.i53, 1
  184. %12 = xor i32 %and.lobit.i13.i54, 1
  185. %or.i14.i55 = or i32 %12, %p1.addr.3.i.i50
  186. br label %_ZL3fn3ii.exit58
  187. _ZL3fn3ii.exit58:
  188. %p1.addr.0.i16.i57 = phi i32 [ %or.i14.i55, %if.then.i15.i56 ], [ %p1.addr.3.i.i50, %_Z3fn2iii.exit.i52 ]
  189. %arrayidx7 = getelementptr inbounds i32, i32* %2, i64 %indvars.iv
  190. store i32 %p1.addr.0.i16.i57, i32* %arrayidx7, align 4 %indvars.iv.next = add i64 %indvars.iv, 1
  191. %lftr.wideiv = trunc i64 %indvars.iv.next to i32
  192. %exitcond = icmp ne i32 %lftr.wideiv, %p1
  193. br i1 %exitcond, label %for.body, label %for.cond.for.end_crit_edge
  194. for.cond.for.end_crit_edge:
  195. br label %for.end
  196. for.end:
  197. ret void
  198. }