reassociate.ll 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. ; RUN: opt < %s -instsimplify -S | FileCheck %s
  2. define i32 @add1(i32 %x) {
  3. ; CHECK-LABEL: @add1(
  4. ; (X + -1) + 1 -> X
  5. %l = add i32 %x, -1
  6. %r = add i32 %l, 1
  7. ret i32 %r
  8. ; CHECK: ret i32 %x
  9. }
  10. define i32 @and1(i32 %x, i32 %y) {
  11. ; CHECK-LABEL: @and1(
  12. ; (X & Y) & X -> X & Y
  13. %l = and i32 %x, %y
  14. %r = and i32 %l, %x
  15. ret i32 %r
  16. ; CHECK: ret i32 %l
  17. }
  18. define i32 @and2(i32 %x, i32 %y) {
  19. ; CHECK-LABEL: @and2(
  20. ; X & (X & Y) -> X & Y
  21. %r = and i32 %x, %y
  22. %l = and i32 %x, %r
  23. ret i32 %l
  24. ; CHECK: ret i32 %r
  25. }
  26. define i32 @or1(i32 %x, i32 %y) {
  27. ; CHECK-LABEL: @or1(
  28. ; (X | Y) | X -> X | Y
  29. %l = or i32 %x, %y
  30. %r = or i32 %l, %x
  31. ret i32 %r
  32. ; CHECK: ret i32 %l
  33. }
  34. define i32 @or2(i32 %x, i32 %y) {
  35. ; CHECK-LABEL: @or2(
  36. ; X | (X | Y) -> X | Y
  37. %r = or i32 %x, %y
  38. %l = or i32 %x, %r
  39. ret i32 %l
  40. ; CHECK: ret i32 %r
  41. }
  42. define i32 @xor1(i32 %x, i32 %y) {
  43. ; CHECK-LABEL: @xor1(
  44. ; (X ^ Y) ^ X = Y
  45. %l = xor i32 %x, %y
  46. %r = xor i32 %l, %x
  47. ret i32 %r
  48. ; CHECK: ret i32 %y
  49. }
  50. define i32 @xor2(i32 %x, i32 %y) {
  51. ; CHECK-LABEL: @xor2(
  52. ; X ^ (X ^ Y) = Y
  53. %r = xor i32 %x, %y
  54. %l = xor i32 %x, %r
  55. ret i32 %l
  56. ; CHECK: ret i32 %y
  57. }
  58. define i32 @sub1(i32 %x, i32 %y) {
  59. ; CHECK-LABEL: @sub1(
  60. %d = sub i32 %x, %y
  61. %r = sub i32 %x, %d
  62. ret i32 %r
  63. ; CHECK: ret i32 %y
  64. }
  65. define i32 @sub2(i32 %x) {
  66. ; CHECK-LABEL: @sub2(
  67. ; X - (X + 1) -> -1
  68. %xp1 = add i32 %x, 1
  69. %r = sub i32 %x, %xp1
  70. ret i32 %r
  71. ; CHECK: ret i32 -1
  72. }
  73. define i32 @sub3(i32 %x, i32 %y) {
  74. ; CHECK-LABEL: @sub3(
  75. ; ((X + 1) + Y) - (Y + 1) -> X
  76. %xp1 = add i32 %x, 1
  77. %lhs = add i32 %xp1, %y
  78. %rhs = add i32 %y, 1
  79. %r = sub i32 %lhs, %rhs
  80. ret i32 %r
  81. ; CHECK: ret i32 %x
  82. }
  83. define i32 @sdiv1(i32 %x, i32 %y) {
  84. ; CHECK-LABEL: @sdiv1(
  85. ; (no overflow X * Y) / Y -> X
  86. %mul = mul nsw i32 %x, %y
  87. %r = sdiv i32 %mul, %y
  88. ret i32 %r
  89. ; CHECK: ret i32 %x
  90. }
  91. define i32 @sdiv2(i32 %x, i32 %y) {
  92. ; CHECK-LABEL: @sdiv2(
  93. ; (((X / Y) * Y) / Y) -> X / Y
  94. %div = sdiv i32 %x, %y
  95. %mul = mul i32 %div, %y
  96. %r = sdiv i32 %mul, %y
  97. ret i32 %r
  98. ; CHECK: ret i32 %div
  99. }
  100. define i32 @sdiv3(i32 %x, i32 %y) {
  101. ; CHECK-LABEL: @sdiv3(
  102. ; (X rem Y) / Y -> 0
  103. %rem = srem i32 %x, %y
  104. %div = sdiv i32 %rem, %y
  105. ret i32 %div
  106. ; CHECK: ret i32 0
  107. }
  108. define i32 @sdiv4(i32 %x, i32 %y) {
  109. ; CHECK-LABEL: @sdiv4(
  110. ; (X / Y) * Y -> X if the division is exact
  111. %div = sdiv exact i32 %x, %y
  112. %mul = mul i32 %div, %y
  113. ret i32 %mul
  114. ; CHECK: ret i32 %x
  115. }
  116. define i32 @sdiv5(i32 %x, i32 %y) {
  117. ; CHECK-LABEL: @sdiv5(
  118. ; Y * (X / Y) -> X if the division is exact
  119. %div = sdiv exact i32 %x, %y
  120. %mul = mul i32 %y, %div
  121. ret i32 %mul
  122. ; CHECK: ret i32 %x
  123. }
  124. define i32 @udiv1(i32 %x, i32 %y) {
  125. ; CHECK-LABEL: @udiv1(
  126. ; (no overflow X * Y) / Y -> X
  127. %mul = mul nuw i32 %x, %y
  128. %r = udiv i32 %mul, %y
  129. ret i32 %r
  130. ; CHECK: ret i32 %x
  131. }
  132. define i32 @udiv2(i32 %x, i32 %y) {
  133. ; CHECK-LABEL: @udiv2(
  134. ; (((X / Y) * Y) / Y) -> X / Y
  135. %div = udiv i32 %x, %y
  136. %mul = mul i32 %div, %y
  137. %r = udiv i32 %mul, %y
  138. ret i32 %r
  139. ; CHECK: ret i32 %div
  140. }
  141. define i32 @udiv3(i32 %x, i32 %y) {
  142. ; CHECK-LABEL: @udiv3(
  143. ; (X rem Y) / Y -> 0
  144. %rem = urem i32 %x, %y
  145. %div = udiv i32 %rem, %y
  146. ret i32 %div
  147. ; CHECK: ret i32 0
  148. }
  149. define i32 @udiv4(i32 %x, i32 %y) {
  150. ; CHECK-LABEL: @udiv4(
  151. ; (X / Y) * Y -> X if the division is exact
  152. %div = udiv exact i32 %x, %y
  153. %mul = mul i32 %div, %y
  154. ret i32 %mul
  155. ; CHECK: ret i32 %x
  156. }
  157. define i32 @udiv5(i32 %x, i32 %y) {
  158. ; CHECK-LABEL: @udiv5(
  159. ; Y * (X / Y) -> X if the division is exact
  160. %div = udiv exact i32 %x, %y
  161. %mul = mul i32 %y, %div
  162. ret i32 %mul
  163. ; CHECK: ret i32 %x
  164. }
  165. define i16 @trunc1(i32 %x) {
  166. ; CHECK-LABEL: @trunc1(
  167. %y = add i32 %x, 1
  168. %tx = trunc i32 %x to i16
  169. %ty = trunc i32 %y to i16
  170. %d = sub i16 %ty, %tx
  171. ret i16 %d
  172. ; CHECK: ret i16 1
  173. }