xref: /aosp_15_r20/external/llvm/test/Transforms/GVN/rle.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="e-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-n8:16:32" -basicaa -gvn -S -die | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -default-data-layout="E-p:32:32:32-p1:16:16:16-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:64:64-n32"      -basicaa -gvn -S -die | FileCheck %s
3*9880d681SAndroid Build Coastguard Worker
4*9880d681SAndroid Build Coastguard Worker;; Trivial RLE test.
5*9880d681SAndroid Build Coastguard Workerdefine i32 @test0(i32 %V, i32* %P) {
6*9880d681SAndroid Build Coastguard Worker  store i32 %V, i32* %P
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* %P
9*9880d681SAndroid Build Coastguard Worker  ret i32 %A
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test0(
11*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %V
12*9880d681SAndroid Build Coastguard Worker}
13*9880d681SAndroid Build Coastguard Worker
14*9880d681SAndroid Build Coastguard Worker
15*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
16*9880d681SAndroid Build Coastguard Worker;; Tests for crashers
17*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
18*9880d681SAndroid Build Coastguard Worker
19*9880d681SAndroid Build Coastguard Worker;; PR5016
20*9880d681SAndroid Build Coastguard Workerdefine i8 @crash0({i32, i32} %A, {i32, i32}* %P) {
21*9880d681SAndroid Build Coastguard Worker  store {i32, i32} %A, {i32, i32}* %P
22*9880d681SAndroid Build Coastguard Worker  %X = bitcast {i32, i32}* %P to i8*
23*9880d681SAndroid Build Coastguard Worker  %Y = load i8, i8* %X
24*9880d681SAndroid Build Coastguard Worker  ret i8 %Y
25*9880d681SAndroid Build Coastguard Worker}
26*9880d681SAndroid Build Coastguard Worker
27*9880d681SAndroid Build Coastguard Worker;; No PR filed, crashed in CaptureTracker.
28*9880d681SAndroid Build Coastguard Workerdeclare void @helper()
29*9880d681SAndroid Build Coastguard Workerdefine void @crash1() {
30*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* undef, i8* undef, i64 undef, i32 1, i1 false) nounwind
31*9880d681SAndroid Build Coastguard Worker  %tmp = load i8, i8* bitcast (void ()* @helper to i8*)
32*9880d681SAndroid Build Coastguard Worker  %x = icmp eq i8 %tmp, 15
33*9880d681SAndroid Build Coastguard Worker  ret void
34*9880d681SAndroid Build Coastguard Worker}
35*9880d681SAndroid Build Coastguard Worker
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
38*9880d681SAndroid Build Coastguard Worker;; Store -> Load  and  Load -> Load forwarding where src and dst are different
39*9880d681SAndroid Build Coastguard Worker;; types, but where the base pointer is a must alias.
40*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
41*9880d681SAndroid Build Coastguard Worker
42*9880d681SAndroid Build Coastguard Worker;; i32 -> f32 forwarding.
43*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias1(i32 %V, i32* %P) {
44*9880d681SAndroid Build Coastguard Worker  store i32 %V, i32* %P
45*9880d681SAndroid Build Coastguard Worker
46*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32* %P to float*
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Worker  %A = load float, float* %P2
49*9880d681SAndroid Build Coastguard Worker  ret float %A
50*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias1(
51*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
52*9880d681SAndroid Build Coastguard Worker; CHECK: ret float
53*9880d681SAndroid Build Coastguard Worker}
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Worker;; i32* -> float forwarding.
56*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias2(i32* %V, i32** %P) {
57*9880d681SAndroid Build Coastguard Worker  store i32* %V, i32** %P
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32** %P to float*
60*9880d681SAndroid Build Coastguard Worker
61*9880d681SAndroid Build Coastguard Worker  %A = load float, float* %P2
62*9880d681SAndroid Build Coastguard Worker  ret float %A
63*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias2(
64*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
65*9880d681SAndroid Build Coastguard Worker; CHECK: ret float
66*9880d681SAndroid Build Coastguard Worker}
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker;; float -> i32* forwarding.
69*9880d681SAndroid Build Coastguard Workerdefine i32* @coerce_mustalias3(float %V, float* %P) {
70*9880d681SAndroid Build Coastguard Worker  store float %V, float* %P
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast float* %P to i32**
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Worker  %A = load i32*, i32** %P2
75*9880d681SAndroid Build Coastguard Worker  ret i32* %A
76*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias3(
77*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
78*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32*
79*9880d681SAndroid Build Coastguard Worker}
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Worker;; i32 -> f32 load forwarding.
82*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias4(i32* %P, i1 %cond) {
83*9880d681SAndroid Build Coastguard Worker  %A = load i32, i32* %P
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32* %P to float*
86*9880d681SAndroid Build Coastguard Worker  %B = load float, float* %P2
87*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %T, label %F
88*9880d681SAndroid Build Coastguard WorkerT:
89*9880d681SAndroid Build Coastguard Worker  ret float %B
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard WorkerF:
92*9880d681SAndroid Build Coastguard Worker  %X = bitcast i32 %A to float
93*9880d681SAndroid Build Coastguard Worker  ret float %X
94*9880d681SAndroid Build Coastguard Worker
95*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias4(
96*9880d681SAndroid Build Coastguard Worker; CHECK: %A = load i32, i32* %P
97*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
98*9880d681SAndroid Build Coastguard Worker; CHECK: ret float
99*9880d681SAndroid Build Coastguard Worker; CHECK: F:
100*9880d681SAndroid Build Coastguard Worker}
101*9880d681SAndroid Build Coastguard Worker
102*9880d681SAndroid Build Coastguard Worker;; i32 -> i8 forwarding
103*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias5(i32 %V, i32* %P) {
104*9880d681SAndroid Build Coastguard Worker  store i32 %V, i32* %P
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32* %P to i8*
107*9880d681SAndroid Build Coastguard Worker
108*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8* %P2
109*9880d681SAndroid Build Coastguard Worker  ret i8 %A
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias5(
111*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
112*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8
113*9880d681SAndroid Build Coastguard Worker}
114*9880d681SAndroid Build Coastguard Worker
115*9880d681SAndroid Build Coastguard Worker;; i64 -> float forwarding
116*9880d681SAndroid Build Coastguard Workerdefine float @coerce_mustalias6(i64 %V, i64* %P) {
117*9880d681SAndroid Build Coastguard Worker  store i64 %V, i64* %P
118*9880d681SAndroid Build Coastguard Worker
119*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i64* %P to float*
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Worker  %A = load float, float* %P2
122*9880d681SAndroid Build Coastguard Worker  ret float %A
123*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias6(
124*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
125*9880d681SAndroid Build Coastguard Worker; CHECK: ret float
126*9880d681SAndroid Build Coastguard Worker}
127*9880d681SAndroid Build Coastguard Worker
128*9880d681SAndroid Build Coastguard Worker;; i64 -> i8* (32-bit) forwarding
129*9880d681SAndroid Build Coastguard Workerdefine i8* @coerce_mustalias7(i64 %V, i64* %P) {
130*9880d681SAndroid Build Coastguard Worker  store i64 %V, i64* %P
131*9880d681SAndroid Build Coastguard Worker
132*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i64* %P to i8**
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker  %A = load i8*, i8** %P2
135*9880d681SAndroid Build Coastguard Worker  ret i8* %A
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias7(
137*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
138*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8*
139*9880d681SAndroid Build Coastguard Worker}
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Worker; memset -> i16 forwarding.
142*9880d681SAndroid Build Coastguard Workerdefine signext i16 @memset_to_i16_local(i16* %A) nounwind ssp {
143*9880d681SAndroid Build Coastguard Workerentry:
144*9880d681SAndroid Build Coastguard Worker  %conv = bitcast i16* %A to i8*
145*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memset.p0i8.i64(i8* %conv, i8 1, i64 200, i32 1, i1 false)
146*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds i16, i16* %A, i64 42
147*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i16, i16* %arrayidx
148*9880d681SAndroid Build Coastguard Worker  ret i16 %tmp2
149*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_i16_local(
150*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
151*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 257
152*9880d681SAndroid Build Coastguard Worker}
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Worker; memset -> float forwarding.
155*9880d681SAndroid Build Coastguard Workerdefine float @memset_to_float_local(float* %A, i8 %Val) nounwind ssp {
156*9880d681SAndroid Build Coastguard Workerentry:
157*9880d681SAndroid Build Coastguard Worker  %conv = bitcast float* %A to i8*                ; <i8*> [#uses=1]
158*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memset.p0i8.i64(i8* %conv, i8 %Val, i64 400, i32 1, i1 false)
159*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds float, float* %A, i64 42 ; <float*> [#uses=1]
160*9880d681SAndroid Build Coastguard Worker  %tmp2 = load float, float* %arrayidx                   ; <float> [#uses=1]
161*9880d681SAndroid Build Coastguard Worker  ret float %tmp2
162*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_float_local(
163*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
164*9880d681SAndroid Build Coastguard Worker; CHECK: zext
165*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl
166*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: or
167*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: shl
168*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: or
169*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: bitcast
170*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret float
171*9880d681SAndroid Build Coastguard Worker}
172*9880d681SAndroid Build Coastguard Worker
173*9880d681SAndroid Build Coastguard Worker;; non-local memset -> i16 load forwarding.
174*9880d681SAndroid Build Coastguard Workerdefine i16 @memset_to_i16_nonlocal0(i16* %P, i1 %cond) {
175*9880d681SAndroid Build Coastguard Worker  %P3 = bitcast i16* %P to i8*
176*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %T, label %F
177*9880d681SAndroid Build Coastguard WorkerT:
178*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memset.p0i8.i64(i8* %P3, i8 1, i64 400, i32 1, i1 false)
179*9880d681SAndroid Build Coastguard Worker  br label %Cont
180*9880d681SAndroid Build Coastguard Worker
181*9880d681SAndroid Build Coastguard WorkerF:
182*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memset.p0i8.i64(i8* %P3, i8 2, i64 400, i32 1, i1 false)
183*9880d681SAndroid Build Coastguard Worker  br label %Cont
184*9880d681SAndroid Build Coastguard Worker
185*9880d681SAndroid Build Coastguard WorkerCont:
186*9880d681SAndroid Build Coastguard Worker  %P2 = getelementptr i16, i16* %P, i32 4
187*9880d681SAndroid Build Coastguard Worker  %A = load i16, i16* %P2
188*9880d681SAndroid Build Coastguard Worker  ret i16 %A
189*9880d681SAndroid Build Coastguard Worker
190*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_i16_nonlocal0(
191*9880d681SAndroid Build Coastguard Worker; CHECK: Cont:
192*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT:   %A = phi i16 [ 514, %F ], [ 257, %T ]
193*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
194*9880d681SAndroid Build Coastguard Worker; CHECK: ret i16 %A
195*9880d681SAndroid Build Coastguard Worker}
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker@GCst = constant {i32, float, i32 } { i32 42, float 14., i32 97 }
198*9880d681SAndroid Build Coastguard Worker@GCst_as1 = addrspace(1) constant {i32, float, i32 } { i32 42, float 14., i32 97 }
199*9880d681SAndroid Build Coastguard Worker
200*9880d681SAndroid Build Coastguard Worker; memset -> float forwarding.
201*9880d681SAndroid Build Coastguard Workerdefine float @memcpy_to_float_local(float* %A) nounwind ssp {
202*9880d681SAndroid Build Coastguard Workerentry:
203*9880d681SAndroid Build Coastguard Worker  %conv = bitcast float* %A to i8*                ; <i8*> [#uses=1]
204*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p0i8.i64(i8* %conv, i8* bitcast ({i32, float, i32 }* @GCst to i8*), i64 12, i32 1, i1 false)
205*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds float, float* %A, i64 1 ; <float*> [#uses=1]
206*9880d681SAndroid Build Coastguard Worker  %tmp2 = load float, float* %arrayidx                   ; <float> [#uses=1]
207*9880d681SAndroid Build Coastguard Worker  ret float %tmp2
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memcpy_to_float_local(
209*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
210*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 1.400000e+01
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker; memcpy from address space 1
214*9880d681SAndroid Build Coastguard Workerdefine float @memcpy_to_float_local_as1(float* %A) nounwind ssp {
215*9880d681SAndroid Build Coastguard Workerentry:
216*9880d681SAndroid Build Coastguard Worker  %conv = bitcast float* %A to i8*                ; <i8*> [#uses=1]
217*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.memcpy.p0i8.p1i8.i64(i8* %conv, i8 addrspace(1)* bitcast ({i32, float, i32 } addrspace(1)* @GCst_as1 to i8 addrspace(1)*), i64 12, i32 1, i1 false)
218*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds float, float* %A, i64 1 ; <float*> [#uses=1]
219*9880d681SAndroid Build Coastguard Worker  %tmp2 = load float, float* %arrayidx                   ; <float> [#uses=1]
220*9880d681SAndroid Build Coastguard Worker  ret float %tmp2
221*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memcpy_to_float_local_as1(
222*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
223*9880d681SAndroid Build Coastguard Worker; CHECK: ret float 1.400000e+01
224*9880d681SAndroid Build Coastguard Worker}
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Worker;; non-local i32/float -> i8 load forwarding.
227*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias_nonlocal0(i32* %P, i1 %cond) {
228*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32* %P to float*
229*9880d681SAndroid Build Coastguard Worker  %P3 = bitcast i32* %P to i8*
230*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %T, label %F
231*9880d681SAndroid Build Coastguard WorkerT:
232*9880d681SAndroid Build Coastguard Worker  store i32 42, i32* %P
233*9880d681SAndroid Build Coastguard Worker  br label %Cont
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard WorkerF:
236*9880d681SAndroid Build Coastguard Worker  store float 1.0, float* %P2
237*9880d681SAndroid Build Coastguard Worker  br label %Cont
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard WorkerCont:
240*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8* %P3
241*9880d681SAndroid Build Coastguard Worker  ret i8 %A
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias_nonlocal0(
244*9880d681SAndroid Build Coastguard Worker; CHECK: Cont:
245*9880d681SAndroid Build Coastguard Worker; CHECK:   %A = phi i8 [
246*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
247*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A
248*9880d681SAndroid Build Coastguard Worker}
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker;; non-local i32/float -> i8 load forwarding.  This also tests that the "P3"
252*9880d681SAndroid Build Coastguard Worker;; bitcast equivalence can be properly phi translated.
253*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias_nonlocal1(i32* %P, i1 %cond) {
254*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32* %P to float*
255*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %T, label %F
256*9880d681SAndroid Build Coastguard WorkerT:
257*9880d681SAndroid Build Coastguard Worker  store i32 42, i32* %P
258*9880d681SAndroid Build Coastguard Worker  br label %Cont
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard WorkerF:
261*9880d681SAndroid Build Coastguard Worker  store float 1.0, float* %P2
262*9880d681SAndroid Build Coastguard Worker  br label %Cont
263*9880d681SAndroid Build Coastguard Worker
264*9880d681SAndroid Build Coastguard WorkerCont:
265*9880d681SAndroid Build Coastguard Worker  %P3 = bitcast i32* %P to i8*
266*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8* %P3
267*9880d681SAndroid Build Coastguard Worker  ret i8 %A
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias_nonlocal1(
270*9880d681SAndroid Build Coastguard Worker; CHECK: Cont:
271*9880d681SAndroid Build Coastguard Worker; CHECK:   %A = phi i8 [
272*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
273*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A
274*9880d681SAndroid Build Coastguard Worker}
275*9880d681SAndroid Build Coastguard Worker
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker;; non-local i32 -> i8 partial redundancy load forwarding.
278*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_mustalias_pre0(i32* %P, i1 %cond) {
279*9880d681SAndroid Build Coastguard Worker  %P3 = bitcast i32* %P to i8*
280*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %T, label %F
281*9880d681SAndroid Build Coastguard WorkerT:
282*9880d681SAndroid Build Coastguard Worker  store i32 42, i32* %P
283*9880d681SAndroid Build Coastguard Worker  br label %Cont
284*9880d681SAndroid Build Coastguard Worker
285*9880d681SAndroid Build Coastguard WorkerF:
286*9880d681SAndroid Build Coastguard Worker  br label %Cont
287*9880d681SAndroid Build Coastguard Worker
288*9880d681SAndroid Build Coastguard WorkerCont:
289*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8* %P3
290*9880d681SAndroid Build Coastguard Worker  ret i8 %A
291*9880d681SAndroid Build Coastguard Worker
292*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_mustalias_pre0(
293*9880d681SAndroid Build Coastguard Worker; CHECK: F:
294*9880d681SAndroid Build Coastguard Worker; CHECK:   load i8, i8* %P3
295*9880d681SAndroid Build Coastguard Worker; CHECK: Cont:
296*9880d681SAndroid Build Coastguard Worker; CHECK:   %A = phi i8 [
297*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
298*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A
299*9880d681SAndroid Build Coastguard Worker}
300*9880d681SAndroid Build Coastguard Worker
301*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
302*9880d681SAndroid Build Coastguard Worker;; Store -> Load  and  Load -> Load forwarding where src and dst are different
303*9880d681SAndroid Build Coastguard Worker;; types, and the reload is an offset from the store pointer.
304*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
305*9880d681SAndroid Build Coastguard Worker
306*9880d681SAndroid Build Coastguard Worker;; i32 -> i8 forwarding.
307*9880d681SAndroid Build Coastguard Worker;; PR4216
308*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset0(i32 %V, i32* %P) {
309*9880d681SAndroid Build Coastguard Worker  store i32 %V, i32* %P
310*9880d681SAndroid Build Coastguard Worker
311*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32* %P to i8*
312*9880d681SAndroid Build Coastguard Worker  %P3 = getelementptr i8, i8* %P2, i32 2
313*9880d681SAndroid Build Coastguard Worker
314*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8* %P3
315*9880d681SAndroid Build Coastguard Worker  ret i8 %A
316*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset0(
317*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
318*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8
319*9880d681SAndroid Build Coastguard Worker}
320*9880d681SAndroid Build Coastguard Worker
321*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset0_addrspacecast(i32 %V, i32* %P) {
322*9880d681SAndroid Build Coastguard Worker  store i32 %V, i32* %P
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Worker  %P2 = addrspacecast i32* %P to i8 addrspace(1)*
325*9880d681SAndroid Build Coastguard Worker  %P3 = getelementptr i8, i8 addrspace(1)* %P2, i32 2
326*9880d681SAndroid Build Coastguard Worker
327*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8 addrspace(1)* %P3
328*9880d681SAndroid Build Coastguard Worker  ret i8 %A
329*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset0_addrspacecast(
330*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
331*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8
332*9880d681SAndroid Build Coastguard Worker}
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker;; non-local i32/float -> i8 load forwarding.
335*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset_nonlocal0(i32* %P, i1 %cond) {
336*9880d681SAndroid Build Coastguard Worker  %P2 = bitcast i32* %P to float*
337*9880d681SAndroid Build Coastguard Worker  %P3 = bitcast i32* %P to i8*
338*9880d681SAndroid Build Coastguard Worker  %P4 = getelementptr i8, i8* %P3, i32 2
339*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %T, label %F
340*9880d681SAndroid Build Coastguard WorkerT:
341*9880d681SAndroid Build Coastguard Worker  store i32 57005, i32* %P
342*9880d681SAndroid Build Coastguard Worker  br label %Cont
343*9880d681SAndroid Build Coastguard Worker
344*9880d681SAndroid Build Coastguard WorkerF:
345*9880d681SAndroid Build Coastguard Worker  store float 1.0, float* %P2
346*9880d681SAndroid Build Coastguard Worker  br label %Cont
347*9880d681SAndroid Build Coastguard Worker
348*9880d681SAndroid Build Coastguard WorkerCont:
349*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8* %P4
350*9880d681SAndroid Build Coastguard Worker  ret i8 %A
351*9880d681SAndroid Build Coastguard Worker
352*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset_nonlocal0(
353*9880d681SAndroid Build Coastguard Worker; CHECK: Cont:
354*9880d681SAndroid Build Coastguard Worker; CHECK:   %A = phi i8 [
355*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
356*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Worker
360*9880d681SAndroid Build Coastguard Worker;; non-local i32 -> i8 partial redundancy load forwarding.
361*9880d681SAndroid Build Coastguard Workerdefine i8 @coerce_offset_pre0(i32* %P, i1 %cond) {
362*9880d681SAndroid Build Coastguard Worker  %P3 = bitcast i32* %P to i8*
363*9880d681SAndroid Build Coastguard Worker  %P4 = getelementptr i8, i8* %P3, i32 2
364*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %T, label %F
365*9880d681SAndroid Build Coastguard WorkerT:
366*9880d681SAndroid Build Coastguard Worker  store i32 42, i32* %P
367*9880d681SAndroid Build Coastguard Worker  br label %Cont
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard WorkerF:
370*9880d681SAndroid Build Coastguard Worker  br label %Cont
371*9880d681SAndroid Build Coastguard Worker
372*9880d681SAndroid Build Coastguard WorkerCont:
373*9880d681SAndroid Build Coastguard Worker  %A = load i8, i8* %P4
374*9880d681SAndroid Build Coastguard Worker  ret i8 %A
375*9880d681SAndroid Build Coastguard Worker
376*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @coerce_offset_pre0(
377*9880d681SAndroid Build Coastguard Worker; CHECK: F:
378*9880d681SAndroid Build Coastguard Worker; CHECK:   load i8, i8* %P4
379*9880d681SAndroid Build Coastguard Worker; CHECK: Cont:
380*9880d681SAndroid Build Coastguard Worker; CHECK:   %A = phi i8 [
381*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
382*9880d681SAndroid Build Coastguard Worker; CHECK: ret i8 %A
383*9880d681SAndroid Build Coastguard Worker}
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerdefine i32 @chained_load(i32** %p, i32 %x, i32 %y) {
386*9880d681SAndroid Build Coastguard Workerblock1:
387*9880d681SAndroid Build Coastguard Worker  %A = alloca i32*
388*9880d681SAndroid Build Coastguard Worker
389*9880d681SAndroid Build Coastguard Worker  %z = load i32*, i32** %p
390*9880d681SAndroid Build Coastguard Worker  store i32* %z, i32** %A
391*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %x, %y
392*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %block2, label %block3
393*9880d681SAndroid Build Coastguard Worker
394*9880d681SAndroid Build Coastguard Workerblock2:
395*9880d681SAndroid Build Coastguard Worker %a = load i32*, i32** %p
396*9880d681SAndroid Build Coastguard Worker br label %block4
397*9880d681SAndroid Build Coastguard Worker
398*9880d681SAndroid Build Coastguard Workerblock3:
399*9880d681SAndroid Build Coastguard Worker  %b = load i32*, i32** %p
400*9880d681SAndroid Build Coastguard Worker  br label %block4
401*9880d681SAndroid Build Coastguard Worker
402*9880d681SAndroid Build Coastguard Workerblock4:
403*9880d681SAndroid Build Coastguard Worker  %c = load i32*, i32** %p
404*9880d681SAndroid Build Coastguard Worker  %d = load i32, i32* %c
405*9880d681SAndroid Build Coastguard Worker  ret i32 %d
406*9880d681SAndroid Build Coastguard Worker
407*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @chained_load(
408*9880d681SAndroid Build Coastguard Worker; CHECK: %z = load i32*, i32** %p
409*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
410*9880d681SAndroid Build Coastguard Worker; CHECK: %d = load i32, i32* %z
411*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %d
412*9880d681SAndroid Build Coastguard Worker}
413*9880d681SAndroid Build Coastguard Worker
414*9880d681SAndroid Build Coastguard Worker
415*9880d681SAndroid Build Coastguard Workerdeclare i1 @cond() readonly
416*9880d681SAndroid Build Coastguard Workerdeclare i1 @cond2() readonly
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Workerdefine i32 @phi_trans2() {
419*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans2(
420*9880d681SAndroid Build Coastguard Workerentry:
421*9880d681SAndroid Build Coastguard Worker  %P = alloca i32, i32 400
422*9880d681SAndroid Build Coastguard Worker  br label %F1
423*9880d681SAndroid Build Coastguard Worker
424*9880d681SAndroid Build Coastguard WorkerF1:
425*9880d681SAndroid Build Coastguard Worker  %A = phi i32 [1, %entry], [2, %F]
426*9880d681SAndroid Build Coastguard Worker  %cond2 = call i1 @cond()
427*9880d681SAndroid Build Coastguard Worker  br i1 %cond2, label %T1, label %TY
428*9880d681SAndroid Build Coastguard Worker
429*9880d681SAndroid Build Coastguard WorkerT1:
430*9880d681SAndroid Build Coastguard Worker  %P2 = getelementptr i32, i32* %P, i32 %A
431*9880d681SAndroid Build Coastguard Worker  %x = load i32, i32* %P2
432*9880d681SAndroid Build Coastguard Worker  %cond = call i1 @cond2()
433*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %TX, label %F
434*9880d681SAndroid Build Coastguard Worker
435*9880d681SAndroid Build Coastguard WorkerF:
436*9880d681SAndroid Build Coastguard Worker  %P3 = getelementptr i32, i32* %P, i32 2
437*9880d681SAndroid Build Coastguard Worker  store i32 17, i32* %P3
438*9880d681SAndroid Build Coastguard Worker
439*9880d681SAndroid Build Coastguard Worker  store i32 42, i32* %P2  ; Provides "P[A]".
440*9880d681SAndroid Build Coastguard Worker  br label %F1
441*9880d681SAndroid Build Coastguard Worker
442*9880d681SAndroid Build Coastguard WorkerTX:
443*9880d681SAndroid Build Coastguard Worker  ; This load should not be compiled to 'ret i32 42'.  An overly clever
444*9880d681SAndroid Build Coastguard Worker  ; implementation of GVN would see that we're returning 17 if the loop
445*9880d681SAndroid Build Coastguard Worker  ; executes once or 42 if it executes more than that, but we'd have to do
446*9880d681SAndroid Build Coastguard Worker  ; loop restructuring to expose this, and GVN shouldn't do this sort of CFG
447*9880d681SAndroid Build Coastguard Worker  ; transformation.
448*9880d681SAndroid Build Coastguard Worker
449*9880d681SAndroid Build Coastguard Worker; CHECK: TX:
450*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 %x
451*9880d681SAndroid Build Coastguard Worker  ret i32 %x
452*9880d681SAndroid Build Coastguard WorkerTY:
453*9880d681SAndroid Build Coastguard Worker  ret i32 0
454*9880d681SAndroid Build Coastguard Worker}
455*9880d681SAndroid Build Coastguard Worker
456*9880d681SAndroid Build Coastguard Workerdefine i32 @phi_trans3(i32* %p, i32 %x, i32 %y, i32 %z) {
457*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans3(
458*9880d681SAndroid Build Coastguard Workerblock1:
459*9880d681SAndroid Build Coastguard Worker  %cmpxy = icmp eq i32 %x, %y
460*9880d681SAndroid Build Coastguard Worker  br i1 %cmpxy, label %block2, label %block3
461*9880d681SAndroid Build Coastguard Worker
462*9880d681SAndroid Build Coastguard Workerblock2:
463*9880d681SAndroid Build Coastguard Worker store i32 87, i32* %p
464*9880d681SAndroid Build Coastguard Worker br label %block4
465*9880d681SAndroid Build Coastguard Worker
466*9880d681SAndroid Build Coastguard Workerblock3:
467*9880d681SAndroid Build Coastguard Worker  %p2 = getelementptr i32, i32* %p, i32 43
468*9880d681SAndroid Build Coastguard Worker  store i32 97, i32* %p2
469*9880d681SAndroid Build Coastguard Worker  br label %block4
470*9880d681SAndroid Build Coastguard Worker
471*9880d681SAndroid Build Coastguard Workerblock4:
472*9880d681SAndroid Build Coastguard Worker  %A = phi i32 [-1, %block2], [42, %block3]
473*9880d681SAndroid Build Coastguard Worker  br i1 %cmpxy, label %block5, label %exit
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Worker; CHECK: block4:
476*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %D = phi i32 [ 87, %block2 ], [ 97, %block3 ]
477*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Workerblock5:
480*9880d681SAndroid Build Coastguard Worker  %B = add i32 %A, 1
481*9880d681SAndroid Build Coastguard Worker  br i1 %cmpxy, label %block6, label %exit
482*9880d681SAndroid Build Coastguard Worker
483*9880d681SAndroid Build Coastguard Workerblock6:
484*9880d681SAndroid Build Coastguard Worker  %C = getelementptr i32, i32* %p, i32 %B
485*9880d681SAndroid Build Coastguard Worker  br i1 %cmpxy, label %block7, label %exit
486*9880d681SAndroid Build Coastguard Worker
487*9880d681SAndroid Build Coastguard Workerblock7:
488*9880d681SAndroid Build Coastguard Worker  %D = load i32, i32* %C
489*9880d681SAndroid Build Coastguard Worker  ret i32 %D
490*9880d681SAndroid Build Coastguard Worker
491*9880d681SAndroid Build Coastguard Worker; CHECK: block7:
492*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: ret i32 %D
493*9880d681SAndroid Build Coastguard Worker
494*9880d681SAndroid Build Coastguard Workerexit:
495*9880d681SAndroid Build Coastguard Worker  ret i32 -1
496*9880d681SAndroid Build Coastguard Worker}
497*9880d681SAndroid Build Coastguard Worker
498*9880d681SAndroid Build Coastguard Workerdefine i8 @phi_trans4(i8* %p) {
499*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans4(
500*9880d681SAndroid Build Coastguard Workerentry:
501*9880d681SAndroid Build Coastguard Worker  %X3 = getelementptr i8, i8* %p, i32 192
502*9880d681SAndroid Build Coastguard Worker  store i8 192, i8* %X3
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Worker  %X = getelementptr i8, i8* %p, i32 4
505*9880d681SAndroid Build Coastguard Worker  %Y = load i8, i8* %X
506*9880d681SAndroid Build Coastguard Worker  br label %loop
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Workerloop:
509*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [4, %entry], [192, %loop]
510*9880d681SAndroid Build Coastguard Worker  %X2 = getelementptr i8, i8* %p, i32 %i
511*9880d681SAndroid Build Coastguard Worker  %Y2 = load i8, i8* %X2
512*9880d681SAndroid Build Coastguard Worker
513*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
514*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: %Y2 = phi i8 [ %Y, %entry ], [ 0, %loop ]
515*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load i8
516*9880d681SAndroid Build Coastguard Worker
517*9880d681SAndroid Build Coastguard Worker  %cond = call i1 @cond2()
518*9880d681SAndroid Build Coastguard Worker
519*9880d681SAndroid Build Coastguard Worker  %Z = bitcast i8 *%X3 to i32*
520*9880d681SAndroid Build Coastguard Worker  store i32 0, i32* %Z
521*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %loop, label %out
522*9880d681SAndroid Build Coastguard Worker
523*9880d681SAndroid Build Coastguard Workerout:
524*9880d681SAndroid Build Coastguard Worker  %R = add i8 %Y, %Y2
525*9880d681SAndroid Build Coastguard Worker  ret i8 %R
526*9880d681SAndroid Build Coastguard Worker}
527*9880d681SAndroid Build Coastguard Worker
528*9880d681SAndroid Build Coastguard Workerdefine i8 @phi_trans5(i8* %p) {
529*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @phi_trans5(
530*9880d681SAndroid Build Coastguard Workerentry:
531*9880d681SAndroid Build Coastguard Worker
532*9880d681SAndroid Build Coastguard Worker  %X4 = getelementptr i8, i8* %p, i32 2
533*9880d681SAndroid Build Coastguard Worker  store i8 19, i8* %X4
534*9880d681SAndroid Build Coastguard Worker
535*9880d681SAndroid Build Coastguard Worker  %X = getelementptr i8, i8* %p, i32 4
536*9880d681SAndroid Build Coastguard Worker  %Y = load i8, i8* %X
537*9880d681SAndroid Build Coastguard Worker  br label %loop
538*9880d681SAndroid Build Coastguard Worker
539*9880d681SAndroid Build Coastguard Workerloop:
540*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [4, %entry], [3, %cont]
541*9880d681SAndroid Build Coastguard Worker  %X2 = getelementptr i8, i8* %p, i32 %i
542*9880d681SAndroid Build Coastguard Worker  %Y2 = load i8, i8* %X2  ; Ensure this load is not being incorrectly replaced.
543*9880d681SAndroid Build Coastguard Worker  %cond = call i1 @cond2()
544*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %cont, label %out
545*9880d681SAndroid Build Coastguard Worker
546*9880d681SAndroid Build Coastguard Workercont:
547*9880d681SAndroid Build Coastguard Worker  %Z = getelementptr i8, i8* %X2, i32 -1
548*9880d681SAndroid Build Coastguard Worker  %Z2 = bitcast i8 *%Z to i32*
549*9880d681SAndroid Build Coastguard Worker  store i32 50462976, i32* %Z2  ;; (1 << 8) | (2 << 16) | (3 << 24)
550*9880d681SAndroid Build Coastguard Worker
551*9880d681SAndroid Build Coastguard Worker
552*9880d681SAndroid Build Coastguard Worker; CHECK: store i32
553*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: getelementptr i8, i8* %p, i32 3
554*9880d681SAndroid Build Coastguard Worker; CHECK-NEXT: load i8, i8*
555*9880d681SAndroid Build Coastguard Worker  br label %loop
556*9880d681SAndroid Build Coastguard Worker
557*9880d681SAndroid Build Coastguard Workerout:
558*9880d681SAndroid Build Coastguard Worker  %R = add i8 %Y, %Y2
559*9880d681SAndroid Build Coastguard Worker  ret i8 %R
560*9880d681SAndroid Build Coastguard Worker}
561*9880d681SAndroid Build Coastguard Worker
562*9880d681SAndroid Build Coastguard Worker
563*9880d681SAndroid Build Coastguard Worker; PR6642
564*9880d681SAndroid Build Coastguard Workerdefine i32 @memset_to_load() nounwind readnone {
565*9880d681SAndroid Build Coastguard Workerentry:
566*9880d681SAndroid Build Coastguard Worker  %x = alloca [256 x i32], align 4                ; <[256 x i32]*> [#uses=2]
567*9880d681SAndroid Build Coastguard Worker  %tmp = bitcast [256 x i32]* %x to i8*           ; <i8*> [#uses=1]
568*9880d681SAndroid Build Coastguard Worker  call void @llvm.memset.p0i8.i64(i8* %tmp, i8 0, i64 1024, i32 4, i1 false)
569*9880d681SAndroid Build Coastguard Worker  %arraydecay = getelementptr inbounds [256 x i32], [256 x i32]* %x, i32 0, i32 0 ; <i32*>
570*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i32, i32* %arraydecay                   ; <i32> [#uses=1]
571*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp1
572*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @memset_to_load(
573*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32 0
574*9880d681SAndroid Build Coastguard Worker}
575*9880d681SAndroid Build Coastguard Worker
576*9880d681SAndroid Build Coastguard Worker
577*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
578*9880d681SAndroid Build Coastguard Worker;; Load -> Load forwarding in partial alias case.
579*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
580*9880d681SAndroid Build Coastguard Worker
581*9880d681SAndroid Build Coastguard Workerdefine i32 @load_load_partial_alias(i8* %P) nounwind ssp {
582*9880d681SAndroid Build Coastguard Workerentry:
583*9880d681SAndroid Build Coastguard Worker  %0 = bitcast i8* %P to i32*
584*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i32, i32* %0
585*9880d681SAndroid Build Coastguard Worker  %add.ptr = getelementptr inbounds i8, i8* %P, i64 1
586*9880d681SAndroid Build Coastguard Worker  %tmp5 = load i8, i8* %add.ptr
587*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %tmp5 to i32
588*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %tmp2, %conv
589*9880d681SAndroid Build Coastguard Worker  ret i32 %add
590*9880d681SAndroid Build Coastguard Worker
591*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-LABEL: @load_load_partial_alias(
592*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: load i32, i32*
593*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-NOT: load
594*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: lshr i32 {{.*}}, 8
595*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-NOT: load
596*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: trunc i32 {{.*}} to i8
597*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED-NOT: load
598*9880d681SAndroid Build Coastguard Worker; TEMPORARILYDISABLED: ret i32
599*9880d681SAndroid Build Coastguard Worker}
600*9880d681SAndroid Build Coastguard Worker
601*9880d681SAndroid Build Coastguard Worker
602*9880d681SAndroid Build Coastguard Worker; Cross block partial alias case.
603*9880d681SAndroid Build Coastguard Workerdefine i32 @load_load_partial_alias_cross_block(i8* %P) nounwind ssp {
604*9880d681SAndroid Build Coastguard Workerentry:
605*9880d681SAndroid Build Coastguard Worker  %xx = bitcast i8* %P to i32*
606*9880d681SAndroid Build Coastguard Worker  %x1 = load i32, i32* %xx, align 4
607*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %x1, 127
608*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %land.lhs.true, label %if.end
609*9880d681SAndroid Build Coastguard Worker
610*9880d681SAndroid Build Coastguard Workerland.lhs.true:                                    ; preds = %entry
611*9880d681SAndroid Build Coastguard Worker  %arrayidx4 = getelementptr inbounds i8, i8* %P, i64 1
612*9880d681SAndroid Build Coastguard Worker  %tmp5 = load i8, i8* %arrayidx4, align 1
613*9880d681SAndroid Build Coastguard Worker  %conv6 = zext i8 %tmp5 to i32
614*9880d681SAndroid Build Coastguard Worker  ret i32 %conv6
615*9880d681SAndroid Build Coastguard Worker
616*9880d681SAndroid Build Coastguard Workerif.end:
617*9880d681SAndroid Build Coastguard Worker  ret i32 52
618*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED-LABEL: @load_load_partial_alias_cross_block(
619*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED: land.lhs.true:
620*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED-NOT: load i8
621*9880d681SAndroid Build Coastguard Worker; TEMPORARILY_DISABLED: ret i32 %conv6
622*9880d681SAndroid Build Coastguard Worker}
623*9880d681SAndroid Build Coastguard Worker
624*9880d681SAndroid Build Coastguard Worker
625*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
626*9880d681SAndroid Build Coastguard Worker;; Load Widening
627*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
628*9880d681SAndroid Build Coastguard Worker
629*9880d681SAndroid Build Coastguard Worker%widening1 = type { i32, i8, i8, i8, i8 }
630*9880d681SAndroid Build Coastguard Worker
631*9880d681SAndroid Build Coastguard Worker@f = global %widening1 zeroinitializer, align 4
632*9880d681SAndroid Build Coastguard Worker
633*9880d681SAndroid Build Coastguard Workerdefine i32 @test_widening1(i8* %P) nounwind ssp noredzone {
634*9880d681SAndroid Build Coastguard Workerentry:
635*9880d681SAndroid Build Coastguard Worker  %tmp = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 1), align 4
636*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %tmp to i32
637*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 2), align 1
638*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i8 %tmp1 to i32
639*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %conv, %conv2
640*9880d681SAndroid Build Coastguard Worker  ret i32 %add
641*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_widening1(
642*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
643*9880d681SAndroid Build Coastguard Worker; CHECK: load i16, i16*
644*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
645*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
646*9880d681SAndroid Build Coastguard Worker}
647*9880d681SAndroid Build Coastguard Worker
648*9880d681SAndroid Build Coastguard Workerdefine i32 @test_widening2() nounwind ssp noredzone {
649*9880d681SAndroid Build Coastguard Workerentry:
650*9880d681SAndroid Build Coastguard Worker  %tmp = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 1), align 4
651*9880d681SAndroid Build Coastguard Worker  %conv = zext i8 %tmp to i32
652*9880d681SAndroid Build Coastguard Worker  %tmp1 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 2), align 1
653*9880d681SAndroid Build Coastguard Worker  %conv2 = zext i8 %tmp1 to i32
654*9880d681SAndroid Build Coastguard Worker  %add = add nsw i32 %conv, %conv2
655*9880d681SAndroid Build Coastguard Worker
656*9880d681SAndroid Build Coastguard Worker  %tmp2 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 3), align 2
657*9880d681SAndroid Build Coastguard Worker  %conv3 = zext i8 %tmp2 to i32
658*9880d681SAndroid Build Coastguard Worker  %add2 = add nsw i32 %add, %conv3
659*9880d681SAndroid Build Coastguard Worker
660*9880d681SAndroid Build Coastguard Worker  %tmp3 = load i8, i8* getelementptr inbounds (%widening1, %widening1* @f, i64 0, i32 4), align 1
661*9880d681SAndroid Build Coastguard Worker  %conv4 = zext i8 %tmp3 to i32
662*9880d681SAndroid Build Coastguard Worker  %add3 = add nsw i32 %add2, %conv3
663*9880d681SAndroid Build Coastguard Worker
664*9880d681SAndroid Build Coastguard Worker  ret i32 %add3
665*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @test_widening2(
666*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
667*9880d681SAndroid Build Coastguard Worker; CHECK: load i32, i32*
668*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: load
669*9880d681SAndroid Build Coastguard Worker; CHECK: ret i32
670*9880d681SAndroid Build Coastguard Worker}
671*9880d681SAndroid Build Coastguard Worker
672*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memset.p0i8.i64(i8* nocapture, i8, i64, i32, i1) nounwind
673*9880d681SAndroid Build Coastguard Worker
674*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p0i8.i64(i8* nocapture, i8* nocapture, i64, i32, i1) nounwind
675*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.memcpy.p0i8.p1i8.i64(i8* nocapture, i8 addrspace(1)* nocapture, i64, i32, i1) nounwind
676*9880d681SAndroid Build Coastguard Worker
677*9880d681SAndroid Build Coastguard Worker
678*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
679*9880d681SAndroid Build Coastguard Worker;; Load -> Store dependency which isn't interfered with by a call that happens
680*9880d681SAndroid Build Coastguard Worker;; before the pointer was captured.
681*9880d681SAndroid Build Coastguard Worker;;===----------------------------------------------------------------------===;;
682*9880d681SAndroid Build Coastguard Worker
683*9880d681SAndroid Build Coastguard Worker%class.X = type { [8 x i8] }
684*9880d681SAndroid Build Coastguard Worker
685*9880d681SAndroid Build Coastguard Worker@_ZTV1X = weak_odr constant [5 x i8*] zeroinitializer
686*9880d681SAndroid Build Coastguard Worker@_ZTV1Y = weak_odr constant [5 x i8*] zeroinitializer
687*9880d681SAndroid Build Coastguard Worker
688*9880d681SAndroid Build Coastguard Workerdeclare void @use()
689*9880d681SAndroid Build Coastguard Workerdeclare void @use3(i8***, i8**)
690*9880d681SAndroid Build Coastguard Worker
691*9880d681SAndroid Build Coastguard Worker; PR8908
692*9880d681SAndroid Build Coastguard Workerdefine void @test_escape1() nounwind {
693*9880d681SAndroid Build Coastguard Worker  %x = alloca i8**, align 8
694*9880d681SAndroid Build Coastguard Worker  store i8** getelementptr inbounds ([5 x i8*], [5 x i8*]* @_ZTV1X, i64 0, i64 2), i8*** %x, align 8
695*9880d681SAndroid Build Coastguard Worker  call void @use() nounwind
696*9880d681SAndroid Build Coastguard Worker  %DEAD = load i8**, i8*** %x, align 8
697*9880d681SAndroid Build Coastguard Worker  call void @use3(i8*** %x, i8** %DEAD) nounwind
698*9880d681SAndroid Build Coastguard Worker  ret void
699*9880d681SAndroid Build Coastguard Worker; CHECK: test_escape1
700*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: DEAD
701*9880d681SAndroid Build Coastguard Worker; CHECK: ret
702*9880d681SAndroid Build Coastguard Worker}
703