Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / Reassociate / repeats.ll
blob8600777877bb3c4e7b1bceb62fc1b125a36c2fca
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2 ; RUN: opt < %s -passes=reassociate -S | FileCheck %s
4 ; Tests involving repeated operations on the same value.
6 define i8 @nilpotent(i8 %x) {
7 ; CHECK-LABEL: define i8 @nilpotent(
8 ; CHECK-SAME: i8 [[X:%.*]]) {
9 ; CHECK-NEXT:    ret i8 0
11   %tmp = xor i8 %x, %x
12   ret i8 %tmp
15 define i2 @idempotent(i2 %x) {
16 ; CHECK-LABEL: define i2 @idempotent(
17 ; CHECK-SAME: i2 [[X:%.*]]) {
18 ; CHECK-NEXT:    ret i2 [[X]]
20   %tmp1 = and i2 %x, %x
21   %tmp2 = and i2 %tmp1, %x
22   %tmp3 = and i2 %tmp2, %x
23   ret i2 %tmp3
26 define i2 @add(i2 %x) {
27 ; CHECK-LABEL: define i2 @add(
28 ; CHECK-SAME: i2 [[X:%.*]]) {
29 ; CHECK-NEXT:    ret i2 0
31   %tmp1 = add i2 %x, %x
32   %tmp2 = add i2 %tmp1, %x
33   %tmp3 = add i2 %tmp2, %x
34   ret i2 %tmp3
37 define i2 @cst_add() {
38 ; CHECK-LABEL: define i2 @cst_add() {
39 ; CHECK-NEXT:    ret i2 -1
41   %tmp1 = add i2 1, 1
42   %tmp2 = add i2 %tmp1, 1
43   ret i2 %tmp2
46 define i8 @cst_mul() {
47 ; CHECK-LABEL: define i8 @cst_mul() {
48 ; CHECK-NEXT:    ret i8 -13
50   %tmp1 = mul i8 3, 3
51   %tmp2 = mul i8 %tmp1, 3
52   %tmp3 = mul i8 %tmp2, 3
53   %tmp4 = mul i8 %tmp3, 3
54   ret i8 %tmp4
57 define i3 @foo3x5(i3 %x) {
58 ; Can be done with two multiplies.
59 ; CHECK-LABEL: define i3 @foo3x5(
60 ; CHECK-SAME: i3 [[X:%.*]]) {
61 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i3 [[X]], [[X]]
62 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i3 [[TMP3]], [[X]]
63 ; CHECK-NEXT:    [[TMP5:%.*]] = mul i3 [[TMP4]], [[TMP3]]
64 ; CHECK-NEXT:    ret i3 [[TMP5]]
66   %tmp1 = mul i3 %x, %x
67   %tmp2 = mul i3 %tmp1, %x
68   %tmp3 = mul i3 %tmp2, %x
69   %tmp4 = mul i3 %tmp3, %x
70   ret i3 %tmp4
73 define i3 @foo3x5_nsw(i3 %x) {
74 ; Can be done with two multiplies.
75 ; CHECK-LABEL: define i3 @foo3x5_nsw(
76 ; CHECK-SAME: i3 [[X:%.*]]) {
77 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i3 [[X]], [[X]]
78 ; CHECK-NEXT:    [[TMP2:%.*]] = mul i3 [[TMP3]], [[X]]
79 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i3 [[TMP2]], [[TMP3]]
80 ; CHECK-NEXT:    ret i3 [[TMP4]]
82   %tmp1 = mul i3 %x, %x
83   %tmp2 = mul i3 %tmp1, %x
84   %tmp3 = mul i3 %tmp2, %x
85   %tmp4 = mul nsw i3 %tmp3, %x
86   ret i3 %tmp4
89 define i3 @foo3x6(i3 %x) {
90 ; Can be done with two multiplies.
91 ; CHECK-LABEL: define i3 @foo3x6(
92 ; CHECK-SAME: i3 [[X:%.*]]) {
93 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i3 [[X]], [[X]]
94 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i3 [[TMP1]], [[X]]
95 ; CHECK-NEXT:    [[TMP2:%.*]] = mul i3 [[TMP3]], [[TMP3]]
96 ; CHECK-NEXT:    ret i3 [[TMP2]]
98   %tmp1 = mul i3 %x, %x
99   %tmp2 = mul i3 %tmp1, %x
100   %tmp3 = mul i3 %tmp2, %x
101   %tmp4 = mul i3 %tmp3, %x
102   %tmp5 = mul i3 %tmp4, %x
103   ret i3 %tmp5
106 define i3 @foo3x7(i3 %x) {
107 ; Can be done with two multiplies.
108 ; CHECK-LABEL: define i3 @foo3x7(
109 ; CHECK-SAME: i3 [[X:%.*]]) {
110 ; CHECK-NEXT:    [[TMP5:%.*]] = mul i3 [[X]], [[X]]
111 ; CHECK-NEXT:    [[TMP6:%.*]] = mul i3 [[TMP5]], [[X]]
112 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i3 [[TMP6]], [[X]]
113 ; CHECK-NEXT:    [[TMP7:%.*]] = mul i3 [[TMP3]], [[TMP6]]
114 ; CHECK-NEXT:    ret i3 [[TMP7]]
116   %tmp1 = mul i3 %x, %x
117   %tmp2 = mul i3 %tmp1, %x
118   %tmp3 = mul i3 %tmp2, %x
119   %tmp4 = mul i3 %tmp3, %x
120   %tmp5 = mul i3 %tmp4, %x
121   %tmp6 = mul i3 %tmp5, %x
122   ret i3 %tmp6
125 define i4 @foo4x8(i4 %x) {
126 ; Can be done with two multiplies.
127 ; CHECK-LABEL: define i4 @foo4x8(
128 ; CHECK-SAME: i4 [[X:%.*]]) {
129 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
130 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]]
131 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i4 [[TMP4]], [[TMP4]]
132 ; CHECK-NEXT:    ret i4 [[TMP3]]
134   %tmp1 = mul i4 %x, %x
135   %tmp2 = mul i4 %tmp1, %x
136   %tmp3 = mul i4 %tmp2, %x
137   %tmp4 = mul i4 %tmp3, %x
138   %tmp5 = mul i4 %tmp4, %x
139   %tmp6 = mul i4 %tmp5, %x
140   %tmp7 = mul i4 %tmp6, %x
141   ret i4 %tmp7
144 define i4 @foo4x9(i4 %x) {
145 ; Can be done with three multiplies.
146 ; CHECK-LABEL: define i4 @foo4x9(
147 ; CHECK-SAME: i4 [[X:%.*]]) {
148 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
149 ; CHECK-NEXT:    [[TMP2:%.*]] = mul i4 [[TMP1]], [[TMP1]]
150 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i4 [[TMP2]], [[X]]
151 ; CHECK-NEXT:    [[TMP8:%.*]] = mul i4 [[TMP3]], [[TMP2]]
152 ; CHECK-NEXT:    ret i4 [[TMP8]]
154   %tmp1 = mul i4 %x, %x
155   %tmp2 = mul i4 %tmp1, %x
156   %tmp3 = mul i4 %tmp2, %x
157   %tmp4 = mul i4 %tmp3, %x
158   %tmp5 = mul i4 %tmp4, %x
159   %tmp6 = mul i4 %tmp5, %x
160   %tmp7 = mul i4 %tmp6, %x
161   %tmp8 = mul i4 %tmp7, %x
162   ret i4 %tmp8
165 define i4 @foo4x10(i4 %x) {
166 ; Can be done with three multiplies.
167 ; CHECK-LABEL: define i4 @foo4x10(
168 ; CHECK-SAME: i4 [[X:%.*]]) {
169 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
170 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]]
171 ; CHECK-NEXT:    [[TMP2:%.*]] = mul i4 [[TMP4]], [[X]]
172 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i4 [[TMP2]], [[TMP2]]
173 ; CHECK-NEXT:    ret i4 [[TMP3]]
175   %tmp1 = mul i4 %x, %x
176   %tmp2 = mul i4 %tmp1, %x
177   %tmp3 = mul i4 %tmp2, %x
178   %tmp4 = mul i4 %tmp3, %x
179   %tmp5 = mul i4 %tmp4, %x
180   %tmp6 = mul i4 %tmp5, %x
181   %tmp7 = mul i4 %tmp6, %x
182   %tmp8 = mul i4 %tmp7, %x
183   %tmp9 = mul i4 %tmp8, %x
184   ret i4 %tmp9
187 define i4 @foo4x11(i4 %x) {
188 ; Can be done with four multiplies.
189 ; CHECK-LABEL: define i4 @foo4x11(
190 ; CHECK-SAME: i4 [[X:%.*]]) {
191 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
192 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i4 [[TMP1]], [[TMP1]]
193 ; CHECK-NEXT:    [[TMP2:%.*]] = mul i4 [[TMP4]], [[X]]
194 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i4 [[TMP2]], [[X]]
195 ; CHECK-NEXT:    [[TMP10:%.*]] = mul i4 [[TMP3]], [[TMP2]]
196 ; CHECK-NEXT:    ret i4 [[TMP10]]
198   %tmp1 = mul i4 %x, %x
199   %tmp2 = mul i4 %tmp1, %x
200   %tmp3 = mul i4 %tmp2, %x
201   %tmp4 = mul i4 %tmp3, %x
202   %tmp5 = mul i4 %tmp4, %x
203   %tmp6 = mul i4 %tmp5, %x
204   %tmp7 = mul i4 %tmp6, %x
205   %tmp8 = mul i4 %tmp7, %x
206   %tmp9 = mul i4 %tmp8, %x
207   %tmp10 = mul i4 %tmp9, %x
208   ret i4 %tmp10
211 define i4 @foo4x12(i4 %x) {
212 ; Can be done with two multiplies.
213 ; CHECK-LABEL: define i4 @foo4x12(
214 ; CHECK-SAME: i4 [[X:%.*]]) {
215 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
216 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i4 [[TMP1]], [[X]]
217 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i4 [[TMP4]], [[TMP4]]
218 ; CHECK-NEXT:    [[TMP2:%.*]] = mul i4 [[TMP3]], [[TMP3]]
219 ; CHECK-NEXT:    ret i4 [[TMP2]]
221   %tmp1 = mul i4 %x, %x
222   %tmp2 = mul i4 %tmp1, %x
223   %tmp3 = mul i4 %tmp2, %x
224   %tmp4 = mul i4 %tmp3, %x
225   %tmp5 = mul i4 %tmp4, %x
226   %tmp6 = mul i4 %tmp5, %x
227   %tmp7 = mul i4 %tmp6, %x
228   %tmp8 = mul i4 %tmp7, %x
229   %tmp9 = mul i4 %tmp8, %x
230   %tmp10 = mul i4 %tmp9, %x
231   %tmp11 = mul i4 %tmp10, %x
232   ret i4 %tmp11
235 define i4 @foo4x13(i4 %x) {
236 ; Can be done with three multiplies.
237 ; CHECK-LABEL: define i4 @foo4x13(
238 ; CHECK-SAME: i4 [[X:%.*]]) {
239 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
240 ; CHECK-NEXT:    [[TMP2:%.*]] = mul i4 [[TMP1]], [[X]]
241 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i4 [[TMP2]], [[TMP2]]
242 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i4 [[TMP3]], [[X]]
243 ; CHECK-NEXT:    [[TMP12:%.*]] = mul i4 [[TMP4]], [[TMP3]]
244 ; CHECK-NEXT:    ret i4 [[TMP12]]
246   %tmp1 = mul i4 %x, %x
247   %tmp2 = mul i4 %tmp1, %x
248   %tmp3 = mul i4 %tmp2, %x
249   %tmp4 = mul i4 %tmp3, %x
250   %tmp5 = mul i4 %tmp4, %x
251   %tmp6 = mul i4 %tmp5, %x
252   %tmp7 = mul i4 %tmp6, %x
253   %tmp8 = mul i4 %tmp7, %x
254   %tmp9 = mul i4 %tmp8, %x
255   %tmp10 = mul i4 %tmp9, %x
256   %tmp11 = mul i4 %tmp10, %x
257   %tmp12 = mul i4 %tmp11, %x
258   ret i4 %tmp12
261 define i4 @foo4x14(i4 %x) {
262 ; Can be done with three multiplies.
263 ; CHECK-LABEL: define i4 @foo4x14(
264 ; CHECK-SAME: i4 [[X:%.*]]) {
265 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
266 ; CHECK-NEXT:    [[TMP6:%.*]] = mul i4 [[TMP1]], [[X]]
267 ; CHECK-NEXT:    [[TMP7:%.*]] = mul i4 [[TMP6]], [[TMP6]]
268 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i4 [[TMP7]], [[X]]
269 ; CHECK-NEXT:    [[TMP5:%.*]] = mul i4 [[TMP4]], [[TMP4]]
270 ; CHECK-NEXT:    ret i4 [[TMP5]]
272   %tmp1 = mul i4 %x, %x
273   %tmp2 = mul i4 %tmp1, %x
274   %tmp3 = mul i4 %tmp2, %x
275   %tmp4 = mul i4 %tmp3, %x
276   %tmp5 = mul i4 %tmp4, %x
277   %tmp6 = mul i4 %tmp5, %x
278   %tmp7 = mul i4 %tmp6, %x
279   %tmp8 = mul i4 %tmp7, %x
280   %tmp9 = mul i4 %tmp8, %x
281   %tmp10 = mul i4 %tmp9, %x
282   %tmp11 = mul i4 %tmp10, %x
283   %tmp12 = mul i4 %tmp11, %x
284   %tmp13 = mul i4 %tmp12, %x
285   ret i4 %tmp13
288 define i4 @foo4x15(i4 %x) {
289 ; Can be done with four multiplies.
290 ; CHECK-LABEL: define i4 @foo4x15(
291 ; CHECK-SAME: i4 [[X:%.*]]) {
292 ; CHECK-NEXT:    [[TMP1:%.*]] = mul i4 [[X]], [[X]]
293 ; CHECK-NEXT:    [[TMP6:%.*]] = mul i4 [[TMP1]], [[X]]
294 ; CHECK-NEXT:    [[TMP3:%.*]] = mul i4 [[TMP6]], [[TMP6]]
295 ; CHECK-NEXT:    [[TMP4:%.*]] = mul i4 [[TMP3]], [[X]]
296 ; CHECK-NEXT:    [[TMP5:%.*]] = mul i4 [[TMP4]], [[X]]
297 ; CHECK-NEXT:    [[TMP14:%.*]] = mul i4 [[TMP5]], [[TMP4]]
298 ; CHECK-NEXT:    ret i4 [[TMP14]]
300   %tmp1 = mul i4 %x, %x
301   %tmp2 = mul i4 %tmp1, %x
302   %tmp3 = mul i4 %tmp2, %x
303   %tmp4 = mul i4 %tmp3, %x
304   %tmp5 = mul i4 %tmp4, %x
305   %tmp6 = mul i4 %tmp5, %x
306   %tmp7 = mul i4 %tmp6, %x
307   %tmp8 = mul i4 %tmp7, %x
308   %tmp9 = mul i4 %tmp8, %x
309   %tmp10 = mul i4 %tmp9, %x
310   %tmp11 = mul i4 %tmp10, %x
311   %tmp12 = mul i4 %tmp11, %x
312   %tmp13 = mul i4 %tmp12, %x
313   %tmp14 = mul i4 %tmp13, %x
314   ret i4 %tmp14