xref: /aosp_15_r20/external/llvm/test/Transforms/InstSimplify/reassociate.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; NOTE: Assertions have been autogenerated by update_test_checks.py
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instsimplify -S | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Workerdefine i32 @add1(i32 %x) {
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @add1(
6*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
7*9880d681SAndroid Build Coastguard Worker;
8*9880d681SAndroid Build Coastguard Worker; (X + -1) + 1 -> X
9*9880d681SAndroid Build Coastguard Worker  %l = add i32 %x, -1
10*9880d681SAndroid Build Coastguard Worker  %r = add i32 %l, 1
11*9880d681SAndroid Build Coastguard Worker  ret i32 %r
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine i32 @and1(i32 %x, i32 %y) {
15*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @and1(
16*9880d681SAndroid Build Coastguard Worker; CHECK:         [[L:%.*]] = and i32 %x, %y
17*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[L]]
18*9880d681SAndroid Build Coastguard Worker;
19*9880d681SAndroid Build Coastguard Worker; (X & Y) & X -> X & Y
20*9880d681SAndroid Build Coastguard Worker  %l = and i32 %x, %y
21*9880d681SAndroid Build Coastguard Worker  %r = and i32 %l, %x
22*9880d681SAndroid Build Coastguard Worker  ret i32 %r
23*9880d681SAndroid Build Coastguard Worker}
24*9880d681SAndroid Build Coastguard Worker
25*9880d681SAndroid Build Coastguard Workerdefine i32 @and2(i32 %x, i32 %y) {
26*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @and2(
27*9880d681SAndroid Build Coastguard Worker; CHECK:         [[R:%.*]] = and i32 %x, %y
28*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[R]]
29*9880d681SAndroid Build Coastguard Worker;
30*9880d681SAndroid Build Coastguard Worker; X & (X & Y) -> X & Y
31*9880d681SAndroid Build Coastguard Worker  %r = and i32 %x, %y
32*9880d681SAndroid Build Coastguard Worker  %l = and i32 %x, %r
33*9880d681SAndroid Build Coastguard Worker  ret i32 %l
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Workerdefine i32 @or1(i32 %x, i32 %y) {
37*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @or1(
38*9880d681SAndroid Build Coastguard Worker; CHECK:         [[L:%.*]] = or i32 %x, %y
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[L]]
40*9880d681SAndroid Build Coastguard Worker;
41*9880d681SAndroid Build Coastguard Worker; (X | Y) | X -> X | Y
42*9880d681SAndroid Build Coastguard Worker  %l = or i32 %x, %y
43*9880d681SAndroid Build Coastguard Worker  %r = or i32 %l, %x
44*9880d681SAndroid Build Coastguard Worker  ret i32 %r
45*9880d681SAndroid Build Coastguard Worker}
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine i32 @or2(i32 %x, i32 %y) {
48*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @or2(
49*9880d681SAndroid Build Coastguard Worker; CHECK:         [[R:%.*]] = or i32 %x, %y
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[R]]
51*9880d681SAndroid Build Coastguard Worker;
52*9880d681SAndroid Build Coastguard Worker; X | (X | Y) -> X | Y
53*9880d681SAndroid Build Coastguard Worker  %r = or i32 %x, %y
54*9880d681SAndroid Build Coastguard Worker  %l = or i32 %x, %r
55*9880d681SAndroid Build Coastguard Worker  ret i32 %l
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Workerdefine i32 @xor1(i32 %x, i32 %y) {
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xor1(
60*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %y
61*9880d681SAndroid Build Coastguard Worker;
62*9880d681SAndroid Build Coastguard Worker; (X ^ Y) ^ X = Y
63*9880d681SAndroid Build Coastguard Worker  %l = xor i32 %x, %y
64*9880d681SAndroid Build Coastguard Worker  %r = xor i32 %l, %x
65*9880d681SAndroid Build Coastguard Worker  ret i32 %r
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Workerdefine i32 @xor2(i32 %x, i32 %y) {
69*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @xor2(
70*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %y
71*9880d681SAndroid Build Coastguard Worker;
72*9880d681SAndroid Build Coastguard Worker; X ^ (X ^ Y) = Y
73*9880d681SAndroid Build Coastguard Worker  %r = xor i32 %x, %y
74*9880d681SAndroid Build Coastguard Worker  %l = xor i32 %x, %r
75*9880d681SAndroid Build Coastguard Worker  ret i32 %l
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine i32 @sub1(i32 %x, i32 %y) {
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub1(
80*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %y
81*9880d681SAndroid Build Coastguard Worker;
82*9880d681SAndroid Build Coastguard Worker  %d = sub i32 %x, %y
83*9880d681SAndroid Build Coastguard Worker  %r = sub i32 %x, %d
84*9880d681SAndroid Build Coastguard Worker  ret i32 %r
85*9880d681SAndroid Build Coastguard Worker}
86*9880d681SAndroid Build Coastguard Worker
87*9880d681SAndroid Build Coastguard Workerdefine i32 @sub2(i32 %x) {
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub2(
89*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 -1
90*9880d681SAndroid Build Coastguard Worker;
91*9880d681SAndroid Build Coastguard Worker; X - (X + 1) -> -1
92*9880d681SAndroid Build Coastguard Worker  %xp1 = add i32 %x, 1
93*9880d681SAndroid Build Coastguard Worker  %r = sub i32 %x, %xp1
94*9880d681SAndroid Build Coastguard Worker  ret i32 %r
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine i32 @sub3(i32 %x, i32 %y) {
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sub3(
99*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
100*9880d681SAndroid Build Coastguard Worker;
101*9880d681SAndroid Build Coastguard Worker; ((X + 1) + Y) - (Y + 1) -> X
102*9880d681SAndroid Build Coastguard Worker  %xp1 = add i32 %x, 1
103*9880d681SAndroid Build Coastguard Worker  %lhs = add i32 %xp1, %y
104*9880d681SAndroid Build Coastguard Worker  %rhs = add i32 %y, 1
105*9880d681SAndroid Build Coastguard Worker  %r = sub i32 %lhs, %rhs
106*9880d681SAndroid Build Coastguard Worker  ret i32 %r
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv1(i32 %x, i32 %y) {
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv1(
111*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
112*9880d681SAndroid Build Coastguard Worker;
113*9880d681SAndroid Build Coastguard Worker; (no overflow X * Y) / Y -> X
114*9880d681SAndroid Build Coastguard Worker  %mul = mul nsw i32 %x, %y
115*9880d681SAndroid Build Coastguard Worker  %r = sdiv i32 %mul, %y
116*9880d681SAndroid Build Coastguard Worker  ret i32 %r
117*9880d681SAndroid Build Coastguard Worker}
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv2(i32 %x, i32 %y) {
120*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv2(
121*9880d681SAndroid Build Coastguard Worker; CHECK:         [[DIV:%.*]] = sdiv i32 %x, %y
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DIV]]
123*9880d681SAndroid Build Coastguard Worker;
124*9880d681SAndroid Build Coastguard Worker; (((X / Y) * Y) / Y) -> X / Y
125*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %x, %y
126*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %div, %y
127*9880d681SAndroid Build Coastguard Worker  %r = sdiv i32 %mul, %y
128*9880d681SAndroid Build Coastguard Worker  ret i32 %r
129*9880d681SAndroid Build Coastguard Worker}
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv3(i32 %x, i32 %y) {
132*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv3(
133*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 0
134*9880d681SAndroid Build Coastguard Worker;
135*9880d681SAndroid Build Coastguard Worker; (X rem Y) / Y -> 0
136*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %x, %y
137*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %rem, %y
138*9880d681SAndroid Build Coastguard Worker  ret i32 %div
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv4(i32 %x, i32 %y) {
142*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv4(
143*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
144*9880d681SAndroid Build Coastguard Worker;
145*9880d681SAndroid Build Coastguard Worker; (X / Y) * Y -> X if the division is exact
146*9880d681SAndroid Build Coastguard Worker  %div = sdiv exact i32 %x, %y
147*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %div, %y
148*9880d681SAndroid Build Coastguard Worker  ret i32 %mul
149*9880d681SAndroid Build Coastguard Worker}
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdefine i32 @sdiv5(i32 %x, i32 %y) {
152*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @sdiv5(
153*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
154*9880d681SAndroid Build Coastguard Worker;
155*9880d681SAndroid Build Coastguard Worker; Y * (X / Y) -> X if the division is exact
156*9880d681SAndroid Build Coastguard Worker  %div = sdiv exact i32 %x, %y
157*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %y, %div
158*9880d681SAndroid Build Coastguard Worker  ret i32 %mul
159*9880d681SAndroid Build Coastguard Worker}
160*9880d681SAndroid Build Coastguard Worker
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv1(i32 %x, i32 %y) {
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv1(
164*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
165*9880d681SAndroid Build Coastguard Worker;
166*9880d681SAndroid Build Coastguard Worker; (no overflow X * Y) / Y -> X
167*9880d681SAndroid Build Coastguard Worker  %mul = mul nuw i32 %x, %y
168*9880d681SAndroid Build Coastguard Worker  %r = udiv i32 %mul, %y
169*9880d681SAndroid Build Coastguard Worker  ret i32 %r
170*9880d681SAndroid Build Coastguard Worker}
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv2(i32 %x, i32 %y) {
173*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv2(
174*9880d681SAndroid Build Coastguard Worker; CHECK:         [[DIV:%.*]] = udiv i32 %x, %y
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret i32 [[DIV]]
176*9880d681SAndroid Build Coastguard Worker;
177*9880d681SAndroid Build Coastguard Worker; (((X / Y) * Y) / Y) -> X / Y
178*9880d681SAndroid Build Coastguard Worker  %div = udiv i32 %x, %y
179*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %div, %y
180*9880d681SAndroid Build Coastguard Worker  %r = udiv i32 %mul, %y
181*9880d681SAndroid Build Coastguard Worker  ret i32 %r
182*9880d681SAndroid Build Coastguard Worker}
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv3(i32 %x, i32 %y) {
185*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv3(
186*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 0
187*9880d681SAndroid Build Coastguard Worker;
188*9880d681SAndroid Build Coastguard Worker; (X rem Y) / Y -> 0
189*9880d681SAndroid Build Coastguard Worker  %rem = urem i32 %x, %y
190*9880d681SAndroid Build Coastguard Worker  %div = udiv i32 %rem, %y
191*9880d681SAndroid Build Coastguard Worker  ret i32 %div
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv4(i32 %x, i32 %y) {
195*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv4(
196*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
197*9880d681SAndroid Build Coastguard Worker;
198*9880d681SAndroid Build Coastguard Worker; (X / Y) * Y -> X if the division is exact
199*9880d681SAndroid Build Coastguard Worker  %div = udiv exact i32 %x, %y
200*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %div, %y
201*9880d681SAndroid Build Coastguard Worker  ret i32 %mul
202*9880d681SAndroid Build Coastguard Worker}
203*9880d681SAndroid Build Coastguard Worker
204*9880d681SAndroid Build Coastguard Workerdefine i32 @udiv5(i32 %x, i32 %y) {
205*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @udiv5(
206*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i32 %x
207*9880d681SAndroid Build Coastguard Worker;
208*9880d681SAndroid Build Coastguard Worker; Y * (X / Y) -> X if the division is exact
209*9880d681SAndroid Build Coastguard Worker  %div = udiv exact i32 %x, %y
210*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %y, %div
211*9880d681SAndroid Build Coastguard Worker  ret i32 %mul
212*9880d681SAndroid Build Coastguard Worker}
213*9880d681SAndroid Build Coastguard Worker
214*9880d681SAndroid Build Coastguard Workerdefine i16 @trunc1(i32 %x) {
215*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @trunc1(
216*9880d681SAndroid Build Coastguard Worker; CHECK:         ret i16 1
217*9880d681SAndroid Build Coastguard Worker;
218*9880d681SAndroid Build Coastguard Worker  %y = add i32 %x, 1
219*9880d681SAndroid Build Coastguard Worker  %tx = trunc i32 %x to i16
220*9880d681SAndroid Build Coastguard Worker  %ty = trunc i32 %y to i16
221*9880d681SAndroid Build Coastguard Worker  %d = sub i16 %ty, %tx
222*9880d681SAndroid Build Coastguard Worker  ret i16 %d
223*9880d681SAndroid Build Coastguard Worker}
224