xref: /aosp_15_r20/external/llvm/test/Analysis/BasicAA/zext.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt < %s -basicaa -aa-eval -print-all-alias-modref-info -disable-output 2>&1 | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-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-n8:16:32:64-S128"
3*9880d681SAndroid Build Coastguard Workertarget triple = "x86_64-unknown-linux-gnu"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_zext
6*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: i8* %a, i8* %b
7*9880d681SAndroid Build Coastguard Worker
8*9880d681SAndroid Build Coastguard Workerdefine void @test_with_zext() {
9*9880d681SAndroid Build Coastguard Worker  %1 = tail call i8* @malloc(i64 120)
10*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds i8, i8* %1, i64 8
11*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds i8, i8* %1, i64 16
12*9880d681SAndroid Build Coastguard Worker  %3 = zext i32 3 to i64
13*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8* %2, i64 %3
14*9880d681SAndroid Build Coastguard Worker  ret void
15*9880d681SAndroid Build Coastguard Worker}
16*9880d681SAndroid Build Coastguard Worker
17*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_lshr
18*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: i8* %a, i8* %b
19*9880d681SAndroid Build Coastguard Worker
20*9880d681SAndroid Build Coastguard Workerdefine void @test_with_lshr(i64 %i) {
21*9880d681SAndroid Build Coastguard Worker  %1 = tail call i8* @malloc(i64 120)
22*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds i8, i8* %1, i64 8
23*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds i8, i8* %1, i64 16
24*9880d681SAndroid Build Coastguard Worker  %3 = lshr i64 %i, 2
25*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8* %2, i64 %3
26*9880d681SAndroid Build Coastguard Worker  ret void
27*9880d681SAndroid Build Coastguard Worker}
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_a_loop
30*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: i8* %a, i8* %b
31*9880d681SAndroid Build Coastguard Worker
32*9880d681SAndroid Build Coastguard Workerdefine void @test_with_a_loop(i8* %mem) {
33*9880d681SAndroid Build Coastguard Worker  br label %for.loop
34*9880d681SAndroid Build Coastguard Worker
35*9880d681SAndroid Build Coastguard Workerfor.loop:
36*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ]
37*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds i8, i8* %mem, i64 8
38*9880d681SAndroid Build Coastguard Worker  %a.plus1 = getelementptr inbounds i8, i8* %mem, i64 16
39*9880d681SAndroid Build Coastguard Worker  %i.64 = zext i32 %i to i64
40*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8* %a.plus1, i64 %i.64
41*9880d681SAndroid Build Coastguard Worker  %i.plus1 = add nuw nsw i32 %i, 1
42*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %i.plus1, 10
43*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.loop.exit, label %for.loop
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Workerfor.loop.exit:
46*9880d681SAndroid Build Coastguard Worker  ret void
47*9880d681SAndroid Build Coastguard Worker}
48*9880d681SAndroid Build Coastguard Worker
49*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_with_varying_base_pointer_in_loop
50*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: i8* %a, i8* %b
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerdefine void @test_with_varying_base_pointer_in_loop(i8* %mem.orig) {
53*9880d681SAndroid Build Coastguard Worker  br label %for.loop
54*9880d681SAndroid Build Coastguard Worker
55*9880d681SAndroid Build Coastguard Workerfor.loop:
56*9880d681SAndroid Build Coastguard Worker  %mem = phi i8* [ %mem.orig, %0 ], [ %mem.plus1, %for.loop ]
57*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ]
58*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds i8, i8* %mem, i64 8
59*9880d681SAndroid Build Coastguard Worker  %a.plus1 = getelementptr inbounds i8, i8* %mem, i64 16
60*9880d681SAndroid Build Coastguard Worker  %i.64 = zext i32 %i to i64
61*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8* %a.plus1, i64 %i.64
62*9880d681SAndroid Build Coastguard Worker  %i.plus1 = add nuw nsw i32 %i, 1
63*9880d681SAndroid Build Coastguard Worker  %mem.plus1 = getelementptr inbounds i8, i8* %mem, i64 8
64*9880d681SAndroid Build Coastguard Worker  %cmp = icmp eq i32 %i.plus1, 10
65*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.loop.exit, label %for.loop
66*9880d681SAndroid Build Coastguard Worker
67*9880d681SAndroid Build Coastguard Workerfor.loop.exit:
68*9880d681SAndroid Build Coastguard Worker  ret void
69*9880d681SAndroid Build Coastguard Worker}
70*9880d681SAndroid Build Coastguard Worker
71*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_sign_extension
72*9880d681SAndroid Build Coastguard Worker; CHECK:  PartialAlias: i64* %b.i64, i8* %a
73*9880d681SAndroid Build Coastguard Worker
74*9880d681SAndroid Build Coastguard Workerdefine void @test_sign_extension(i32 %p) {
75*9880d681SAndroid Build Coastguard Worker  %1 = tail call i8* @malloc(i64 120)
76*9880d681SAndroid Build Coastguard Worker  %p.64 = zext i32 %p to i64
77*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds i8, i8* %1, i64 %p.64
78*9880d681SAndroid Build Coastguard Worker  %p.minus1 = add i32 %p, -1
79*9880d681SAndroid Build Coastguard Worker  %p.minus1.64 = zext i32 %p.minus1 to i64
80*9880d681SAndroid Build Coastguard Worker  %b.i8 = getelementptr inbounds i8, i8* %1, i64 %p.minus1.64
81*9880d681SAndroid Build Coastguard Worker  %b.i64 = bitcast i8* %b.i8 to i64*
82*9880d681SAndroid Build Coastguard Worker  ret void
83*9880d681SAndroid Build Coastguard Worker}
84*9880d681SAndroid Build Coastguard Worker
85*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_fe_tools
86*9880d681SAndroid Build Coastguard Worker; CHECK:  PartialAlias: i32* %a, i32* %b
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Workerdefine void @test_fe_tools([8 x i32]* %values) {
89*9880d681SAndroid Build Coastguard Worker  br label %reorder
90*9880d681SAndroid Build Coastguard Worker
91*9880d681SAndroid Build Coastguard Workerfor.loop:
92*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ 0, %reorder ], [ %i.next, %for.loop ]
93*9880d681SAndroid Build Coastguard Worker  %idxprom = zext i32 %i to i64
94*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds [8 x i32], [8 x i32]* %values, i64 0, i64 %idxprom
95*9880d681SAndroid Build Coastguard Worker  %i.next = add nuw nsw i32 %i, 1
96*9880d681SAndroid Build Coastguard Worker  %1 = icmp eq i32 %i.next, 10
97*9880d681SAndroid Build Coastguard Worker  br i1 %1, label %for.loop.exit, label %for.loop
98*9880d681SAndroid Build Coastguard Worker
99*9880d681SAndroid Build Coastguard Workerreorder:
100*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds [8 x i32], [8 x i32]* %values, i64 0, i64 1
101*9880d681SAndroid Build Coastguard Worker  br label %for.loop
102*9880d681SAndroid Build Coastguard Worker
103*9880d681SAndroid Build Coastguard Workerfor.loop.exit:
104*9880d681SAndroid Build Coastguard Worker  ret void
105*9880d681SAndroid Build Coastguard Worker}
106*9880d681SAndroid Build Coastguard Worker
107*9880d681SAndroid Build Coastguard Worker@b = global i32 0, align 4
108*9880d681SAndroid Build Coastguard Worker@d = global i32 0, align 4
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_spec2006
111*9880d681SAndroid Build Coastguard Worker; CHECK:  PartialAlias: i32** %x, i32** %y
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Workerdefine void @test_spec2006() {
114*9880d681SAndroid Build Coastguard Worker  %h = alloca [1 x [2 x i32*]], align 16
115*9880d681SAndroid Build Coastguard Worker  %d.val = load i32, i32* @d, align 4
116*9880d681SAndroid Build Coastguard Worker  %d.promoted = sext i32 %d.val to i64
117*9880d681SAndroid Build Coastguard Worker  %1 = icmp slt i32 %d.val, 2
118*9880d681SAndroid Build Coastguard Worker  br i1 %1, label %.lr.ph, label %3
119*9880d681SAndroid Build Coastguard Worker
120*9880d681SAndroid Build Coastguard Worker.lr.ph:                                           ; preds = %0
121*9880d681SAndroid Build Coastguard Worker  br label %2
122*9880d681SAndroid Build Coastguard Worker
123*9880d681SAndroid Build Coastguard Worker; <label>:2                                       ; preds = %.lr.ph, %2
124*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ %d.val, %.lr.ph ], [ %i.plus1, %2 ]
125*9880d681SAndroid Build Coastguard Worker  %i.promoted = sext i32 %i to i64
126*9880d681SAndroid Build Coastguard Worker  %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %d.promoted, i64 %i.promoted
127*9880d681SAndroid Build Coastguard Worker  %i.plus1 = add nsw i32 %i, 1
128*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %i.plus1, 2
129*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %2, label %3
130*9880d681SAndroid Build Coastguard Worker
131*9880d681SAndroid Build Coastguard Worker; <label>:3                                      ; preds = %._crit_edge, %0
132*9880d681SAndroid Build Coastguard Worker  %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
133*9880d681SAndroid Build Coastguard Worker  ret void
134*9880d681SAndroid Build Coastguard Worker}
135*9880d681SAndroid Build Coastguard Worker
136*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_modulo_analysis_easy_case
137*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: i32** %x, i32** %y
138*9880d681SAndroid Build Coastguard Worker
139*9880d681SAndroid Build Coastguard Workerdefine void @test_modulo_analysis_easy_case(i64 %i) {
140*9880d681SAndroid Build Coastguard Worker  %h = alloca [1 x [2 x i32*]], align 16
141*9880d681SAndroid Build Coastguard Worker  %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i, i64 0
142*9880d681SAndroid Build Coastguard Worker  %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
143*9880d681SAndroid Build Coastguard Worker  ret void
144*9880d681SAndroid Build Coastguard Worker}
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_modulo_analysis_in_loop
147*9880d681SAndroid Build Coastguard Worker; CHECK:  NoAlias: i32** %x, i32** %y
148*9880d681SAndroid Build Coastguard Worker
149*9880d681SAndroid Build Coastguard Workerdefine void @test_modulo_analysis_in_loop() {
150*9880d681SAndroid Build Coastguard Worker  %h = alloca [1 x [2 x i32*]], align 16
151*9880d681SAndroid Build Coastguard Worker  br label %for.loop
152*9880d681SAndroid Build Coastguard Worker
153*9880d681SAndroid Build Coastguard Workerfor.loop:
154*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ]
155*9880d681SAndroid Build Coastguard Worker  %i.promoted = sext i32 %i to i64
156*9880d681SAndroid Build Coastguard Worker  %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 0
157*9880d681SAndroid Build Coastguard Worker  %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
158*9880d681SAndroid Build Coastguard Worker  %i.plus1 = add nsw i32 %i, 1
159*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %i.plus1, 2
160*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.loop, label %for.loop.exit
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerfor.loop.exit:
163*9880d681SAndroid Build Coastguard Worker  ret void
164*9880d681SAndroid Build Coastguard Worker}
165*9880d681SAndroid Build Coastguard Worker
166*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_modulo_analysis_with_global
167*9880d681SAndroid Build Coastguard Worker; CHECK:  PartialAlias: i32** %x, i32** %y
168*9880d681SAndroid Build Coastguard Worker
169*9880d681SAndroid Build Coastguard Workerdefine void @test_modulo_analysis_with_global() {
170*9880d681SAndroid Build Coastguard Worker  %h = alloca [1 x [2 x i32*]], align 16
171*9880d681SAndroid Build Coastguard Worker  %b = load i32, i32* @b, align 4
172*9880d681SAndroid Build Coastguard Worker  %b.promoted = sext i32 %b to i64
173*9880d681SAndroid Build Coastguard Worker  br label %for.loop
174*9880d681SAndroid Build Coastguard Worker
175*9880d681SAndroid Build Coastguard Workerfor.loop:
176*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ 0, %0 ], [ %i.plus1, %for.loop ]
177*9880d681SAndroid Build Coastguard Worker  %i.promoted = sext i32 %i to i64
178*9880d681SAndroid Build Coastguard Worker  %x = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 %i.promoted, i64 %b.promoted
179*9880d681SAndroid Build Coastguard Worker  %y = getelementptr inbounds [1 x [2 x i32*]], [1 x [2 x i32*]]* %h, i64 0, i64 0, i64 1
180*9880d681SAndroid Build Coastguard Worker  %i.plus1 = add nsw i32 %i, 1
181*9880d681SAndroid Build Coastguard Worker  %cmp = icmp slt i32 %i.plus1, 2
182*9880d681SAndroid Build Coastguard Worker  br i1 %cmp, label %for.loop, label %for.loop.exit
183*9880d681SAndroid Build Coastguard Worker
184*9880d681SAndroid Build Coastguard Workerfor.loop.exit:
185*9880d681SAndroid Build Coastguard Worker  ret void
186*9880d681SAndroid Build Coastguard Worker}
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_const_eval
189*9880d681SAndroid Build Coastguard Worker; CHECK: NoAlias: i8* %a, i8* %b
190*9880d681SAndroid Build Coastguard Workerdefine void @test_const_eval(i8* %ptr, i64 %offset) {
191*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds i8, i8* %ptr, i64 %offset
192*9880d681SAndroid Build Coastguard Worker  %a.dup = getelementptr inbounds i8, i8* %ptr, i64 %offset
193*9880d681SAndroid Build Coastguard Worker  %three = zext i32 3 to i64
194*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8* %a.dup, i64 %three
195*9880d681SAndroid Build Coastguard Worker  ret void
196*9880d681SAndroid Build Coastguard Worker}
197*9880d681SAndroid Build Coastguard Worker
198*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: test_const_eval_scaled
199*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias: i8* %a, i8* %b
200*9880d681SAndroid Build Coastguard Workerdefine void @test_const_eval_scaled(i8* %ptr) {
201*9880d681SAndroid Build Coastguard Worker  %three = zext i32 3 to i64
202*9880d681SAndroid Build Coastguard Worker  %six = mul i64 %three, 2
203*9880d681SAndroid Build Coastguard Worker  %a = getelementptr inbounds i8, i8* %ptr, i64 %six
204*9880d681SAndroid Build Coastguard Worker  %b = getelementptr inbounds i8, i8* %ptr, i64 6
205*9880d681SAndroid Build Coastguard Worker  ret void
206*9880d681SAndroid Build Coastguard Worker}
207*9880d681SAndroid Build Coastguard Worker
208*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: Function: foo
209*9880d681SAndroid Build Coastguard Worker; CHECK: MustAlias:    float* %arrayidx, float* %arrayidx4.84
210*9880d681SAndroid Build Coastguard Workerdefine float @foo(i32 *%A, float %rend, float** %wayar)  {
211*9880d681SAndroid Build Coastguard Workerentry:
212*9880d681SAndroid Build Coastguard Worker  %x0 = load i32, i32* %A, align 4
213*9880d681SAndroid Build Coastguard Worker  %conv = sext i32 %x0 to i64
214*9880d681SAndroid Build Coastguard Worker  %mul = shl nsw i64 %conv, 3
215*9880d681SAndroid Build Coastguard Worker  %call = tail call i8* @malloc(i64 %mul)
216*9880d681SAndroid Build Coastguard Worker  %x1 = bitcast i8* %call to float*
217*9880d681SAndroid Build Coastguard Worker
218*9880d681SAndroid Build Coastguard Worker  %sub = add nsw i32 %x0, -1
219*9880d681SAndroid Build Coastguard Worker  %idxprom = sext i32 %sub to i64
220*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr inbounds float, float* %x1, i64 %idxprom
221*9880d681SAndroid Build Coastguard Worker  store float %rend, float* %arrayidx, align 8
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker  %indvars.iv76.83 = add nsw i64 %conv, -1
224*9880d681SAndroid Build Coastguard Worker  %arrayidx4.84 = getelementptr inbounds float, float* %x1, i64 %indvars.iv76.83
225*9880d681SAndroid Build Coastguard Worker  %x4 = load float, float* %arrayidx4.84, align 8
226*9880d681SAndroid Build Coastguard Worker
227*9880d681SAndroid Build Coastguard Worker  ret float %x4
228*9880d681SAndroid Build Coastguard Worker}
229*9880d681SAndroid Build Coastguard Worker
230*9880d681SAndroid Build Coastguard Worker; Function Attrs: nounwind
231*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @malloc(i64)
232