xref: /aosp_15_r20/external/llvm/test/Transforms/InstCombine/rem.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; This test makes sure that rem instructions are properly eliminated.
2*9880d681SAndroid Build Coastguard Worker;
3*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -instcombine -S | FileCheck %s
4*9880d681SAndroid Build Coastguard Worker; END.
5*9880d681SAndroid Build Coastguard Worker
6*9880d681SAndroid Build Coastguard Workerdefine i32 @test1(i32 %A) {
7*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test1(
8*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
9*9880d681SAndroid Build Coastguard Worker	%B = srem i32 %A, 1	; ISA constant 0
10*9880d681SAndroid Build Coastguard Worker	ret i32 %B
11*9880d681SAndroid Build Coastguard Worker}
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine i32 @test2(i32 %A) {	; 0 % X = 0, we don't need to preserve traps
14*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test2(
15*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
16*9880d681SAndroid Build Coastguard Worker	%B = srem i32 0, %A
17*9880d681SAndroid Build Coastguard Worker	ret i32 %B
18*9880d681SAndroid Build Coastguard Worker}
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine i32 @test3(i32 %A) {
21*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3(
22*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 %A, 7
23*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]]
24*9880d681SAndroid Build Coastguard Worker	%B = urem i32 %A, 8
25*9880d681SAndroid Build Coastguard Worker	ret i32 %B
26*9880d681SAndroid Build Coastguard Worker}
27*9880d681SAndroid Build Coastguard Worker
28*9880d681SAndroid Build Coastguard Workerdefine <2 x i32> @vec_power_of_2_constant_splat_divisor(<2 x i32> %A) {
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @vec_power_of_2_constant_splat_divisor(
30*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = and <2 x i32> %A, <i32 7, i32 7>
31*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i32> [[B]]
32*9880d681SAndroid Build Coastguard Worker;
33*9880d681SAndroid Build Coastguard Worker  %B = urem <2 x i32> %A, <i32 8, i32 8>
34*9880d681SAndroid Build Coastguard Worker  ret <2 x i32> %B
35*9880d681SAndroid Build Coastguard Worker}
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Workerdefine <2 x i19> @weird_vec_power_of_2_constant_splat_divisor(<2 x i19> %A) {
38*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @weird_vec_power_of_2_constant_splat_divisor(
39*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    [[B:%.*]] = and <2 x i19> %A, <i19 7, i19 7>
40*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:    ret <2 x i19> [[B]]
41*9880d681SAndroid Build Coastguard Worker;
42*9880d681SAndroid Build Coastguard Worker  %B = urem <2 x i19> %A, <i19 8, i19 8>
43*9880d681SAndroid Build Coastguard Worker  ret <2 x i19> %B
44*9880d681SAndroid Build Coastguard Worker}
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Workerdefine i1 @test3a(i32 %A) {
47*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test3a(
48*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 %A, 7
49*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[CMP:%.*]] = icmp ne i32 [[AND]], 0
50*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i1 [[CMP]]
51*9880d681SAndroid Build Coastguard Worker	%B = srem i32 %A, -8
52*9880d681SAndroid Build Coastguard Worker	%C = icmp ne i32 %B, 0
53*9880d681SAndroid Build Coastguard Worker	ret i1 %C
54*9880d681SAndroid Build Coastguard Worker}
55*9880d681SAndroid Build Coastguard Worker
56*9880d681SAndroid Build Coastguard Workerdefine i32 @test4(i32 %X, i1 %C) {
57*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test4(
58*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SEL:%.*]] = select i1 %C, i32 0, i32 7
59*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[SEL]], %X
60*9880d681SAndroid Build Coastguard Worker	%V = select i1 %C, i32 1, i32 8
61*9880d681SAndroid Build Coastguard Worker	%R = urem i32 %X, %V
62*9880d681SAndroid Build Coastguard Worker	ret i32 %R
63*9880d681SAndroid Build Coastguard Worker}
64*9880d681SAndroid Build Coastguard Worker
65*9880d681SAndroid Build Coastguard Workerdefine i32 @test5(i32 %X, i8 %B) {
66*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test5(
67*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%.*]] = zext i8 %B to i32
68*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 32, [[ZEXT]]
69*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SHL]], -1
70*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[ADD]], %X
71*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[AND]]
72*9880d681SAndroid Build Coastguard Worker	%shift.upgrd.1 = zext i8 %B to i32
73*9880d681SAndroid Build Coastguard Worker	%Amt = shl i32 32, %shift.upgrd.1
74*9880d681SAndroid Build Coastguard Worker	%V = urem i32 %X, %Amt
75*9880d681SAndroid Build Coastguard Worker	ret i32 %V
76*9880d681SAndroid Build Coastguard Worker}
77*9880d681SAndroid Build Coastguard Worker
78*9880d681SAndroid Build Coastguard Workerdefine i32 @test6(i32 %A) {
79*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test6(
80*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 undef
81*9880d681SAndroid Build Coastguard Worker	%B = srem i32 %A, 0	;; undef
82*9880d681SAndroid Build Coastguard Worker	ret i32 %B
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Workerdefine i32 @test7(i32 %A) {
86*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test7(
87*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
88*9880d681SAndroid Build Coastguard Worker	%B = mul i32 %A, 8
89*9880d681SAndroid Build Coastguard Worker	%C = srem i32 %B, 4
90*9880d681SAndroid Build Coastguard Worker	ret i32 %C
91*9880d681SAndroid Build Coastguard Worker}
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Workerdefine i32 @test8(i32 %A) {
94*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test8(
95*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
96*9880d681SAndroid Build Coastguard Worker	%B = shl i32 %A, 4
97*9880d681SAndroid Build Coastguard Worker	%C = srem i32 %B, 8
98*9880d681SAndroid Build Coastguard Worker	ret i32 %C
99*9880d681SAndroid Build Coastguard Worker}
100*9880d681SAndroid Build Coastguard Worker
101*9880d681SAndroid Build Coastguard Workerdefine i32 @test9(i32 %A) {
102*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test9(
103*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
104*9880d681SAndroid Build Coastguard Worker	%B = mul i32 %A, 64
105*9880d681SAndroid Build Coastguard Worker	%C = urem i32 %B, 32
106*9880d681SAndroid Build Coastguard Worker	ret i32 %C
107*9880d681SAndroid Build Coastguard Worker}
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Workerdefine i32 @test10(i8 %c) {
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test10(
111*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
112*9880d681SAndroid Build Coastguard Worker	%tmp.1 = zext i8 %c to i32
113*9880d681SAndroid Build Coastguard Worker	%tmp.2 = mul i32 %tmp.1, 4
114*9880d681SAndroid Build Coastguard Worker	%tmp.3 = sext i32 %tmp.2 to i64
115*9880d681SAndroid Build Coastguard Worker	%tmp.5 = urem i64 %tmp.3, 4
116*9880d681SAndroid Build Coastguard Worker	%tmp.6 = trunc i64 %tmp.5 to i32
117*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.6
118*9880d681SAndroid Build Coastguard Worker}
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Workerdefine i32 @test11(i32 %i) {
121*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test11(
122*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
123*9880d681SAndroid Build Coastguard Worker	%tmp.1 = and i32 %i, -2
124*9880d681SAndroid Build Coastguard Worker	%tmp.3 = mul i32 %tmp.1, 2
125*9880d681SAndroid Build Coastguard Worker	%tmp.5 = urem i32 %tmp.3, 4
126*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.5
127*9880d681SAndroid Build Coastguard Worker}
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workerdefine i32 @test12(i32 %i) {
130*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test12(
131*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
132*9880d681SAndroid Build Coastguard Worker	%tmp.1 = and i32 %i, -4
133*9880d681SAndroid Build Coastguard Worker	%tmp.5 = srem i32 %tmp.1, 2
134*9880d681SAndroid Build Coastguard Worker	ret i32 %tmp.5
135*9880d681SAndroid Build Coastguard Worker}
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerdefine i32 @test13(i32 %i) {
138*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test13(
139*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 0
140*9880d681SAndroid Build Coastguard Worker	%x = srem i32 %i, %i
141*9880d681SAndroid Build Coastguard Worker	ret i32 %x
142*9880d681SAndroid Build Coastguard Worker}
143*9880d681SAndroid Build Coastguard Worker
144*9880d681SAndroid Build Coastguard Workerdefine i64 @test14(i64 %x, i32 %y) {
145*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test14(
146*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl i32 1, %y
147*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[SHL]] to i64
148*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add nsw i64 [[ZEXT]], -1
149*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i64 [[ADD]], %x
150*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[AND]]
151*9880d681SAndroid Build Coastguard Worker	%shl = shl i32 1, %y
152*9880d681SAndroid Build Coastguard Worker	%zext = zext i32 %shl to i64
153*9880d681SAndroid Build Coastguard Worker	%urem = urem i64 %x, %zext
154*9880d681SAndroid Build Coastguard Worker	ret i64 %urem
155*9880d681SAndroid Build Coastguard Worker}
156*9880d681SAndroid Build Coastguard Worker
157*9880d681SAndroid Build Coastguard Workerdefine i64 @test15(i32 %x, i32 %y) {
158*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test15(
159*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl nuw i32 1, %y
160*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 [[SHL]], -1
161*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[ADD]], %x
162*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ZEXT:%.*]] = zext i32 [[AND]] to i64
163*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i64 [[ZEXT]]
164*9880d681SAndroid Build Coastguard Worker	%shl = shl i32 1, %y
165*9880d681SAndroid Build Coastguard Worker	%zext0 = zext i32 %shl to i64
166*9880d681SAndroid Build Coastguard Worker	%zext1 = zext i32 %x to i64
167*9880d681SAndroid Build Coastguard Worker	%urem = urem i64 %zext1, %zext0
168*9880d681SAndroid Build Coastguard Worker	ret i64 %urem
169*9880d681SAndroid Build Coastguard Worker}
170*9880d681SAndroid Build Coastguard Worker
171*9880d681SAndroid Build Coastguard Workerdefine i32 @test16(i32 %x, i32 %y) {
172*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test16(
173*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHR:%.*]] = lshr i32 %y, 11
174*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[SHR]], 4
175*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[OR:%.*]] = or i32 [[AND]], 3
176*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[REM:%.*]] = and i32 [[OR]], %x
177*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[REM]]
178*9880d681SAndroid Build Coastguard Worker	%shr = lshr i32 %y, 11
179*9880d681SAndroid Build Coastguard Worker	%and = and i32 %shr, 4
180*9880d681SAndroid Build Coastguard Worker	%add = add i32 %and, 4
181*9880d681SAndroid Build Coastguard Worker	%rem = urem i32 %x, %add
182*9880d681SAndroid Build Coastguard Worker	ret i32 %rem
183*9880d681SAndroid Build Coastguard Worker}
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard Workerdefine i32 @test17(i32 %X) {
186*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test17(
187*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: icmp ne i32 %X, 1
188*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: zext i1
189*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret
190*9880d681SAndroid Build Coastguard Worker  %A = urem i32 1, %X
191*9880d681SAndroid Build Coastguard Worker  ret i32 %A
192*9880d681SAndroid Build Coastguard Worker}
193*9880d681SAndroid Build Coastguard Worker
194*9880d681SAndroid Build Coastguard Workerdefine i32 @test18(i16 %x, i32 %y) {
195*9880d681SAndroid Build Coastguard Worker; CHECK: @test18
196*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i16 %x, 4
197*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[EXT:%.*]] = zext i16 [[AND]] to i32
198*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL:%.*]] = shl nuw nsw i32 [[EXT]], 3
199*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[XOR:%.*]] = xor i32 [[SHL]], 63
200*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[REM:%.*]] = and i32 [[XOR]], %y
201*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[REM]]
202*9880d681SAndroid Build Coastguard Worker	%1 = and i16 %x, 4
203*9880d681SAndroid Build Coastguard Worker	%2 = icmp ne i16 %1, 0
204*9880d681SAndroid Build Coastguard Worker	%3 = select i1 %2, i32 32, i32 64
205*9880d681SAndroid Build Coastguard Worker	%4 = urem i32 %y, %3
206*9880d681SAndroid Build Coastguard Worker	ret i32 %4
207*9880d681SAndroid Build Coastguard Worker}
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerdefine i32 @test19(i32 %x, i32 %y) {
210*9880d681SAndroid Build Coastguard Worker; CHECK: @test19
211*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL1:%.*]] = shl i32 1, %x
212*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SHL2:%.*]] = shl i32 1, %y
213*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[AND:%.*]] = and i32 [[SHL1]], [[SHL2]]
214*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[ADD:%.*]] = add i32 [[AND]], [[SHL1]]
215*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[SUB:%.*]] = add i32 [[ADD]], -1
216*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: [[REM:%.*]] = and i32 [[SUB]], %y
217*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 [[REM]]
218*9880d681SAndroid Build Coastguard Worker	%A = shl i32 1, %x
219*9880d681SAndroid Build Coastguard Worker	%B = shl i32 1, %y
220*9880d681SAndroid Build Coastguard Worker	%C = and i32 %A, %B
221*9880d681SAndroid Build Coastguard Worker	%D = add i32 %C, %A
222*9880d681SAndroid Build Coastguard Worker	%E = urem i32 %y, %D
223*9880d681SAndroid Build Coastguard Worker	ret i32 %E
224*9880d681SAndroid Build Coastguard Worker}
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerdefine <2 x i64> @test20(<2 x i64> %X, <2 x i1> %C) {
227*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test20(
228*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: select <2 x i1> %C, <2 x i64> <i64 1, i64 2>, <2 x i64> zeroinitializer
229*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret <2 x i64>
230*9880d681SAndroid Build Coastguard Worker	%V = select <2 x i1> %C, <2 x i64> <i64 1, i64 2>, <2 x i64> <i64 8, i64 9>
231*9880d681SAndroid Build Coastguard Worker	%R = urem <2 x i64> %V, <i64 2, i64 3>
232*9880d681SAndroid Build Coastguard Worker	ret <2 x i64> %R
233*9880d681SAndroid Build Coastguard Worker}
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Workerdefine i32 @test21(i1 %c0, i32* %val) {
236*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test21(
237*9880d681SAndroid Build Coastguard Workerentry:
238*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %if.then, label %if.end
239*9880d681SAndroid Build Coastguard Worker
240*9880d681SAndroid Build Coastguard Workerif.then:
241*9880d681SAndroid Build Coastguard Worker; CHECK: if.then:
242*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %v = load volatile i32, i32* %val, align 4
243*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %phitmp = srem i32 %v, 5
244*9880d681SAndroid Build Coastguard Worker
245*9880d681SAndroid Build Coastguard Worker  %v = load volatile i32, i32* %val
246*9880d681SAndroid Build Coastguard Worker  br label %if.end
247*9880d681SAndroid Build Coastguard Worker
248*9880d681SAndroid Build Coastguard Workerif.end:
249*9880d681SAndroid Build Coastguard Worker; CHECK: if.end:
250*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %lhs = phi i32 [ %phitmp, %if.then ], [ 0, %entry ]
251*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %lhs
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Worker  %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ]
254*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %lhs, 5
255*9880d681SAndroid Build Coastguard Worker  ret i32 %rem
256*9880d681SAndroid Build Coastguard Worker}
257*9880d681SAndroid Build Coastguard Worker
258*9880d681SAndroid Build Coastguard Worker@a = common global [5 x i16] zeroinitializer, align 2
259*9880d681SAndroid Build Coastguard Worker@b = common global i16 0, align 2
260*9880d681SAndroid Build Coastguard Worker
261*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_0(i1 %c0, i32* %val) {
262*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_0(
263*9880d681SAndroid Build Coastguard Workerentry:
264*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %if.then, label %if.end
265*9880d681SAndroid Build Coastguard Worker
266*9880d681SAndroid Build Coastguard Workerif.then:
267*9880d681SAndroid Build Coastguard Worker  %v = load volatile i32, i32* %val
268*9880d681SAndroid Build Coastguard Worker  br label %if.end
269*9880d681SAndroid Build Coastguard Worker
270*9880d681SAndroid Build Coastguard Worker; CHECK: if.then:
271*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: srem
272*9880d681SAndroid Build Coastguard Worker; CHECK:  br label %if.end
273*9880d681SAndroid Build Coastguard Worker
274*9880d681SAndroid Build Coastguard Workerif.end:
275*9880d681SAndroid Build Coastguard Worker  %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ]
276*9880d681SAndroid Build Coastguard Worker  br i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b), label %rem.is.safe, label %rem.is.unsafe
277*9880d681SAndroid Build Coastguard Worker
278*9880d681SAndroid Build Coastguard Workerrem.is.safe:
279*9880d681SAndroid Build Coastguard Worker; CHECK: rem.is.safe:
280*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %rem = srem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32)
281*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %rem
282*9880d681SAndroid Build Coastguard Worker
283*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32)
284*9880d681SAndroid Build Coastguard Worker  ret i32 %rem
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Workerrem.is.unsafe:
287*9880d681SAndroid Build Coastguard Worker  ret i32 0
288*9880d681SAndroid Build Coastguard Worker}
289*9880d681SAndroid Build Coastguard Worker
290*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_1(i1 %c0, i1 %always_false, i32* %val) {
291*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_1(
292*9880d681SAndroid Build Coastguard Workerentry:
293*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %if.then, label %if.end
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Workerif.then:
296*9880d681SAndroid Build Coastguard Worker  %v = load volatile i32, i32* %val
297*9880d681SAndroid Build Coastguard Worker  br label %if.end
298*9880d681SAndroid Build Coastguard Worker
299*9880d681SAndroid Build Coastguard Worker; CHECK: if.then:
300*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: srem
301*9880d681SAndroid Build Coastguard Worker; CHECK:  br label %if.end
302*9880d681SAndroid Build Coastguard Worker
303*9880d681SAndroid Build Coastguard Workerif.end:
304*9880d681SAndroid Build Coastguard Worker  %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ]
305*9880d681SAndroid Build Coastguard Worker  br i1 %always_false, label %rem.is.safe, label %rem.is.unsafe
306*9880d681SAndroid Build Coastguard Worker
307*9880d681SAndroid Build Coastguard Workerrem.is.safe:
308*9880d681SAndroid Build Coastguard Worker  %rem = srem i32 %lhs, -2147483648
309*9880d681SAndroid Build Coastguard Worker  ret i32 %rem
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker; CHECK: rem.is.safe:
312*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %rem = srem i32 %lhs, -2147483648
313*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %rem
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Workerrem.is.unsafe:
316*9880d681SAndroid Build Coastguard Worker  ret i32 0
317*9880d681SAndroid Build Coastguard Worker}
318*9880d681SAndroid Build Coastguard Worker
319*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_2(i1 %c0, i32* %val) {
320*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_2(
321*9880d681SAndroid Build Coastguard Workerentry:
322*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %if.then, label %if.end
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerif.then:
325*9880d681SAndroid Build Coastguard Worker  %v = load volatile i32, i32* %val
326*9880d681SAndroid Build Coastguard Worker  br label %if.end
327*9880d681SAndroid Build Coastguard Worker
328*9880d681SAndroid Build Coastguard Worker; CHECK: if.then:
329*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: urem
330*9880d681SAndroid Build Coastguard Worker; CHECK:  br label %if.end
331*9880d681SAndroid Build Coastguard Worker
332*9880d681SAndroid Build Coastguard Workerif.end:
333*9880d681SAndroid Build Coastguard Worker  %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ]
334*9880d681SAndroid Build Coastguard Worker  br i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b), label %rem.is.safe, label %rem.is.unsafe
335*9880d681SAndroid Build Coastguard Worker
336*9880d681SAndroid Build Coastguard Workerrem.is.safe:
337*9880d681SAndroid Build Coastguard Worker; CHECK: rem.is.safe:
338*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %rem = urem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32)
339*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  ret i32 %rem
340*9880d681SAndroid Build Coastguard Worker
341*9880d681SAndroid Build Coastguard Worker  %rem = urem i32 %lhs, zext (i1 icmp eq (i16* getelementptr inbounds ([5 x i16], [5 x i16]* @a, i64 0, i64 4), i16* @b) to i32)
342*9880d681SAndroid Build Coastguard Worker  ret i32 %rem
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard Workerrem.is.unsafe:
345*9880d681SAndroid Build Coastguard Worker  ret i32 0
346*9880d681SAndroid Build Coastguard Worker}
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard Workerdefine i32 @pr27968_3(i1 %c0, i1 %always_false, i32* %val) {
349*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @pr27968_3(
350*9880d681SAndroid Build Coastguard Workerentry:
351*9880d681SAndroid Build Coastguard Worker  br i1 %c0, label %if.then, label %if.end
352*9880d681SAndroid Build Coastguard Worker
353*9880d681SAndroid Build Coastguard Workerif.then:
354*9880d681SAndroid Build Coastguard Worker  %v = load volatile i32, i32* %val
355*9880d681SAndroid Build Coastguard Worker  br label %if.end
356*9880d681SAndroid Build Coastguard Worker
357*9880d681SAndroid Build Coastguard Worker; CHECK: if.then:
358*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %v = load volatile i32, i32* %val, align 4
359*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  %phitmp = and i32 %v, 2147483647
360*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:  br label %if.end
361*9880d681SAndroid Build Coastguard Worker
362*9880d681SAndroid Build Coastguard Workerif.end:
363*9880d681SAndroid Build Coastguard Worker  %lhs = phi i32 [ %v, %if.then ], [ 5, %entry ]
364*9880d681SAndroid Build Coastguard Worker  br i1 %always_false, label %rem.is.safe, label %rem.is.unsafe
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Workerrem.is.safe:
367*9880d681SAndroid Build Coastguard Worker  %rem = urem i32 %lhs, -2147483648
368*9880d681SAndroid Build Coastguard Worker  ret i32 %rem
369*9880d681SAndroid Build Coastguard Worker
370*9880d681SAndroid Build Coastguard Workerrem.is.unsafe:
371*9880d681SAndroid Build Coastguard Worker  ret i32 0
372*9880d681SAndroid Build Coastguard Worker}
373