repeats.ll 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252
  1. ; RUN: opt < %s -reassociate -S | FileCheck %s
  2. ; Tests involving repeated operations on the same value.
  3. define i8 @nilpotent(i8 %x) {
  4. ; CHECK-LABEL: @nilpotent(
  5. %tmp = xor i8 %x, %x
  6. ret i8 %tmp
  7. ; CHECK: ret i8 0
  8. }
  9. define i2 @idempotent(i2 %x) {
  10. ; CHECK-LABEL: @idempotent(
  11. %tmp1 = and i2 %x, %x
  12. %tmp2 = and i2 %tmp1, %x
  13. %tmp3 = and i2 %tmp2, %x
  14. ret i2 %tmp3
  15. ; CHECK: ret i2 %x
  16. }
  17. define i2 @add(i2 %x) {
  18. ; CHECK-LABEL: @add(
  19. %tmp1 = add i2 %x, %x
  20. %tmp2 = add i2 %tmp1, %x
  21. %tmp3 = add i2 %tmp2, %x
  22. ret i2 %tmp3
  23. ; CHECK: ret i2 0
  24. }
  25. define i2 @cst_add() {
  26. ; CHECK-LABEL: @cst_add(
  27. %tmp1 = add i2 1, 1
  28. %tmp2 = add i2 %tmp1, 1
  29. ret i2 %tmp2
  30. ; CHECK: ret i2 -1
  31. }
  32. define i8 @cst_mul() {
  33. ; CHECK-LABEL: @cst_mul(
  34. %tmp1 = mul i8 3, 3
  35. %tmp2 = mul i8 %tmp1, 3
  36. %tmp3 = mul i8 %tmp2, 3
  37. %tmp4 = mul i8 %tmp3, 3
  38. ret i8 %tmp4
  39. ; CHECK: ret i8 -13
  40. }
  41. define i3 @foo3x5(i3 %x) {
  42. ; Can be done with two multiplies.
  43. ; CHECK-LABEL: @foo3x5(
  44. ; CHECK-NEXT: mul
  45. ; CHECK-NEXT: mul
  46. ; CHECK-NEXT: ret
  47. %tmp1 = mul i3 %x, %x
  48. %tmp2 = mul i3 %tmp1, %x
  49. %tmp3 = mul i3 %tmp2, %x
  50. %tmp4 = mul i3 %tmp3, %x
  51. ret i3 %tmp4
  52. }
  53. define i3 @foo3x6(i3 %x) {
  54. ; Can be done with two multiplies.
  55. ; CHECK-LABEL: @foo3x6(
  56. ; CHECK-NEXT: mul
  57. ; CHECK-NEXT: mul
  58. ; CHECK-NEXT: ret
  59. %tmp1 = mul i3 %x, %x
  60. %tmp2 = mul i3 %tmp1, %x
  61. %tmp3 = mul i3 %tmp2, %x
  62. %tmp4 = mul i3 %tmp3, %x
  63. %tmp5 = mul i3 %tmp4, %x
  64. ret i3 %tmp5
  65. }
  66. define i3 @foo3x7(i3 %x) {
  67. ; Can be done with two multiplies.
  68. ; CHECK-LABEL: @foo3x7(
  69. ; CHECK-NEXT: mul
  70. ; CHECK-NEXT: mul
  71. ; CHECK-NEXT: ret
  72. %tmp1 = mul i3 %x, %x
  73. %tmp2 = mul i3 %tmp1, %x
  74. %tmp3 = mul i3 %tmp2, %x
  75. %tmp4 = mul i3 %tmp3, %x
  76. %tmp5 = mul i3 %tmp4, %x
  77. %tmp6 = mul i3 %tmp5, %x
  78. ret i3 %tmp6
  79. }
  80. define i4 @foo4x8(i4 %x) {
  81. ; Can be done with two multiplies.
  82. ; CHECK-LABEL: @foo4x8(
  83. ; CHECK-NEXT: mul
  84. ; CHECK-NEXT: mul
  85. ; CHECK-NEXT: ret
  86. %tmp1 = mul i4 %x, %x
  87. %tmp2 = mul i4 %tmp1, %x
  88. %tmp3 = mul i4 %tmp2, %x
  89. %tmp4 = mul i4 %tmp3, %x
  90. %tmp5 = mul i4 %tmp4, %x
  91. %tmp6 = mul i4 %tmp5, %x
  92. %tmp7 = mul i4 %tmp6, %x
  93. ret i4 %tmp7
  94. }
  95. define i4 @foo4x9(i4 %x) {
  96. ; Can be done with three multiplies.
  97. ; CHECK-LABEL: @foo4x9(
  98. ; CHECK-NEXT: mul
  99. ; CHECK-NEXT: mul
  100. ; CHECK-NEXT: mul
  101. ; CHECK-NEXT: ret
  102. %tmp1 = mul i4 %x, %x
  103. %tmp2 = mul i4 %tmp1, %x
  104. %tmp3 = mul i4 %tmp2, %x
  105. %tmp4 = mul i4 %tmp3, %x
  106. %tmp5 = mul i4 %tmp4, %x
  107. %tmp6 = mul i4 %tmp5, %x
  108. %tmp7 = mul i4 %tmp6, %x
  109. %tmp8 = mul i4 %tmp7, %x
  110. ret i4 %tmp8
  111. }
  112. define i4 @foo4x10(i4 %x) {
  113. ; Can be done with three multiplies.
  114. ; CHECK-LABEL: @foo4x10(
  115. ; CHECK-NEXT: mul
  116. ; CHECK-NEXT: mul
  117. ; CHECK-NEXT: mul
  118. ; CHECK-NEXT: ret
  119. %tmp1 = mul i4 %x, %x
  120. %tmp2 = mul i4 %tmp1, %x
  121. %tmp3 = mul i4 %tmp2, %x
  122. %tmp4 = mul i4 %tmp3, %x
  123. %tmp5 = mul i4 %tmp4, %x
  124. %tmp6 = mul i4 %tmp5, %x
  125. %tmp7 = mul i4 %tmp6, %x
  126. %tmp8 = mul i4 %tmp7, %x
  127. %tmp9 = mul i4 %tmp8, %x
  128. ret i4 %tmp9
  129. }
  130. define i4 @foo4x11(i4 %x) {
  131. ; Can be done with four multiplies.
  132. ; CHECK-LABEL: @foo4x11(
  133. ; CHECK-NEXT: mul
  134. ; CHECK-NEXT: mul
  135. ; CHECK-NEXT: mul
  136. ; CHECK-NEXT: mul
  137. ; CHECK-NEXT: ret
  138. %tmp1 = mul i4 %x, %x
  139. %tmp2 = mul i4 %tmp1, %x
  140. %tmp3 = mul i4 %tmp2, %x
  141. %tmp4 = mul i4 %tmp3, %x
  142. %tmp5 = mul i4 %tmp4, %x
  143. %tmp6 = mul i4 %tmp5, %x
  144. %tmp7 = mul i4 %tmp6, %x
  145. %tmp8 = mul i4 %tmp7, %x
  146. %tmp9 = mul i4 %tmp8, %x
  147. %tmp10 = mul i4 %tmp9, %x
  148. ret i4 %tmp10
  149. }
  150. define i4 @foo4x12(i4 %x) {
  151. ; Can be done with two multiplies.
  152. ; CHECK-LABEL: @foo4x12(
  153. ; CHECK-NEXT: mul
  154. ; CHECK-NEXT: mul
  155. ; CHECK-NEXT: ret
  156. %tmp1 = mul i4 %x, %x
  157. %tmp2 = mul i4 %tmp1, %x
  158. %tmp3 = mul i4 %tmp2, %x
  159. %tmp4 = mul i4 %tmp3, %x
  160. %tmp5 = mul i4 %tmp4, %x
  161. %tmp6 = mul i4 %tmp5, %x
  162. %tmp7 = mul i4 %tmp6, %x
  163. %tmp8 = mul i4 %tmp7, %x
  164. %tmp9 = mul i4 %tmp8, %x
  165. %tmp10 = mul i4 %tmp9, %x
  166. %tmp11 = mul i4 %tmp10, %x
  167. ret i4 %tmp11
  168. }
  169. define i4 @foo4x13(i4 %x) {
  170. ; Can be done with three multiplies.
  171. ; CHECK-LABEL: @foo4x13(
  172. ; CHECK-NEXT: mul
  173. ; CHECK-NEXT: mul
  174. ; CHECK-NEXT: mul
  175. ; CHECK-NEXT: ret
  176. %tmp1 = mul i4 %x, %x
  177. %tmp2 = mul i4 %tmp1, %x
  178. %tmp3 = mul i4 %tmp2, %x
  179. %tmp4 = mul i4 %tmp3, %x
  180. %tmp5 = mul i4 %tmp4, %x
  181. %tmp6 = mul i4 %tmp5, %x
  182. %tmp7 = mul i4 %tmp6, %x
  183. %tmp8 = mul i4 %tmp7, %x
  184. %tmp9 = mul i4 %tmp8, %x
  185. %tmp10 = mul i4 %tmp9, %x
  186. %tmp11 = mul i4 %tmp10, %x
  187. %tmp12 = mul i4 %tmp11, %x
  188. ret i4 %tmp12
  189. }
  190. define i4 @foo4x14(i4 %x) {
  191. ; Can be done with three multiplies.
  192. ; CHECK-LABEL: @foo4x14(
  193. ; CHECK-NEXT: mul
  194. ; CHECK-NEXT: mul
  195. ; CHECK-NEXT: mul
  196. ; CHECK-NEXT: ret
  197. %tmp1 = mul i4 %x, %x
  198. %tmp2 = mul i4 %tmp1, %x
  199. %tmp3 = mul i4 %tmp2, %x
  200. %tmp4 = mul i4 %tmp3, %x
  201. %tmp5 = mul i4 %tmp4, %x
  202. %tmp6 = mul i4 %tmp5, %x
  203. %tmp7 = mul i4 %tmp6, %x
  204. %tmp8 = mul i4 %tmp7, %x
  205. %tmp9 = mul i4 %tmp8, %x
  206. %tmp10 = mul i4 %tmp9, %x
  207. %tmp11 = mul i4 %tmp10, %x
  208. %tmp12 = mul i4 %tmp11, %x
  209. %tmp13 = mul i4 %tmp12, %x
  210. ret i4 %tmp13
  211. }
  212. define i4 @foo4x15(i4 %x) {
  213. ; Can be done with four multiplies.
  214. ; CHECK-LABEL: @foo4x15(
  215. ; CHECK-NEXT: mul
  216. ; CHECK-NEXT: mul
  217. ; CHECK-NEXT: mul
  218. ; CHECK-NEXT: mul
  219. ; CHECK-NEXT: ret
  220. %tmp1 = mul i4 %x, %x
  221. %tmp2 = mul i4 %tmp1, %x
  222. %tmp3 = mul i4 %tmp2, %x
  223. %tmp4 = mul i4 %tmp3, %x
  224. %tmp5 = mul i4 %tmp4, %x
  225. %tmp6 = mul i4 %tmp5, %x
  226. %tmp7 = mul i4 %tmp6, %x
  227. %tmp8 = mul i4 %tmp7, %x
  228. %tmp9 = mul i4 %tmp8, %x
  229. %tmp10 = mul i4 %tmp9, %x
  230. %tmp11 = mul i4 %tmp10, %x
  231. %tmp12 = mul i4 %tmp11, %x
  232. %tmp13 = mul i4 %tmp12, %x
  233. %tmp14 = mul i4 %tmp13, %x
  234. ret i4 %tmp14
  235. }