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