xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/sub.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128"
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Worker; Optimize subtracts.
4*9880d681SAndroid Build Coastguard Worker;
5*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) {
8*9880d681SAndroid Build Coastguard Worker	%B = sub i32 %A, %A
9*9880d681SAndroid Build Coastguard Worker	ret i32 %B
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
11*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A) {
15*9880d681SAndroid Build Coastguard Worker	%B = sub i32 %A, 0
16*9880d681SAndroid Build Coastguard Worker	ret i32 %B
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
18*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %A
19*9880d681SAndroid Build Coastguard Worker}
20*9880d681SAndroid Build Coastguard Worker
21*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %A) {
22*9880d681SAndroid Build Coastguard Worker	%B = sub i32 0, %A
23*9880d681SAndroid Build Coastguard Worker	%C = sub i32 0, %B
24*9880d681SAndroid Build Coastguard Worker	ret i32 %C
25*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
26*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %A
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %A, i32 %x) {
30*9880d681SAndroid Build Coastguard Worker	%B = sub i32 0, %A
31*9880d681SAndroid Build Coastguard Worker	%C = sub i32 %x, %B
32*9880d681SAndroid Build Coastguard Worker	ret i32 %C
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
34*9880d681SAndroid Build Coastguard Worker; CHECK: %C = add i32 %x, %A
35*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C
36*9880d681SAndroid Build Coastguard Worker}
37*9880d681SAndroid Build Coastguard Worker
38*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %A, i32 %B, i32 %C) {
39*9880d681SAndroid Build Coastguard Worker	%D = sub i32 %B, %C
40*9880d681SAndroid Build Coastguard Worker	%E = sub i32 %A, %D
41*9880d681SAndroid Build Coastguard Worker	ret i32 %E
42*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
43*9880d681SAndroid Build Coastguard Worker; CHECK: %D1 = sub i32 %C, %B
44*9880d681SAndroid Build Coastguard Worker; CHECK: %E = add
45*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %E
46*9880d681SAndroid Build Coastguard Worker}
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A, i32 %B) {
49*9880d681SAndroid Build Coastguard Worker	%C = and i32 %A, %B
50*9880d681SAndroid Build Coastguard Worker	%D = sub i32 %A, %C
51*9880d681SAndroid Build Coastguard Worker	ret i32 %D
52*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
53*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: xor i32 %B, -1
54*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %D = and i32
55*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %D
56*9880d681SAndroid Build Coastguard Worker}
57*9880d681SAndroid Build Coastguard Worker
58*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A) {
59*9880d681SAndroid Build Coastguard Worker	%B = sub i32 -1, %A
60*9880d681SAndroid Build Coastguard Worker	ret i32 %B
61*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
62*9880d681SAndroid Build Coastguard Worker; CHECK: %B = xor i32 %A, -1
63*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %B
64*9880d681SAndroid Build Coastguard Worker}
65*9880d681SAndroid Build Coastguard Worker
66*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %A) {
67*9880d681SAndroid Build Coastguard Worker	%B = mul i32 9, %A
68*9880d681SAndroid Build Coastguard Worker	%C = sub i32 %B, %A
69*9880d681SAndroid Build Coastguard Worker	ret i32 %C
70*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
71*9880d681SAndroid Build Coastguard Worker; CHECK: %C = shl i32 %A, 3
72*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C
73*9880d681SAndroid Build Coastguard Worker}
74*9880d681SAndroid Build Coastguard Worker
75*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %A) {
76*9880d681SAndroid Build Coastguard Worker	%B = mul i32 3, %A
77*9880d681SAndroid Build Coastguard Worker	%C = sub i32 %A, %B
78*9880d681SAndroid Build Coastguard Worker	ret i32 %C
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
80*9880d681SAndroid Build Coastguard Worker; CHECK: %C = mul i32 %A, -2
81*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C
82*9880d681SAndroid Build Coastguard Worker}
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i32 %A, i32 %B) {
85*9880d681SAndroid Build Coastguard Worker	%C = sub i32 0, %A
86*9880d681SAndroid Build Coastguard Worker	%D = sub i32 0, %B
87*9880d681SAndroid Build Coastguard Worker	%E = mul i32 %C, %D
88*9880d681SAndroid Build Coastguard Worker	ret i32 %E
89*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
90*9880d681SAndroid Build Coastguard Worker; CHECK: %E = mul i32 %A, %B
91*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %E
92*9880d681SAndroid Build Coastguard Worker}
93*9880d681SAndroid Build Coastguard Worker
94*9880d681SAndroid Build Coastguard Workerdefine i32 @test10a(i32 %A) {
95*9880d681SAndroid Build Coastguard Worker	%C = sub i32 0, %A
96*9880d681SAndroid Build Coastguard Worker	%E = mul i32 %C, 7
97*9880d681SAndroid Build Coastguard Worker	ret i32 %E
98*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10a(
99*9880d681SAndroid Build Coastguard Worker; CHECK: %E = mul i32 %A, -7
100*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %E
101*9880d681SAndroid Build Coastguard Worker}
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerdefine i1 @test11(i8 %A, i8 %B) {
104*9880d681SAndroid Build Coastguard Worker	%C = sub i8 %A, %B
105*9880d681SAndroid Build Coastguard Worker	%cD = icmp ne i8 %C, 0
106*9880d681SAndroid Build Coastguard Worker	ret i1 %cD
107*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
108*9880d681SAndroid Build Coastguard Worker; CHECK: %cD = icmp ne i8 %A, %B
109*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %cD
110*9880d681SAndroid Build Coastguard Worker}
111*9880d681SAndroid Build Coastguard Worker
112*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %A) {
113*9880d681SAndroid Build Coastguard Worker	%B = ashr i32 %A, 31
114*9880d681SAndroid Build Coastguard Worker	%C = sub i32 0, %B
115*9880d681SAndroid Build Coastguard Worker	ret i32 %C
116*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
117*9880d681SAndroid Build Coastguard Worker; CHECK: %C = lshr i32 %A, 31
118*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C
119*9880d681SAndroid Build Coastguard Worker}
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %A) {
122*9880d681SAndroid Build Coastguard Worker	%B = lshr i32 %A, 31
123*9880d681SAndroid Build Coastguard Worker	%C = sub i32 0, %B
124*9880d681SAndroid Build Coastguard Worker	ret i32 %C
125*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
126*9880d681SAndroid Build Coastguard Worker; CHECK: %C = ashr i32 %A, 31
127*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C
128*9880d681SAndroid Build Coastguard Worker}
129*9880d681SAndroid Build Coastguard Worker
130*9880d681SAndroid Build Coastguard Workerdefine i32 @test14(i32 %A) {
131*9880d681SAndroid Build Coastguard Worker	%B = lshr i32 %A, 31
132*9880d681SAndroid Build Coastguard Worker	%C = bitcast i32 %B to i32
133*9880d681SAndroid Build Coastguard Worker	%D = sub i32 0, %C
134*9880d681SAndroid Build Coastguard Worker	ret i32 %D
135*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
136*9880d681SAndroid Build Coastguard Worker; CHECK: %D = ashr i32 %A, 31
137*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %D
138*9880d681SAndroid Build Coastguard Worker}
139*9880d681SAndroid Build Coastguard Worker
140*9880d681SAndroid Build Coastguard Workerdefine i32 @test15(i32 %A, i32 %B) {
141*9880d681SAndroid Build Coastguard Worker	%C = sub i32 0, %A
142*9880d681SAndroid Build Coastguard Worker	%D = srem i32 %B, %C
143*9880d681SAndroid Build Coastguard Worker	ret i32 %D
144*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15(
145*9880d681SAndroid Build Coastguard Worker; CHECK:      %[[sub:.*]] = sub i32 0, %A
146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[rem:.*]] = srem i32 %B, %[[sub]]
147*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %[[rem]]
148*9880d681SAndroid Build Coastguard Worker}
149*9880d681SAndroid Build Coastguard Worker
150*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i32 %A) {
151*9880d681SAndroid Build Coastguard Worker	%X = sdiv i32 %A, 1123
152*9880d681SAndroid Build Coastguard Worker	%Y = sub i32 0, %X
153*9880d681SAndroid Build Coastguard Worker	ret i32 %Y
154*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16(
155*9880d681SAndroid Build Coastguard Worker; CHECK: %Y = sdiv i32 %A, -1123
156*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %Y
157*9880d681SAndroid Build Coastguard Worker}
158*9880d681SAndroid Build Coastguard Worker
159*9880d681SAndroid Build Coastguard Worker; Can't fold subtract here because negation it might oveflow.
160*9880d681SAndroid Build Coastguard Worker; PR3142
161*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(i32 %A) {
162*9880d681SAndroid Build Coastguard Worker	%B = sub i32 0, %A
163*9880d681SAndroid Build Coastguard Worker	%C = sdiv i32 %B, 1234
164*9880d681SAndroid Build Coastguard Worker	ret i32 %C
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17(
166*9880d681SAndroid Build Coastguard Worker; CHECK: %B = sub i32 0, %A
167*9880d681SAndroid Build Coastguard Worker; CHECK: %C = sdiv i32 %B, 1234
168*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine i64 @test18(i64 %Y) {
172*9880d681SAndroid Build Coastguard Worker	%tmp.4 = shl i64 %Y, 2
173*9880d681SAndroid Build Coastguard Worker	%tmp.12 = shl i64 %Y, 2
174*9880d681SAndroid Build Coastguard Worker	%tmp.8 = sub i64 %tmp.4, %tmp.12
175*9880d681SAndroid Build Coastguard Worker	ret i64 %tmp.8
176*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test18(
177*9880d681SAndroid Build Coastguard Worker; CHECK: ret i64 0
178*9880d681SAndroid Build Coastguard Worker}
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(i32 %X, i32 %Y) {
181*9880d681SAndroid Build Coastguard Worker	%Z = sub i32 %X, %Y
182*9880d681SAndroid Build Coastguard Worker	%Q = add i32 %Z, %Y
183*9880d681SAndroid Build Coastguard Worker	ret i32 %Q
184*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test19(
185*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %X
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerdefine i1 @test20(i32 %g, i32 %h) {
189*9880d681SAndroid Build Coastguard Worker	%tmp.2 = sub i32 %g, %h
190*9880d681SAndroid Build Coastguard Worker	%tmp.4 = icmp ne i32 %tmp.2, %g
191*9880d681SAndroid Build Coastguard Worker	ret i1 %tmp.4
192*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20(
193*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp.4 = icmp ne i32 %h, 0
194*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %tmp.4
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workerdefine i1 @test21(i32 %g, i32 %h) {
198*9880d681SAndroid Build Coastguard Worker	%tmp.2 = sub i32 %g, %h
199*9880d681SAndroid Build Coastguard Worker	%tmp.4 = icmp ne i32 %tmp.2, %g
200*9880d681SAndroid Build Coastguard Worker        ret i1 %tmp.4
201*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21(
202*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp.4 = icmp ne i32 %h, 0
203*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %tmp.4
204*9880d681SAndroid Build Coastguard Worker}
205*9880d681SAndroid Build Coastguard Worker
206*9880d681SAndroid Build Coastguard Worker; PR2298
207*9880d681SAndroid Build Coastguard Workerdefine zeroext i1 @test22(i32 %a, i32 %b)  nounwind  {
208*9880d681SAndroid Build Coastguard Worker	%tmp2 = sub i32 0, %a
209*9880d681SAndroid Build Coastguard Worker	%tmp4 = sub i32 0, %b
210*9880d681SAndroid Build Coastguard Worker	%tmp5 = icmp eq i32 %tmp2, %tmp4
211*9880d681SAndroid Build Coastguard Worker	ret i1 %tmp5
212*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test22(
213*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp5 = icmp eq i32 %b, %a
214*9880d681SAndroid Build Coastguard Worker; CHECK: ret i1 %tmp5
215*9880d681SAndroid Build Coastguard Worker}
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; rdar://7362831
218*9880d681SAndroid Build Coastguard Workerdefine i32 @test23(i8* %P, i64 %A){
219*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds i8, i8* %P, i64 %A
220*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i8* %B to i64
221*9880d681SAndroid Build Coastguard Worker  %D = trunc i64 %C to i32
222*9880d681SAndroid Build Coastguard Worker  %E = ptrtoint i8* %P to i64
223*9880d681SAndroid Build Coastguard Worker  %F = trunc i64 %E to i32
224*9880d681SAndroid Build Coastguard Worker  %G = sub i32 %D, %F
225*9880d681SAndroid Build Coastguard Worker  ret i32 %G
226*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test23(
227*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: = trunc i64 %A to i32
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
229*9880d681SAndroid Build Coastguard Worker}
230*9880d681SAndroid Build Coastguard Worker
231*9880d681SAndroid Build Coastguard Workerdefine i8 @test23_as1(i8 addrspace(1)* %P, i16 %A) {
232*9880d681SAndroid Build Coastguard Worker; CHECK: @test23_as1
233*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: = trunc i16 %A to i8
234*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i8
235*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds i8, i8 addrspace(1)* %P, i16 %A
236*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i8 addrspace(1)* %B to i16
237*9880d681SAndroid Build Coastguard Worker  %D = trunc i16 %C to i8
238*9880d681SAndroid Build Coastguard Worker  %E = ptrtoint i8 addrspace(1)* %P to i16
239*9880d681SAndroid Build Coastguard Worker  %F = trunc i16 %E to i8
240*9880d681SAndroid Build Coastguard Worker  %G = sub i8 %D, %F
241*9880d681SAndroid Build Coastguard Worker  ret i8 %G
242*9880d681SAndroid Build Coastguard Worker}
243*9880d681SAndroid Build Coastguard Worker
244*9880d681SAndroid Build Coastguard Workerdefine i64 @test24(i8* %P, i64 %A){
245*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds i8, i8* %P, i64 %A
246*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i8* %B to i64
247*9880d681SAndroid Build Coastguard Worker  %E = ptrtoint i8* %P to i64
248*9880d681SAndroid Build Coastguard Worker  %G = sub i64 %C, %E
249*9880d681SAndroid Build Coastguard Worker  ret i64 %G
250*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24(
251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 %A
252*9880d681SAndroid Build Coastguard Worker}
253*9880d681SAndroid Build Coastguard Worker
254*9880d681SAndroid Build Coastguard Workerdefine i16 @test24_as1(i8 addrspace(1)* %P, i16 %A) {
255*9880d681SAndroid Build Coastguard Worker; CHECK: @test24_as1
256*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16 %A
257*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds i8, i8 addrspace(1)* %P, i16 %A
258*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i8 addrspace(1)* %B to i16
259*9880d681SAndroid Build Coastguard Worker  %E = ptrtoint i8 addrspace(1)* %P to i16
260*9880d681SAndroid Build Coastguard Worker  %G = sub i16 %C, %E
261*9880d681SAndroid Build Coastguard Worker  ret i16 %G
262*9880d681SAndroid Build Coastguard Worker}
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard Workerdefine i64 @test24a(i8* %P, i64 %A){
265*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds i8, i8* %P, i64 %A
266*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i8* %B to i64
267*9880d681SAndroid Build Coastguard Worker  %E = ptrtoint i8* %P to i64
268*9880d681SAndroid Build Coastguard Worker  %G = sub i64 %E, %C
269*9880d681SAndroid Build Coastguard Worker  ret i64 %G
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24a(
271*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i64 0, %A
272*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64
273*9880d681SAndroid Build Coastguard Worker}
274*9880d681SAndroid Build Coastguard Worker
275*9880d681SAndroid Build Coastguard Workerdefine i16 @test24a_as1(i8 addrspace(1)* %P, i16 %A) {
276*9880d681SAndroid Build Coastguard Worker; CHECK: @test24a_as1
277*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i16 0, %A
278*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16
279*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds i8, i8 addrspace(1)* %P, i16 %A
280*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i8 addrspace(1)* %B to i16
281*9880d681SAndroid Build Coastguard Worker  %E = ptrtoint i8 addrspace(1)* %P to i16
282*9880d681SAndroid Build Coastguard Worker  %G = sub i16 %E, %C
283*9880d681SAndroid Build Coastguard Worker  ret i16 %G
284*9880d681SAndroid Build Coastguard Worker}
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker
287*9880d681SAndroid Build Coastguard Worker@Arr = external global [42 x i16]
288*9880d681SAndroid Build Coastguard Worker
289*9880d681SAndroid Build Coastguard Workerdefine i64 @test24b(i8* %P, i64 %A){
290*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds [42 x i16], [42 x i16]* @Arr, i64 0, i64 %A
291*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i16* %B to i64
292*9880d681SAndroid Build Coastguard Worker  %G = sub i64 %C, ptrtoint ([42 x i16]* @Arr to i64)
293*9880d681SAndroid Build Coastguard Worker  ret i64 %G
294*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test24b(
295*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl nuw i64 %A, 1
296*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64
297*9880d681SAndroid Build Coastguard Worker}
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker
300*9880d681SAndroid Build Coastguard Workerdefine i64 @test25(i8* %P, i64 %A){
301*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds [42 x i16], [42 x i16]* @Arr, i64 0, i64 %A
302*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i16* %B to i64
303*9880d681SAndroid Build Coastguard Worker  %G = sub i64 %C, ptrtoint (i16* getelementptr ([42 x i16], [42 x i16]* @Arr, i64 1, i64 0) to i64)
304*9880d681SAndroid Build Coastguard Worker  ret i64 %G
305*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test25(
306*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl nuw i64 %A, 1
307*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i64 {{.*}}, -84
308*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64
309*9880d681SAndroid Build Coastguard Worker}
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker@Arr_as1 = external addrspace(1) global [42 x i16]
312*9880d681SAndroid Build Coastguard Worker
313*9880d681SAndroid Build Coastguard Workerdefine i16 @test25_as1(i8 addrspace(1)* %P, i64 %A) {
314*9880d681SAndroid Build Coastguard Worker; CHECK: @test25_as1
315*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %1 = trunc i64 %A to i16
316*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl nuw i16 %1, 1
317*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i16 {{.*}}, -84
318*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16
319*9880d681SAndroid Build Coastguard Worker  %B = getelementptr inbounds [42 x i16], [42 x i16] addrspace(1)* @Arr_as1, i64 0, i64 %A
320*9880d681SAndroid Build Coastguard Worker  %C = ptrtoint i16 addrspace(1)* %B to i16
321*9880d681SAndroid Build Coastguard Worker  %G = sub i16 %C, ptrtoint (i16 addrspace(1)* getelementptr ([42 x i16], [42 x i16] addrspace(1)* @Arr_as1, i64 1, i64 0) to i16)
322*9880d681SAndroid Build Coastguard Worker  ret i16 %G
323*9880d681SAndroid Build Coastguard Worker}
324*9880d681SAndroid Build Coastguard Worker
325*9880d681SAndroid Build Coastguard Workerdefine i32 @test26(i32 %x) {
326*9880d681SAndroid Build Coastguard Worker  %shl = shl i32 3, %x
327*9880d681SAndroid Build Coastguard Worker  %neg = sub i32 0, %shl
328*9880d681SAndroid Build Coastguard Worker  ret i32 %neg
329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test26(
330*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl i32 -3
331*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Workerdefine i32 @test27(i32 %x, i32 %y) {
335*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %y, -8
336*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %x, %mul
337*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
338*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test27(
339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl i32 %y, 3
340*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i32
341*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
342*9880d681SAndroid Build Coastguard Worker}
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerdefine i32 @test28(i32 %x, i32 %y, i32 %z) {
345*9880d681SAndroid Build Coastguard Worker  %neg = sub i32 0, %z
346*9880d681SAndroid Build Coastguard Worker  %mul = mul i32 %neg, %y
347*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %x, %mul
348*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test28(
350*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: mul i32 %z, %y
351*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: add i32
352*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32
353*9880d681SAndroid Build Coastguard Worker}
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Workerdefine i64 @test29(i8* %foo, i64 %i, i64 %j) {
356*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i8, i8* %foo, i64 %i
357*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
358*9880d681SAndroid Build Coastguard Worker  %cast1 = ptrtoint i8* %gep1 to i64
359*9880d681SAndroid Build Coastguard Worker  %cast2 = ptrtoint i8* %gep2 to i64
360*9880d681SAndroid Build Coastguard Worker  %sub = sub i64 %cast1, %cast2
361*9880d681SAndroid Build Coastguard Worker  ret i64 %sub
362*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test29(
363*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i64 %i, %j
364*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64
365*9880d681SAndroid Build Coastguard Worker}
366*9880d681SAndroid Build Coastguard Worker
367*9880d681SAndroid Build Coastguard Workerdefine i64 @test30(i8* %foo, i64 %i, i64 %j) {
368*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8* %foo to i32*
369*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32* %bit, i64 %i
370*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8* %foo, i64 %j
371*9880d681SAndroid Build Coastguard Worker  %cast1 = ptrtoint i32* %gep1 to i64
372*9880d681SAndroid Build Coastguard Worker  %cast2 = ptrtoint i8* %gep2 to i64
373*9880d681SAndroid Build Coastguard Worker  %sub = sub i64 %cast1, %cast2
374*9880d681SAndroid Build Coastguard Worker  ret i64 %sub
375*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30(
376*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %gep1.idx = shl nuw i64 %i, 2
377*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i64 %gep1.idx, %j
378*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64
379*9880d681SAndroid Build Coastguard Worker}
380*9880d681SAndroid Build Coastguard Worker
381*9880d681SAndroid Build Coastguard Workerdefine i16 @test30_as1(i8 addrspace(1)* %foo, i16 %i, i16 %j) {
382*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test30_as1(
383*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %gep1.idx = shl nuw i16 %i, 2
384*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: sub i16 %gep1.idx, %j
385*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i16
386*9880d681SAndroid Build Coastguard Worker  %bit = bitcast i8 addrspace(1)* %foo to i32 addrspace(1)*
387*9880d681SAndroid Build Coastguard Worker  %gep1 = getelementptr inbounds i32, i32 addrspace(1)* %bit, i16 %i
388*9880d681SAndroid Build Coastguard Worker  %gep2 = getelementptr inbounds i8, i8 addrspace(1)* %foo, i16 %j
389*9880d681SAndroid Build Coastguard Worker  %cast1 = ptrtoint i32 addrspace(1)* %gep1 to i16
390*9880d681SAndroid Build Coastguard Worker  %cast2 = ptrtoint i8 addrspace(1)* %gep2 to i16
391*9880d681SAndroid Build Coastguard Worker  %sub = sub i16 %cast1, %cast2
392*9880d681SAndroid Build Coastguard Worker  ret i16 %sub
393*9880d681SAndroid Build Coastguard Worker}
394*9880d681SAndroid Build Coastguard Worker
395*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test31(<2 x i64> %A) {
396*9880d681SAndroid Build Coastguard Worker  %xor = xor <2 x i64> %A, <i64 -1, i64 -1>
397*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i64> <i64 2, i64 3>, %xor
398*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub
399*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test31(
400*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = add <2 x i64> %A, <i64 3, i64 4>
401*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> %sub
402*9880d681SAndroid Build Coastguard Worker}
403*9880d681SAndroid Build Coastguard Worker
404*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test32(<2 x i64> %A) {
405*9880d681SAndroid Build Coastguard Worker  %add = add <2 x i64> %A, <i64 -1, i64 -1>
406*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i64> <i64 2, i64 3>, %add
407*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub
408*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test32(
409*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = sub <2 x i64> <i64 3, i64 4>
410*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> %sub
411*9880d681SAndroid Build Coastguard Worker}
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test33(<2 x i1> %A) {
414*9880d681SAndroid Build Coastguard Worker  %ext = zext <2 x i1> %A to <2 x i64>
415*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i64> zeroinitializer, %ext
416*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub
417*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test33(
418*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = sext <2 x i1> %A to <2 x i64>
419*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> %sub
420*9880d681SAndroid Build Coastguard Worker}
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test34(<2 x i1> %A) {
423*9880d681SAndroid Build Coastguard Worker  %ext = sext <2 x i1> %A to <2 x i64>
424*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i64> zeroinitializer, %ext
425*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub
426*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test34(
427*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = zext <2 x i1> %A to <2 x i64>
428*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> %sub
429*9880d681SAndroid Build Coastguard Worker}
430*9880d681SAndroid Build Coastguard Worker
431*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test35(<2 x i64> %A) {
432*9880d681SAndroid Build Coastguard Worker  %mul = mul <2 x i64> %A, <i64 3, i64 4>
433*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i64> %A, %mul
434*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub
435*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test35(
436*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = mul <2 x i64> %A, <i64 -2, i64 -3>
437*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> %sub
438*9880d681SAndroid Build Coastguard Worker}
439*9880d681SAndroid Build Coastguard Worker
440*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test36(<2 x i64> %A) {
441*9880d681SAndroid Build Coastguard Worker  %shl = shl <2 x i64> %A, <i64 3, i64 4>
442*9880d681SAndroid Build Coastguard Worker  %sub = sub <2 x i64> %shl, %A
443*9880d681SAndroid Build Coastguard Worker  ret <2 x i64> %sub
444*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test36(
445*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = mul <2 x i64> %A, <i64 7, i64 15>
446*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64> %sub
447*9880d681SAndroid Build Coastguard Worker}
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @test37(<2 x i32> %A) {
450*9880d681SAndroid Build Coastguard Worker  %div = sdiv <2 x i32> %A, <i32 -2147483648, i32 -2147483648>
451*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw <2 x i32> zeroinitializer, %div
452*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %sub
453*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test37(
454*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ICMP:%.*]] = icmp eq <2 x i32> %A, <i32 -2147483648, i32 -2147483648>
455*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = sext <2 x i1> [[ICMP]] to <2 x i32>
456*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i32> [[SEXT]]
457*9880d681SAndroid Build Coastguard Worker}
458*9880d681SAndroid Build Coastguard Worker
459*9880d681SAndroid Build Coastguard Workerdefine i32 @test38(i32 %A) {
460*9880d681SAndroid Build Coastguard Worker  %div = sdiv i32 %A, -2147483648
461*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i32 0, %div
462*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
463*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test38(
464*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ICMP:%.*]] = icmp eq i32 %A, -2147483648
465*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = sext i1 [[ICMP]] to i32
466*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[SEXT]]
467*9880d681SAndroid Build Coastguard Worker}
468*9880d681SAndroid Build Coastguard Worker
469*9880d681SAndroid Build Coastguard Workerdefine i32 @test39(i32 %A, i32 %x) {
470*9880d681SAndroid Build Coastguard Worker  %B = sub i32 0, %A
471*9880d681SAndroid Build Coastguard Worker  %C = sub nsw i32 %x, %B
472*9880d681SAndroid Build Coastguard Worker  ret i32 %C
473*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test39(
474*9880d681SAndroid Build Coastguard Worker; CHECK: %C = add i32 %x, %A
475*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %C
476*9880d681SAndroid Build Coastguard Worker}
477*9880d681SAndroid Build Coastguard Worker
478*9880d681SAndroid Build Coastguard Workerdefine i16 @test40(i16 %a, i16 %b) {
479*9880d681SAndroid Build Coastguard Worker  %ashr = ashr i16 %a, 1
480*9880d681SAndroid Build Coastguard Worker  %ashr1 = ashr i16 %b, 1
481*9880d681SAndroid Build Coastguard Worker  %sub = sub i16 %ashr, %ashr1
482*9880d681SAndroid Build Coastguard Worker  ret i16 %sub
483*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test40(
484*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ASHR:%.*]] = ashr i16 %a, 1
485*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ASHR1:%.*]] = ashr i16 %b, 1
486*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RET:%.*]] = sub nsw i16 [[ASHR]], [[ASHR1]]
487*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 [[RET]]
488*9880d681SAndroid Build Coastguard Worker}
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Workerdefine i32 @test41(i16 %a, i16 %b) {
491*9880d681SAndroid Build Coastguard Worker  %conv = sext i16 %a to i32
492*9880d681SAndroid Build Coastguard Worker  %conv1 = sext i16 %b to i32
493*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %conv, %conv1
494*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
495*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test41(
496*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT:%.*]] = sext i16 %a to i32
497*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEXT1:%.*]] = sext i16 %b to i32
498*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RET:%.*]] = sub nsw i32 [[SEXT]], [[SEXT1]]
499*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 [[RET]]
500*9880d681SAndroid Build Coastguard Worker}
501*9880d681SAndroid Build Coastguard Worker
502*9880d681SAndroid Build Coastguard Workerdefine i4 @test42(i4 %x, i4 %y) {
503*9880d681SAndroid Build Coastguard Worker  %a = and i4 %y, 7
504*9880d681SAndroid Build Coastguard Worker  %b = and i4 %x, 7
505*9880d681SAndroid Build Coastguard Worker  %c = sub i4 %a, %b
506*9880d681SAndroid Build Coastguard Worker  ret i4 %c
507*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test42(
508*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i4 %y, 7
509*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND1:%.*]] = and i4 %x, 7
510*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RET:%.*]] = sub nsw i4 [[AND]], [[AND1]]
511*9880d681SAndroid Build Coastguard Worker; CHECK: ret i4 [[RET]]
512*9880d681SAndroid Build Coastguard Worker}
513*9880d681SAndroid Build Coastguard Worker
514*9880d681SAndroid Build Coastguard Workerdefine i4 @test43(i4 %x, i4 %y) {
515*9880d681SAndroid Build Coastguard Worker  %a = or i4 %x, -8
516*9880d681SAndroid Build Coastguard Worker  %b = and i4 %y, 7
517*9880d681SAndroid Build Coastguard Worker  %c = sub i4 %a, %b
518*9880d681SAndroid Build Coastguard Worker  ret i4 %c
519*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test43(
520*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i4 %x, -8
521*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i4 %y, 7
522*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[RET:%.*]] = sub nuw i4 [[OR]], [[AND]]
523*9880d681SAndroid Build Coastguard Worker; CHECK: ret i4 [[RET]]
524*9880d681SAndroid Build Coastguard Worker}
525*9880d681SAndroid Build Coastguard Worker
526*9880d681SAndroid Build Coastguard Workerdefine i32 @test44(i32 %x) {
527*9880d681SAndroid Build Coastguard Worker  %sub = sub nsw i32 %x, 32768
528*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test44(
530*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add nsw i32 %x, -32768
531*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 [[ADD]]
532*9880d681SAndroid Build Coastguard Worker}
533*9880d681SAndroid Build Coastguard Worker
534*9880d681SAndroid Build Coastguard Workerdefine i32 @test45(i32 %x, i32 %y) {
535*9880d681SAndroid Build Coastguard Worker  %or = or i32 %x, %y
536*9880d681SAndroid Build Coastguard Worker  %xor = xor i32 %x, %y
537*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %or, %xor
538*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
539*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test45(
540*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = and i32 %x, %y
541*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %sub
542*9880d681SAndroid Build Coastguard Worker}
543*9880d681SAndroid Build Coastguard Worker
544*9880d681SAndroid Build Coastguard Workerdefine i32 @test46(i32 %x, i32 %y) {
545*9880d681SAndroid Build Coastguard Worker %or = or i32 %x, %y
546*9880d681SAndroid Build Coastguard Worker %sub = sub i32 %or, %x
547*9880d681SAndroid Build Coastguard Worker ret i32 %sub
548*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test46(
549*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %x.not = xor i32 %x, -1
550*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %sub = and i32 %y, %x.not
551*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %sub
552*9880d681SAndroid Build Coastguard Worker}
553*9880d681SAndroid Build Coastguard Worker
554*9880d681SAndroid Build Coastguard Workerdefine i32 @test47(i1 %A, i32 %B, i32 %C, i32 %D) {
555*9880d681SAndroid Build Coastguard Worker  %sel0 = select i1 %A, i32 %D, i32 %B
556*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %A, i32 %C, i32 %B
557*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %sel0, %sel1
558*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
559*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test47(
560*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[sub:.*]] = sub i32 %D, %C
561*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[sel:.*]] = select i1 %A, i32 %[[sub]], i32 0
562*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[sel]]
563*9880d681SAndroid Build Coastguard Worker}
564*9880d681SAndroid Build Coastguard Worker
565*9880d681SAndroid Build Coastguard Workerdefine i32 @test48(i1 %A, i32 %B, i32 %C, i32 %D) {
566*9880d681SAndroid Build Coastguard Worker  %sel0 = select i1 %A, i32 %B, i32 %D
567*9880d681SAndroid Build Coastguard Worker  %sel1 = select i1 %A, i32 %B, i32 %C
568*9880d681SAndroid Build Coastguard Worker  %sub = sub i32 %sel0, %sel1
569*9880d681SAndroid Build Coastguard Worker  ret i32 %sub
570*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test48(
571*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[sub:.*]] = sub i32 %D, %C
572*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %[[sel:.*]] = select i1 %A, i32 0, i32 %[[sub]]
573*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %[[sel]]
574*9880d681SAndroid Build Coastguard Worker}
575