xref: /aosp_15_r20/external/llvm/test/Transforms/Reassociate/basictest.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -reassociate -gvn -instcombine -S | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -passes='reassociate,gvn,instcombine' -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %arg) {
5*9880d681SAndroid Build Coastguard Worker  %tmp1 = sub i32 -12, %arg
6*9880d681SAndroid Build Coastguard Worker  %tmp2 = add i32 %tmp1, 12
7*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp2
8*9880d681SAndroid Build Coastguard Worker
9*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1
10*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i32 0, %arg
11*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %reg109, i32 %reg1111) {
15*9880d681SAndroid Build Coastguard Worker  %reg115 = add i32 %reg109, -30
16*9880d681SAndroid Build Coastguard Worker  %reg116 = add i32 %reg115, %reg1111
17*9880d681SAndroid Build Coastguard Worker  %reg117 = add i32 %reg116, 30
18*9880d681SAndroid Build Coastguard Worker  ret i32 %reg117
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2
21*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %reg117 = add i32 %reg1111, %reg109
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %reg117
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Worker@e = external global i32
26*9880d681SAndroid Build Coastguard Worker@a = external global i32
27*9880d681SAndroid Build Coastguard Worker@b = external global i32
28*9880d681SAndroid Build Coastguard Worker@c = external global i32
29*9880d681SAndroid Build Coastguard Worker@f = external global i32
30*9880d681SAndroid Build Coastguard Worker
31*9880d681SAndroid Build Coastguard Workerdefine void @test3() {
32*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* @a
33*9880d681SAndroid Build Coastguard Worker  %B = load i32, i32* @b
34*9880d681SAndroid Build Coastguard Worker  %C = load i32, i32* @c
35*9880d681SAndroid Build Coastguard Worker  %t1 = add i32 %A, %B
36*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t1, %C
37*9880d681SAndroid Build Coastguard Worker  %t3 = add i32 %C, %A
38*9880d681SAndroid Build Coastguard Worker  %t4 = add i32 %t3, %B
39*9880d681SAndroid Build Coastguard Worker  ; e = (a+b)+c;
40*9880d681SAndroid Build Coastguard Worker  store i32 %t2, i32* @e
41*9880d681SAndroid Build Coastguard Worker  ; f = (a+c)+b
42*9880d681SAndroid Build Coastguard Worker  store i32 %t4, i32* @f
43*9880d681SAndroid Build Coastguard Worker  ret void
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3
46*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
47*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
48*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add i32
49*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
50*9880d681SAndroid Build Coastguard Worker}
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdefine void @test4() {
53*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* @a
54*9880d681SAndroid Build Coastguard Worker  %B = load i32, i32* @b
55*9880d681SAndroid Build Coastguard Worker  %C = load i32, i32* @c
56*9880d681SAndroid Build Coastguard Worker  %t1 = add i32 %A, %B
57*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t1, %C
58*9880d681SAndroid Build Coastguard Worker  %t3 = add i32 %C, %A
59*9880d681SAndroid Build Coastguard Worker  %t4 = add i32 %t3, %B
60*9880d681SAndroid Build Coastguard Worker  ; e = c+(a+b)
61*9880d681SAndroid Build Coastguard Worker  store i32 %t2, i32* @e
62*9880d681SAndroid Build Coastguard Worker  ; f = (c+a)+b
63*9880d681SAndroid Build Coastguard Worker  store i32 %t4, i32* @f
64*9880d681SAndroid Build Coastguard Worker  ret void
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4
67*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
68*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
69*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add i32
70*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
71*9880d681SAndroid Build Coastguard Worker}
72*9880d681SAndroid Build Coastguard Worker
73*9880d681SAndroid Build Coastguard Workerdefine void @test5() {
74*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* @a
75*9880d681SAndroid Build Coastguard Worker  %B = load i32, i32* @b
76*9880d681SAndroid Build Coastguard Worker  %C = load i32, i32* @c
77*9880d681SAndroid Build Coastguard Worker  %t1 = add i32 %B, %A
78*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t1, %C
79*9880d681SAndroid Build Coastguard Worker  %t3 = add i32 %C, %A
80*9880d681SAndroid Build Coastguard Worker  %t4 = add i32 %t3, %B
81*9880d681SAndroid Build Coastguard Worker  ; e = c+(b+a)
82*9880d681SAndroid Build Coastguard Worker  store i32 %t2, i32* @e
83*9880d681SAndroid Build Coastguard Worker  ; f = (c+a)+b
84*9880d681SAndroid Build Coastguard Worker  store i32 %t4, i32* @f
85*9880d681SAndroid Build Coastguard Worker  ret void
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5
88*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
89*9880d681SAndroid Build Coastguard Worker; CHECK: add i32
90*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: add i32
91*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine i32 @test6() {
95*9880d681SAndroid Build Coastguard Worker  %tmp.0 = load i32, i32* @a
96*9880d681SAndroid Build Coastguard Worker  %tmp.1 = load i32, i32* @b
97*9880d681SAndroid Build Coastguard Worker  ; (a+b)
98*9880d681SAndroid Build Coastguard Worker  %tmp.2 = add i32 %tmp.0, %tmp.1
99*9880d681SAndroid Build Coastguard Worker  %tmp.4 = load i32, i32* @c
100*9880d681SAndroid Build Coastguard Worker  ; (a+b)+c
101*9880d681SAndroid Build Coastguard Worker  %tmp.5 = add i32 %tmp.2, %tmp.4
102*9880d681SAndroid Build Coastguard Worker  ; (a+c)
103*9880d681SAndroid Build Coastguard Worker  %tmp.8 = add i32 %tmp.0, %tmp.4
104*9880d681SAndroid Build Coastguard Worker  ; (a+c)+b
105*9880d681SAndroid Build Coastguard Worker  %tmp.11 = add i32 %tmp.8, %tmp.1
106*9880d681SAndroid Build Coastguard Worker  ; X ^ X = 0
107*9880d681SAndroid Build Coastguard Worker  %RV = xor i32 %tmp.5, %tmp.11
108*9880d681SAndroid Build Coastguard Worker  ret i32 %RV
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6
111*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
112*9880d681SAndroid Build Coastguard Worker}
113*9880d681SAndroid Build Coastguard Worker
114*9880d681SAndroid Build Coastguard Worker; This should be one add and two multiplies.
115*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A, i32 %B, i32 %C) {
116*9880d681SAndroid Build Coastguard Worker  ; A*A*B + A*C*A
117*9880d681SAndroid Build Coastguard Worker  %aa = mul i32 %A, %A
118*9880d681SAndroid Build Coastguard Worker  %aab = mul i32 %aa, %B
119*9880d681SAndroid Build Coastguard Worker  %ac = mul i32 %A, %C
120*9880d681SAndroid Build Coastguard Worker  %aac = mul i32 %ac, %A
121*9880d681SAndroid Build Coastguard Worker  %r = add i32 %aab, %aac
122*9880d681SAndroid Build Coastguard Worker  ret i32 %r
123*9880d681SAndroid Build Coastguard Worker
124*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7
125*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i32 %C, %B
126*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32
127*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32
128*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %X, i32 %Y, i32 %Z) {
132*9880d681SAndroid Build Coastguard Worker  %A = sub i32 0, %X
133*9880d681SAndroid Build Coastguard Worker  %B = mul i32 %A, %Y
134*9880d681SAndroid Build Coastguard Worker  ; (-X)*Y + Z -> Z-X*Y
135*9880d681SAndroid Build Coastguard Worker  %C = add i32 %B, %Z
136*9880d681SAndroid Build Coastguard Worker  ret i32 %C
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %A = mul i32 %Y, %X
140*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %C = sub i32 %Z, %A
141*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %C
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Worker; PR5458
145*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %X) {
146*9880d681SAndroid Build Coastguard Worker  %Y = mul i32 %X, 47
147*9880d681SAndroid Build Coastguard Worker  %Z = add i32 %Y, %Y
148*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %X, 94
151*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %X) {
155*9880d681SAndroid Build Coastguard Worker  %Y = add i32 %X ,%X
156*9880d681SAndroid Build Coastguard Worker  %Z = add i32 %Y, %X
157*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %X, 3
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
161*9880d681SAndroid Build Coastguard Worker}
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %W) {
164*9880d681SAndroid Build Coastguard Worker  %X = mul i32 %W, 127
165*9880d681SAndroid Build Coastguard Worker  %Y = add i32 %X ,%X
166*9880d681SAndroid Build Coastguard Worker  %Z = add i32 %Y, %X
167*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
168*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %W, 381
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Workerdeclare void @mumble(i32)
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %X) {
176*9880d681SAndroid Build Coastguard Worker  %X.neg = sub nsw nuw i32 0, %X
177*9880d681SAndroid Build Coastguard Worker  call void @mumble(i32 %X.neg)
178*9880d681SAndroid Build Coastguard Worker  %A = sub i32 1, %X
179*9880d681SAndroid Build Coastguard Worker  %B = sub i32 2, %X
180*9880d681SAndroid Build Coastguard Worker  %C = sub i32 3, %X
181*9880d681SAndroid Build Coastguard Worker  %Y = add i32 %A ,%B
182*9880d681SAndroid Build Coastguard Worker  %Z = add i32 %Y, %C
183*9880d681SAndroid Build Coastguard Worker  ret i32 %Z
184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12
185*9880d681SAndroid Build Coastguard Worker; CHECK: %[[mul:.*]] = mul i32 %X, -3
186*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i32 %[[mul]], 6
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
188*9880d681SAndroid Build Coastguard Worker}
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %X1, i32 %X2, i32 %X3) {
191*9880d681SAndroid Build Coastguard Worker  %A = sub i32 0, %X1
192*9880d681SAndroid Build Coastguard Worker  %B = mul i32 %A, %X2   ; -X1*X2
193*9880d681SAndroid Build Coastguard Worker  %C = mul i32 %X1, %X3  ; X1*X3
194*9880d681SAndroid Build Coastguard Worker  %D = add i32 %B, %C    ; -X1*X2 + X1*X3 -> X1*(X3-X2)
195*9880d681SAndroid Build Coastguard Worker  ret i32 %D
196*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i32 %X3, %X2
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 {{.*}}, %X1
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
200*9880d681SAndroid Build Coastguard Worker}
201*9880d681SAndroid Build Coastguard Worker
202*9880d681SAndroid Build Coastguard Worker; PR5359
203*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %X1, i32 %X2) {
204*9880d681SAndroid Build Coastguard Worker  %B = mul i32 %X1, 47   ; X1*47
205*9880d681SAndroid Build Coastguard Worker  %C = mul i32 %X2, -47  ; X2*-47
206*9880d681SAndroid Build Coastguard Worker  %D = add i32 %B, %C    ; X1*47 + X2*-47 -> 47*(X1-X2)
207*9880d681SAndroid Build Coastguard Worker  ret i32 %D
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14
210*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[SUB:.*]] = sub i32 %X1, %X2
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %[[SUB]], 47
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
213*9880d681SAndroid Build Coastguard Worker}
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Worker; Do not reassociate expressions of type i1
216*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %X1, i32 %X2, i32 %X3) {
217*9880d681SAndroid Build Coastguard Worker  %A = icmp ne i32 %X1, 0
218*9880d681SAndroid Build Coastguard Worker  %B = icmp slt i32 %X2, %X3
219*9880d681SAndroid Build Coastguard Worker  %C = and i1 %A, %B
220*9880d681SAndroid Build Coastguard Worker  %D = select i1 %C, i32 %X1, i32 0
221*9880d681SAndroid Build Coastguard Worker  ret i32 %D
222*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15
223*9880d681SAndroid Build Coastguard Worker; CHECK: and i1 %A, %B
224*9880d681SAndroid Build Coastguard Worker}
225