2
0

basic.ll 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201
  1. ; RUN: opt < %s -correlated-propagation -S | FileCheck %s
  2. ; PR2581
  3. ; CHECK-LABEL: @test1(
  4. define i32 @test1(i1 %C) nounwind {
  5. br i1 %C, label %exit, label %body
  6. body: ; preds = %0
  7. ; CHECK-NOT: select
  8. %A = select i1 %C, i32 10, i32 11 ; <i32> [#uses=1]
  9. ; CHECK: ret i32 11
  10. ret i32 %A
  11. exit: ; preds = %0
  12. ; CHECK: ret i32 10
  13. ret i32 10
  14. }
  15. ; PR4420
  16. declare i1 @ext()
  17. ; CHECK-LABEL: @test2(
  18. define i1 @test2() {
  19. entry:
  20. %cond = tail call i1 @ext() ; <i1> [#uses=2]
  21. br i1 %cond, label %bb1, label %bb2
  22. bb1: ; preds = %entry
  23. %cond2 = tail call i1 @ext() ; <i1> [#uses=1]
  24. br i1 %cond2, label %bb3, label %bb2
  25. bb2: ; preds = %bb1, %entry
  26. ; CHECK-NOT: phi i1
  27. %cond_merge = phi i1 [ %cond, %entry ], [ false, %bb1 ] ; <i1> [#uses=1]
  28. ; CHECK: ret i1 false
  29. ret i1 %cond_merge
  30. bb3: ; preds = %bb1
  31. %res = tail call i1 @ext() ; <i1> [#uses=1]
  32. ; CHECK: ret i1 %res
  33. ret i1 %res
  34. }
  35. ; PR4855
  36. @gv = internal constant i8 7
  37. ; CHECK-LABEL: @test3(
  38. define i8 @test3(i8* %a) nounwind {
  39. entry:
  40. %cond = icmp eq i8* %a, @gv
  41. br i1 %cond, label %bb2, label %bb
  42. bb: ; preds = %entry
  43. ret i8 0
  44. bb2: ; preds = %entry
  45. ; CHECK: %should_be_const = load i8, i8* @gv
  46. %should_be_const = load i8, i8* %a
  47. ret i8 %should_be_const
  48. }
  49. ; PR1757
  50. ; CHECK-LABEL: @test4(
  51. define i32 @test4(i32) {
  52. EntryBlock:
  53. ; CHECK: icmp sgt i32 %0, 2
  54. %.demorgan = icmp sgt i32 %0, 2
  55. br i1 %.demorgan, label %GreaterThanTwo, label %LessThanOrEqualToTwo
  56. GreaterThanTwo:
  57. ; CHECK-NOT: icmp eq i32 %0, 2
  58. icmp eq i32 %0, 2
  59. ; CHECK: br i1 false
  60. br i1 %1, label %Impossible, label %NotTwoAndGreaterThanTwo
  61. NotTwoAndGreaterThanTwo:
  62. ret i32 2
  63. Impossible:
  64. ret i32 1
  65. LessThanOrEqualToTwo:
  66. ret i32 0
  67. }
  68. declare i32* @f(i32*)
  69. define void @test5(i32* %x, i32* %y) {
  70. ; CHECK-LABEL: @test5(
  71. entry:
  72. %pre = icmp eq i32* %x, null
  73. br i1 %pre, label %return, label %loop
  74. loop:
  75. %phi = phi i32* [ %sel, %loop ], [ %x, %entry ]
  76. ; CHECK: %phi = phi i32* [ %f, %loop ], [ %x, %entry ]
  77. %f = tail call i32* @f(i32* %phi)
  78. %cmp1 = icmp ne i32* %f, %y
  79. %sel = select i1 %cmp1, i32* %f, i32* null
  80. %cmp2 = icmp eq i32* %sel, null
  81. br i1 %cmp2, label %return, label %loop
  82. return:
  83. ret void
  84. }
  85. define i32 @switch1(i32 %s) {
  86. ; CHECK-LABEL: @switch1(
  87. entry:
  88. %cmp = icmp slt i32 %s, 0
  89. br i1 %cmp, label %negative, label %out
  90. negative:
  91. switch i32 %s, label %out [
  92. ; CHECK: switch i32 %s, label %out
  93. i32 0, label %out
  94. ; CHECK-NOT: i32 0
  95. i32 1, label %out
  96. ; CHECK-NOT: i32 1
  97. i32 -1, label %next
  98. ; CHECK: i32 -1, label %next
  99. i32 -2, label %next
  100. ; CHECK: i32 -2, label %next
  101. i32 2, label %out
  102. ; CHECK-NOT: i32 2
  103. i32 3, label %out
  104. ; CHECK-NOT: i32 3
  105. ]
  106. out:
  107. %p = phi i32 [ 1, %entry ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ], [ -1, %negative ]
  108. ret i32 %p
  109. next:
  110. %q = phi i32 [ 0, %negative ], [ 0, %negative ]
  111. ret i32 %q
  112. }
  113. define i32 @switch2(i32 %s) {
  114. ; CHECK-LABEL: @switch2(
  115. entry:
  116. %cmp = icmp sgt i32 %s, 0
  117. br i1 %cmp, label %positive, label %out
  118. positive:
  119. switch i32 %s, label %out [
  120. i32 0, label %out
  121. i32 -1, label %next
  122. i32 -2, label %next
  123. ]
  124. ; CHECK: br label %out
  125. out:
  126. %p = phi i32 [ -1, %entry ], [ 1, %positive ], [ 1, %positive ]
  127. ret i32 %p
  128. next:
  129. %q = phi i32 [ 0, %positive ], [ 0, %positive ]
  130. ret i32 %q
  131. }
  132. define i32 @switch3(i32 %s) {
  133. ; CHECK-LABEL: @switch3(
  134. entry:
  135. %cmp = icmp sgt i32 %s, 0
  136. br i1 %cmp, label %positive, label %out
  137. positive:
  138. switch i32 %s, label %out [
  139. i32 -1, label %out
  140. i32 -2, label %next
  141. i32 -3, label %next
  142. ]
  143. ; CHECK: br label %out
  144. out:
  145. %p = phi i32 [ -1, %entry ], [ 1, %positive ], [ 1, %positive ]
  146. ret i32 %p
  147. next:
  148. %q = phi i32 [ 0, %positive ], [ 0, %positive ]
  149. ret i32 %q
  150. }
  151. define void @switch4(i32 %s) {
  152. ; CHECK-LABEL: @switch4(
  153. entry:
  154. %cmp = icmp eq i32 %s, 0
  155. br i1 %cmp, label %zero, label %out
  156. zero:
  157. switch i32 %s, label %out [
  158. i32 0, label %next
  159. i32 1, label %out
  160. i32 -1, label %out
  161. ]
  162. ; CHECK: br label %next
  163. out:
  164. ret void
  165. next:
  166. ret void
  167. }