pr20680.ll 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. ; RUN: opt < %s -indvars -S | FileCheck %s
  2. ; Provide legal integer types.
  3. target datalayout = "n8:16:32:64"
  4. @a = common global i32 0, align 4
  5. @c = common global i32 0, align 4
  6. @b = common global i32 0, align 4
  7. define void @f() {
  8. ; CHECK-LABEL: @f(
  9. ; CHECK-LABEL: entry:
  10. ; CHECK: br label %[[for_cond2_preheader:.*]]
  11. ; CHECK: [[for_cond2_preheader]]:
  12. ; CHECK-NEXT: %[[indvars_iv:.*]] = phi i32 [ %[[indvars_iv_next:.*]], %[[for_inc13:.*]] ], [ -14, %entry ]
  13. ; br i1 {{.*}}, label %[[for_inc13]], label %
  14. entry:
  15. %0 = load i32, i32* @a, align 4
  16. %tobool2 = icmp eq i32 %0, 0
  17. %1 = load i32, i32* @a, align 4
  18. %tobool = icmp eq i32 %1, 0
  19. br label %for.cond2.preheader
  20. for.cond2.preheader: ; preds = %for.inc13, %entry
  21. %storemerge15 = phi i8 [ -14, %entry ], [ %inc14, %for.inc13 ]
  22. br i1 %tobool2, label %for.inc13, label %for.body3.lr.ph
  23. for.body3.lr.ph: ; preds = %for.cond2.preheader
  24. %tobool5 = icmp eq i8 %storemerge15, 0
  25. %conv7 = sext i8 %storemerge15 to i32
  26. %2 = add nsw i32 %conv7, 1
  27. %3 = icmp ult i32 %2, 3
  28. %div = select i1 %3, i32 %conv7, i32 0
  29. br i1 %tobool5, label %for.body3.lr.ph.split.us, label %for.body3.lr.ph.for.body3.lr.ph.split_crit_edge
  30. for.body3.lr.ph.for.body3.lr.ph.split_crit_edge: ; preds = %for.body3.lr.ph
  31. br label %for.body3.lr.ph.split
  32. for.body3.lr.ph.split.us: ; preds = %for.body3.lr.ph
  33. br i1 %tobool, label %for.body3.lr.ph.split.us.split.us, label %for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge
  34. for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge: ; preds = %for.body3.lr.ph.split.us
  35. br label %for.body3.lr.ph.split.us.split
  36. for.body3.lr.ph.split.us.split.us: ; preds = %for.body3.lr.ph.split.us
  37. br label %for.body3.us.us
  38. for.body3.us.us: ; preds = %for.cond2.loopexit.us.us, %for.body3.lr.ph.split.us.split.us
  39. br i1 true, label %cond.false.us.us, label %cond.end.us.us
  40. cond.false.us.us: ; preds = %for.body3.us.us
  41. br label %cond.end.us.us
  42. cond.end.us.us: ; preds = %cond.false.us.us, %for.body3.us.us
  43. %cond.us.us = phi i32 [ %div, %cond.false.us.us ], [ %conv7, %for.body3.us.us ]
  44. %4 = load i32, i32* @b, align 4
  45. %cmp91.us.us = icmp slt i32 %4, 1
  46. br i1 %cmp91.us.us, label %for.inc.lr.ph.us.us, label %for.cond2.loopexit.us.us
  47. for.cond2.loopexit.us.us: ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us.us, %cond.end.us.us
  48. br i1 true, label %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us, label %for.body3.us.us
  49. for.inc.lr.ph.us.us: ; preds = %cond.end.us.us
  50. br label %for.inc.us.us
  51. for.cond8.for.cond2.loopexit_crit_edge.us.us: ; preds = %for.inc.us.us
  52. %inc.lcssa.us.us = phi i32 [ %inc.us.us, %for.inc.us.us ]
  53. store i32 %inc.lcssa.us.us, i32* @b, align 4
  54. br label %for.cond2.loopexit.us.us
  55. for.inc.us.us: ; preds = %for.inc.us.us, %for.inc.lr.ph.us.us
  56. %5 = phi i32 [ %4, %for.inc.lr.ph.us.us ], [ %inc.us.us, %for.inc.us.us ]
  57. %inc.us.us = add nsw i32 %5, 1
  58. %cmp9.us.us = icmp slt i32 %inc.us.us, 1
  59. br i1 %cmp9.us.us, label %for.inc.us.us, label %for.cond8.for.cond2.loopexit_crit_edge.us.us
  60. for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us: ; preds = %for.cond2.loopexit.us.us
  61. %cond.lcssa.ph.us.ph.us = phi i32 [ %cond.us.us, %for.cond2.loopexit.us.us ]
  62. br label %for.cond2.for.inc13_crit_edge.us-lcssa.us
  63. for.body3.lr.ph.split.us.split: ; preds = %for.body3.lr.ph.split.us.for.body3.lr.ph.split.us.split_crit_edge
  64. br label %for.body3.us
  65. for.body3.us: ; preds = %for.cond2.loopexit.us, %for.body3.lr.ph.split.us.split
  66. br i1 true, label %cond.false.us, label %cond.end.us
  67. cond.false.us: ; preds = %for.body3.us
  68. br label %cond.end.us
  69. cond.end.us: ; preds = %cond.false.us, %for.body3.us
  70. %cond.us = phi i32 [ %div, %cond.false.us ], [ %conv7, %for.body3.us ]
  71. %6 = load i32, i32* @b, align 4
  72. %cmp91.us = icmp slt i32 %6, 1
  73. br i1 %cmp91.us, label %for.inc.lr.ph.us, label %for.cond2.loopexit.us
  74. for.inc.us: ; preds = %for.inc.lr.ph.us, %for.inc.us
  75. %7 = phi i32 [ %6, %for.inc.lr.ph.us ], [ %inc.us, %for.inc.us ]
  76. %inc.us = add nsw i32 %7, 1
  77. %cmp9.us = icmp slt i32 %inc.us, 1
  78. br i1 %cmp9.us, label %for.inc.us, label %for.cond8.for.cond2.loopexit_crit_edge.us
  79. for.cond2.loopexit.us: ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us, %cond.end.us
  80. br i1 false, label %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa, label %for.body3.us
  81. for.inc.lr.ph.us: ; preds = %cond.end.us
  82. br label %for.inc.us
  83. for.cond8.for.cond2.loopexit_crit_edge.us: ; preds = %for.inc.us
  84. %inc.lcssa.us = phi i32 [ %inc.us, %for.inc.us ]
  85. store i32 %inc.lcssa.us, i32* @b, align 4
  86. br label %for.cond2.loopexit.us
  87. for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa: ; preds = %for.cond2.loopexit.us
  88. %cond.lcssa.ph.us.ph = phi i32 [ %cond.us, %for.cond2.loopexit.us ]
  89. br label %for.cond2.for.inc13_crit_edge.us-lcssa.us
  90. for.cond2.for.inc13_crit_edge.us-lcssa.us: ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us
  91. %cond.lcssa.ph.us = phi i32 [ %cond.lcssa.ph.us.ph, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa ], [ %cond.lcssa.ph.us.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us.us-lcssa.us ]
  92. br label %for.cond2.for.inc13_crit_edge
  93. for.body3.lr.ph.split: ; preds = %for.body3.lr.ph.for.body3.lr.ph.split_crit_edge
  94. br i1 %tobool, label %for.body3.lr.ph.split.split.us, label %for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge
  95. for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge: ; preds = %for.body3.lr.ph.split
  96. br label %for.body3.lr.ph.split.split
  97. for.body3.lr.ph.split.split.us: ; preds = %for.body3.lr.ph.split
  98. br label %for.body3.us3
  99. for.body3.us3: ; preds = %for.cond2.loopexit.us11, %for.body3.lr.ph.split.split.us
  100. br i1 false, label %cond.false.us4, label %cond.end.us5
  101. cond.false.us4: ; preds = %for.body3.us3
  102. br label %cond.end.us5
  103. cond.end.us5: ; preds = %cond.false.us4, %for.body3.us3
  104. %cond.us6 = phi i32 [ %div, %cond.false.us4 ], [ %conv7, %for.body3.us3 ]
  105. %8 = load i32, i32* @b, align 4
  106. %cmp91.us7 = icmp slt i32 %8, 1
  107. br i1 %cmp91.us7, label %for.inc.lr.ph.us12, label %for.cond2.loopexit.us11
  108. for.inc.us8: ; preds = %for.inc.lr.ph.us12, %for.inc.us8
  109. %9 = phi i32 [ %8, %for.inc.lr.ph.us12 ], [ %inc.us9, %for.inc.us8 ]
  110. %inc.us9 = add nsw i32 %9, 1
  111. %cmp9.us10 = icmp slt i32 %inc.us9, 1
  112. br i1 %cmp9.us10, label %for.inc.us8, label %for.cond8.for.cond2.loopexit_crit_edge.us13
  113. for.cond2.loopexit.us11: ; preds = %for.cond8.for.cond2.loopexit_crit_edge.us13, %cond.end.us5
  114. br i1 true, label %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us, label %for.body3.us3
  115. for.inc.lr.ph.us12: ; preds = %cond.end.us5
  116. br label %for.inc.us8
  117. for.cond8.for.cond2.loopexit_crit_edge.us13: ; preds = %for.inc.us8
  118. %inc.lcssa.us14 = phi i32 [ %inc.us9, %for.inc.us8 ]
  119. store i32 %inc.lcssa.us14, i32* @b, align 4
  120. br label %for.cond2.loopexit.us11
  121. for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us: ; preds = %for.cond2.loopexit.us11
  122. %cond.lcssa.ph.ph.us = phi i32 [ %cond.us6, %for.cond2.loopexit.us11 ]
  123. br label %for.cond2.for.inc13_crit_edge.us-lcssa
  124. for.body3.lr.ph.split.split: ; preds = %for.body3.lr.ph.split.for.body3.lr.ph.split.split_crit_edge
  125. br label %for.body3
  126. for.cond8.for.cond2.loopexit_crit_edge: ; preds = %for.inc
  127. %inc.lcssa = phi i32 [ %inc, %for.inc ]
  128. store i32 %inc.lcssa, i32* @b, align 4
  129. br label %for.cond2.loopexit
  130. for.cond2.loopexit: ; preds = %cond.end, %for.cond8.for.cond2.loopexit_crit_edge
  131. br i1 false, label %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa, label %for.body3
  132. for.body3: ; preds = %for.cond2.loopexit, %for.body3.lr.ph.split.split
  133. br i1 false, label %cond.false, label %cond.end
  134. cond.false: ; preds = %for.body3
  135. br label %cond.end
  136. cond.end: ; preds = %cond.false, %for.body3
  137. %cond = phi i32 [ %div, %cond.false ], [ %conv7, %for.body3 ]
  138. %10 = load i32, i32* @b, align 4
  139. %cmp91 = icmp slt i32 %10, 1
  140. br i1 %cmp91, label %for.inc.lr.ph, label %for.cond2.loopexit
  141. for.inc.lr.ph: ; preds = %cond.end
  142. br label %for.inc
  143. for.inc: ; preds = %for.inc, %for.inc.lr.ph
  144. %11 = phi i32 [ %10, %for.inc.lr.ph ], [ %inc, %for.inc ]
  145. %inc = add nsw i32 %11, 1
  146. %cmp9 = icmp slt i32 %inc, 1
  147. br i1 %cmp9, label %for.inc, label %for.cond8.for.cond2.loopexit_crit_edge
  148. for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa: ; preds = %for.cond2.loopexit
  149. %cond.lcssa.ph.ph = phi i32 [ %cond, %for.cond2.loopexit ]
  150. br label %for.cond2.for.inc13_crit_edge.us-lcssa
  151. for.cond2.for.inc13_crit_edge.us-lcssa: ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us
  152. %cond.lcssa.ph = phi i32 [ %cond.lcssa.ph.ph, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa ], [ %cond.lcssa.ph.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us-lcssa.us ]
  153. br label %for.cond2.for.inc13_crit_edge
  154. for.cond2.for.inc13_crit_edge: ; preds = %for.cond2.for.inc13_crit_edge.us-lcssa, %for.cond2.for.inc13_crit_edge.us-lcssa.us
  155. %cond.lcssa = phi i32 [ %cond.lcssa.ph, %for.cond2.for.inc13_crit_edge.us-lcssa ], [ %cond.lcssa.ph.us, %for.cond2.for.inc13_crit_edge.us-lcssa.us ]
  156. store i32 %cond.lcssa, i32* @c, align 4
  157. br label %for.inc13
  158. ; CHECK: [[for_inc13]]:
  159. ; CHECK-NEXT: %[[indvars_iv_next]] = add nsw i32 %[[indvars_iv]], 1
  160. ; CHECK-NEXT: %[[exitcond4:.*]] = icmp ne i32 %[[indvars_iv_next]], 0
  161. ; CHECK-NEXT: br i1 %[[exitcond4]], label %[[for_cond2_preheader]], label %[[for_end15:.*]]
  162. for.inc13: ; preds = %for.cond2.for.inc13_crit_edge, %for.cond2.preheader
  163. %inc14 = add i8 %storemerge15, 1
  164. %cmp = icmp ugt i8 %inc14, 50
  165. br i1 %cmp, label %for.cond2.preheader, label %for.end15
  166. ; CHECK: [[for_end15]]:
  167. ; CHECK-NEXT: ret void
  168. for.end15: ; preds = %for.inc13
  169. ret void
  170. }