AndOrXor.ll 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205
  1. ; RUN: opt < %s -instsimplify -S | FileCheck %s
  2. define i64 @pow2(i32 %x) {
  3. ; CHECK-LABEL: @pow2(
  4. %negx = sub i32 0, %x
  5. %x2 = and i32 %x, %negx
  6. %e = zext i32 %x2 to i64
  7. %nege = sub i64 0, %e
  8. %e2 = and i64 %e, %nege
  9. ret i64 %e2
  10. ; CHECK: ret i64 %e
  11. }
  12. define i64 @pow2b(i32 %x) {
  13. ; CHECK-LABEL: @pow2b(
  14. %sh = shl i32 2, %x
  15. %e = zext i32 %sh to i64
  16. %nege = sub i64 0, %e
  17. %e2 = and i64 %e, %nege
  18. ret i64 %e2
  19. ; CHECK: ret i64 %e
  20. }
  21. define i32 @sub_neg_nuw(i32 %x, i32 %y) {
  22. ; CHECK-LABEL: @sub_neg_nuw(
  23. %neg = sub nuw i32 0, %y
  24. %sub = sub i32 %x, %neg
  25. ret i32 %sub
  26. ; CHECK: ret i32 %x
  27. }
  28. define i1 @and_of_icmps0(i32 %b) {
  29. ; CHECK-LABEL: @and_of_icmps0(
  30. %1 = add i32 %b, 2
  31. %2 = icmp ult i32 %1, 4
  32. %cmp3 = icmp sgt i32 %b, 2
  33. %cmp = and i1 %2, %cmp3
  34. ret i1 %cmp
  35. ; CHECK: ret i1 false
  36. }
  37. define i1 @and_of_icmps1(i32 %b) {
  38. ; CHECK-LABEL: @and_of_icmps1(
  39. %1 = add nsw i32 %b, 2
  40. %2 = icmp slt i32 %1, 4
  41. %cmp3 = icmp sgt i32 %b, 2
  42. %cmp = and i1 %2, %cmp3
  43. ret i1 %cmp
  44. ; CHECK: ret i1 false
  45. }
  46. define i1 @and_of_icmps2(i32 %b) {
  47. ; CHECK-LABEL: @and_of_icmps2(
  48. %1 = add i32 %b, 2
  49. %2 = icmp ule i32 %1, 3
  50. %cmp3 = icmp sgt i32 %b, 2
  51. %cmp = and i1 %2, %cmp3
  52. ret i1 %cmp
  53. ; CHECK: ret i1 false
  54. }
  55. define i1 @and_of_icmps3(i32 %b) {
  56. ; CHECK-LABEL: @and_of_icmps3(
  57. %1 = add nsw i32 %b, 2
  58. %2 = icmp sle i32 %1, 3
  59. %cmp3 = icmp sgt i32 %b, 2
  60. %cmp = and i1 %2, %cmp3
  61. ret i1 %cmp
  62. ; CHECK: ret i1 false
  63. }
  64. define i1 @and_of_icmps4(i32 %b) {
  65. ; CHECK-LABEL: @and_of_icmps4(
  66. %1 = add nuw i32 %b, 2
  67. %2 = icmp ult i32 %1, 4
  68. %cmp3 = icmp ugt i32 %b, 2
  69. %cmp = and i1 %2, %cmp3
  70. ret i1 %cmp
  71. ; CHECK: ret i1 false
  72. }
  73. define i1 @and_of_icmps5(i32 %b) {
  74. ; CHECK-LABEL: @and_of_icmps5(
  75. %1 = add nuw i32 %b, 2
  76. %2 = icmp ule i32 %1, 3
  77. %cmp3 = icmp ugt i32 %b, 2
  78. %cmp = and i1 %2, %cmp3
  79. ret i1 %cmp
  80. ; CHECK: ret i1 false
  81. }
  82. define i1 @or_of_icmps0(i32 %b) {
  83. ; CHECK-LABEL: @or_of_icmps0(
  84. %1 = add i32 %b, 2
  85. %2 = icmp uge i32 %1, 4
  86. %cmp3 = icmp sle i32 %b, 2
  87. %cmp = or i1 %2, %cmp3
  88. ret i1 %cmp
  89. ; CHECK: ret i1 true
  90. }
  91. define i1 @or_of_icmps1(i32 %b) {
  92. ; CHECK-LABEL: @or_of_icmps1(
  93. %1 = add nsw i32 %b, 2
  94. %2 = icmp sge i32 %1, 4
  95. %cmp3 = icmp sle i32 %b, 2
  96. %cmp = or i1 %2, %cmp3
  97. ret i1 %cmp
  98. ; CHECK: ret i1 true
  99. }
  100. define i1 @or_of_icmps2(i32 %b) {
  101. ; CHECK-LABEL: @or_of_icmps2(
  102. %1 = add i32 %b, 2
  103. %2 = icmp ugt i32 %1, 3
  104. %cmp3 = icmp sle i32 %b, 2
  105. %cmp = or i1 %2, %cmp3
  106. ret i1 %cmp
  107. ; CHECK: ret i1 true
  108. }
  109. define i1 @or_of_icmps3(i32 %b) {
  110. ; CHECK-LABEL: @or_of_icmps3(
  111. %1 = add nsw i32 %b, 2
  112. %2 = icmp sgt i32 %1, 3
  113. %cmp3 = icmp sle i32 %b, 2
  114. %cmp = or i1 %2, %cmp3
  115. ret i1 %cmp
  116. ; CHECK: ret i1 true
  117. }
  118. define i1 @or_of_icmps4(i32 %b) {
  119. ; CHECK-LABEL: @or_of_icmps4(
  120. %1 = add nuw i32 %b, 2
  121. %2 = icmp uge i32 %1, 4
  122. %cmp3 = icmp ule i32 %b, 2
  123. %cmp = or i1 %2, %cmp3
  124. ret i1 %cmp
  125. ; CHECK: ret i1 true
  126. }
  127. define i1 @or_of_icmps5(i32 %b) {
  128. ; CHECK-LABEL: @or_of_icmps5(
  129. %1 = add nuw i32 %b, 2
  130. %2 = icmp ugt i32 %1, 3
  131. %cmp3 = icmp ule i32 %b, 2
  132. %cmp = or i1 %2, %cmp3
  133. ret i1 %cmp
  134. ; CHECK: ret i1 true
  135. }
  136. define i32 @neg_nuw(i32 %x) {
  137. ; CHECK-LABEL: @neg_nuw(
  138. %neg = sub nuw i32 0, %x
  139. ret i32 %neg
  140. ; CHECK: ret i32 0
  141. }
  142. define i1 @and_icmp1(i32 %x, i32 %y) {
  143. %1 = icmp ult i32 %x, %y
  144. %2 = icmp ne i32 %y, 0
  145. %3 = and i1 %1, %2
  146. ret i1 %3
  147. }
  148. ; CHECK-LABEL: @and_icmp1(
  149. ; CHECK: %[[cmp:.*]] = icmp ult i32 %x, %y
  150. ; CHECK: ret i1 %[[cmp]]
  151. define i1 @and_icmp2(i32 %x, i32 %y) {
  152. %1 = icmp ult i32 %x, %y
  153. %2 = icmp eq i32 %y, 0
  154. %3 = and i1 %1, %2
  155. ret i1 %3
  156. }
  157. ; CHECK-LABEL: @and_icmp2(
  158. ; CHECK: ret i1 false
  159. define i1 @or_icmp1(i32 %x, i32 %y) {
  160. %1 = icmp ult i32 %x, %y
  161. %2 = icmp ne i32 %y, 0
  162. %3 = or i1 %1, %2
  163. ret i1 %3
  164. }
  165. ; CHECK-LABEL: @or_icmp1(
  166. ; CHECK: %[[cmp:.*]] = icmp ne i32 %y, 0
  167. ; CHECK: ret i1 %[[cmp]]
  168. define i1 @or_icmp2(i32 %x, i32 %y) {
  169. %1 = icmp uge i32 %x, %y
  170. %2 = icmp ne i32 %y, 0
  171. %3 = or i1 %1, %2
  172. ret i1 %3
  173. }
  174. ; CHECK-LABEL: @or_icmp2(
  175. ; CHECK: ret i1 true
  176. define i1 @or_icmp3(i32 %x, i32 %y) {
  177. %1 = icmp uge i32 %x, %y
  178. %2 = icmp eq i32 %y, 0
  179. %3 = or i1 %1, %2
  180. ret i1 %3
  181. }
  182. ; CHECK-LABEL: @or_icmp3(
  183. ; CHECK: %[[cmp:.*]] = icmp uge i32 %x, %y
  184. ; CHECK: ret i1 %[[cmp]]