eliminate-comparison.ll 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211
  1. ; RUN: opt -indvars -S < %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"
  3. @X = external global [0 x double]
  4. ; Indvars should be able to simplify simple comparisons involving
  5. ; induction variables.
  6. ; CHECK-LABEL: @foo(
  7. ; CHECK: %cond = and i1 %tobool.not, true
  8. define void @foo(i64 %n, i32* nocapture %p) nounwind {
  9. entry:
  10. %cmp9 = icmp sgt i64 %n, 0
  11. br i1 %cmp9, label %pre, label %return
  12. pre:
  13. %t3 = load i32, i32* %p
  14. %tobool.not = icmp ne i32 %t3, 0
  15. br label %loop
  16. loop:
  17. %i = phi i64 [ 0, %pre ], [ %inc, %for.inc ]
  18. %cmp6 = icmp slt i64 %i, %n
  19. %cond = and i1 %tobool.not, %cmp6
  20. br i1 %cond, label %if.then, label %for.inc
  21. if.then:
  22. %arrayidx = getelementptr [0 x double], [0 x double]* @X, i64 0, i64 %i
  23. store double 3.200000e+00, double* %arrayidx
  24. br label %for.inc
  25. for.inc:
  26. %inc = add nsw i64 %i, 1
  27. %exitcond = icmp sge i64 %inc, %n
  28. br i1 %exitcond, label %return, label %loop
  29. return:
  30. ret void
  31. }
  32. ; Don't eliminate an icmp that's contributing to the loop exit test though.
  33. ; CHECK-LABEL: @_ZNK4llvm5APInt3ultERKS0_(
  34. ; CHECK: %tmp99 = icmp sgt i32 %i, -1
  35. define i32 @_ZNK4llvm5APInt3ultERKS0_(i32 %tmp2.i1, i64** %tmp65, i64** %tmp73, i64** %tmp82, i64** %tmp90) {
  36. entry:
  37. br label %bb18
  38. bb13:
  39. %tmp66 = load i64*, i64** %tmp65, align 4
  40. %tmp68 = getelementptr inbounds i64, i64* %tmp66, i32 %i
  41. %tmp69 = load i64, i64* %tmp68, align 4
  42. %tmp74 = load i64*, i64** %tmp73, align 4
  43. %tmp76 = getelementptr inbounds i64, i64* %tmp74, i32 %i
  44. %tmp77 = load i64, i64* %tmp76, align 4
  45. %tmp78 = icmp ugt i64 %tmp69, %tmp77
  46. br i1 %tmp78, label %bb20.loopexit, label %bb15
  47. bb15:
  48. %tmp83 = load i64*, i64** %tmp82, align 4
  49. %tmp85 = getelementptr inbounds i64, i64* %tmp83, i32 %i
  50. %tmp86 = load i64, i64* %tmp85, align 4
  51. %tmp91 = load i64*, i64** %tmp90, align 4
  52. %tmp93 = getelementptr inbounds i64, i64* %tmp91, i32 %i
  53. %tmp94 = load i64, i64* %tmp93, align 4
  54. %tmp95 = icmp ult i64 %tmp86, %tmp94
  55. br i1 %tmp95, label %bb20.loopexit, label %bb17
  56. bb17:
  57. %tmp97 = add nsw i32 %i, -1
  58. br label %bb18
  59. bb18:
  60. %i = phi i32 [ %tmp2.i1, %entry ], [ %tmp97, %bb17 ]
  61. %tmp99 = icmp sgt i32 %i, -1
  62. br i1 %tmp99, label %bb13, label %bb20.loopexit
  63. bb20.loopexit:
  64. %tmp.0.ph = phi i32 [ 0, %bb18 ], [ 1, %bb15 ], [ 0, %bb13 ]
  65. ret i32 %tmp.0.ph
  66. }
  67. ; Indvars should eliminate the icmp here.
  68. ; CHECK-LABEL: @func_10(
  69. ; CHECK-NOT: icmp
  70. ; CHECK: ret void
  71. define void @func_10() nounwind {
  72. entry:
  73. br label %loop
  74. loop:
  75. %i = phi i32 [ %i.next, %loop ], [ 0, %entry ]
  76. %t0 = icmp slt i32 %i, 0
  77. %t1 = zext i1 %t0 to i32
  78. %t2 = add i32 %t1, %i
  79. %u3 = zext i32 %t2 to i64
  80. store i64 %u3, i64* null
  81. %i.next = add i32 %i, 1
  82. br i1 undef, label %loop, label %return
  83. return:
  84. ret void
  85. }
  86. ; PR14432
  87. ; Indvars should not turn the second loop into an infinite one.
  88. ; CHECK-LABEL: @func_11(
  89. ; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10
  90. ; CHECK-NOT: br i1 true, label %noassert68, label %unrolledend
  91. define i32 @func_11() nounwind uwtable {
  92. entry:
  93. br label %forcond
  94. forcond: ; preds = %noassert, %entry
  95. %__key6.0 = phi i32 [ 2, %entry ], [ %tmp37, %noassert ]
  96. %tmp5 = icmp slt i32 %__key6.0, 10
  97. br i1 %tmp5, label %noassert, label %forcond38.preheader
  98. forcond38.preheader: ; preds = %forcond
  99. br label %forcond38
  100. noassert: ; preds = %forbody
  101. %tmp13 = sdiv i32 -32768, %__key6.0
  102. %tmp2936 = shl i32 %tmp13, 24
  103. %sext23 = shl i32 %tmp13, 24
  104. %tmp32 = icmp eq i32 %tmp2936, %sext23
  105. %tmp37 = add i32 %__key6.0, 1
  106. br i1 %tmp32, label %forcond, label %assert33
  107. assert33: ; preds = %noassert
  108. tail call void @llvm.trap()
  109. unreachable
  110. forcond38: ; preds = %noassert68, %forcond38.preheader
  111. %__key8.0 = phi i32 [ %tmp81, %noassert68 ], [ 2, %forcond38.preheader ]
  112. %tmp46 = icmp slt i32 %__key8.0, 10
  113. br i1 %tmp46, label %noassert68, label %unrolledend
  114. noassert68: ; preds = %forbody39
  115. %tmp57 = sdiv i32 -32768, %__key8.0
  116. %sext34 = shl i32 %tmp57, 16
  117. %sext21 = shl i32 %tmp57, 16
  118. %tmp76 = icmp eq i32 %sext34, %sext21
  119. %tmp81 = add i32 %__key8.0, 1
  120. br i1 %tmp76, label %forcond38, label %assert77
  121. assert77: ; preds = %noassert68
  122. tail call void @llvm.trap()
  123. unreachable
  124. unrolledend: ; preds = %forcond38
  125. ret i32 0
  126. }
  127. declare void @llvm.trap() noreturn nounwind
  128. ; In this case the second loop only has a single iteration, fold the header away
  129. ; CHECK-LABEL: @func_12(
  130. ; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10
  131. ; CHECK: br i1 true, label %noassert68, label %unrolledend
  132. define i32 @func_12() nounwind uwtable {
  133. entry:
  134. br label %forcond
  135. forcond: ; preds = %noassert, %entry
  136. %__key6.0 = phi i32 [ 2, %entry ], [ %tmp37, %noassert ]
  137. %tmp5 = icmp slt i32 %__key6.0, 10
  138. br i1 %tmp5, label %noassert, label %forcond38.preheader
  139. forcond38.preheader: ; preds = %forcond
  140. br label %forcond38
  141. noassert: ; preds = %forbody
  142. %tmp13 = sdiv i32 -32768, %__key6.0
  143. %tmp2936 = shl i32 %tmp13, 24
  144. %sext23 = shl i32 %tmp13, 24
  145. %tmp32 = icmp eq i32 %tmp2936, %sext23
  146. %tmp37 = add i32 %__key6.0, 1
  147. br i1 %tmp32, label %forcond, label %assert33
  148. assert33: ; preds = %noassert
  149. tail call void @llvm.trap()
  150. unreachable
  151. forcond38: ; preds = %noassert68, %forcond38.preheader
  152. %__key8.0 = phi i32 [ %tmp81, %noassert68 ], [ 2, %forcond38.preheader ]
  153. %tmp46 = icmp slt i32 %__key8.0, 10
  154. br i1 %tmp46, label %noassert68, label %unrolledend
  155. noassert68: ; preds = %forbody39
  156. %tmp57 = sdiv i32 -32768, %__key8.0
  157. %sext34 = shl i32 %tmp57, 16
  158. %sext21 = shl i32 %tmp57, 16
  159. %tmp76 = icmp ne i32 %sext34, %sext21
  160. %tmp81 = add i32 %__key8.0, 1
  161. br i1 %tmp76, label %forcond38, label %assert77
  162. assert77: ; preds = %noassert68
  163. tail call void @llvm.trap()
  164. unreachable
  165. unrolledend: ; preds = %forcond38
  166. ret i32 0
  167. }