xref: /aosp_15_r20/external/llvm/test/Transforms/InstSimplify/noalias-ptr.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -instsimplify -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-m:e-i64:64-f80: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@g1 = global i32 0, align 4
6*9880d681SAndroid Build Coastguard Worker@g2 = internal global i32 0, align 4
7*9880d681SAndroid Build Coastguard Worker@g3 = unnamed_addr global i32 0, align 4
8*9880d681SAndroid Build Coastguard Worker@g4 = hidden global i32 0, align 4
9*9880d681SAndroid Build Coastguard Worker@g5 = protected global i32 0, align 4
10*9880d681SAndroid Build Coastguard Worker@g6 = thread_local unnamed_addr global i32 0, align 4
11*9880d681SAndroid Build Coastguard Worker
12*9880d681SAndroid Build Coastguard Worker; Make sure we can simplify away a pointer comparison between
13*9880d681SAndroid Build Coastguard Worker; dynamically-allocated memory and a local stack allocation.
14*9880d681SAndroid Build Coastguard Worker;   void p()
15*9880d681SAndroid Build Coastguard Worker;   {
16*9880d681SAndroid Build Coastguard Worker;     int *mData;
17*9880d681SAndroid Build Coastguard Worker;     int mStackData[10];
18*9880d681SAndroid Build Coastguard Worker;     mData = new int[12];
19*9880d681SAndroid Build Coastguard Worker;     if (mData != mStackData) {
20*9880d681SAndroid Build Coastguard Worker;       delete[] mData;
21*9880d681SAndroid Build Coastguard Worker;     }
22*9880d681SAndroid Build Coastguard Worker;   }
23*9880d681SAndroid Build Coastguard Worker
24*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p1v() #0 {
25*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
26*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
27*9880d681SAndroid Build Coastguard Worker  %2 = tail call noalias i8* @_Znam(i64 48) #4
28*9880d681SAndroid Build Coastguard Worker  %3 = bitcast i8* %2 to i32*
29*9880d681SAndroid Build Coastguard Worker  %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
30*9880d681SAndroid Build Coastguard Worker  %5 = icmp eq i32* %3, %4
31*9880d681SAndroid Build Coastguard Worker  br i1 %5, label %7, label %6
32*9880d681SAndroid Build Coastguard Worker
33*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p1v
34*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
35*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
36*9880d681SAndroid Build Coastguard Worker
37*9880d681SAndroid Build Coastguard Worker; <label>:6                                       ; preds = %0
38*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %2) #5
39*9880d681SAndroid Build Coastguard Worker  br label %7
40*9880d681SAndroid Build Coastguard Worker
41*9880d681SAndroid Build Coastguard Worker; <label>:7                                       ; preds = %0, %6
42*9880d681SAndroid Build Coastguard Worker  ret void
43*9880d681SAndroid Build Coastguard Worker}
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; Also check a more-complicated case with multiple underlying objects.
46*9880d681SAndroid Build Coastguard Worker
47*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p2bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
48*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
49*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
50*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
51*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %b1, i32* %2, i32* @g2
52*9880d681SAndroid Build Coastguard Worker  %4 = tail call noalias i8* @_Znam(i64 48) #4
53*9880d681SAndroid Build Coastguard Worker  %5 = tail call noalias i8* @_Znam(i64 48) #4
54*9880d681SAndroid Build Coastguard Worker  %.v = select i1 %b2, i8* %4, i8* %5
55*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i8* %.v to i32*
56*9880d681SAndroid Build Coastguard Worker  %7 = icmp eq i32* %6, %3
57*9880d681SAndroid Build Coastguard Worker  br i1 %7, label %9, label %8
58*9880d681SAndroid Build Coastguard Worker
59*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p2bb
60*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
61*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
62*9880d681SAndroid Build Coastguard Worker
63*9880d681SAndroid Build Coastguard Worker; <label>:8                                       ; preds = %0
64*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %4) #5
65*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %5) #5
66*9880d681SAndroid Build Coastguard Worker  br label %9
67*9880d681SAndroid Build Coastguard Worker
68*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %0, %8
69*9880d681SAndroid Build Coastguard Worker  ret void
70*9880d681SAndroid Build Coastguard Worker}
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p4bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
73*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
74*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
75*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
76*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %b1, i32* %2, i32* @g3
77*9880d681SAndroid Build Coastguard Worker  %4 = tail call noalias i8* @_Znam(i64 48) #4
78*9880d681SAndroid Build Coastguard Worker  %5 = tail call noalias i8* @_Znam(i64 48) #4
79*9880d681SAndroid Build Coastguard Worker  %.v = select i1 %b2, i8* %4, i8* %5
80*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i8* %.v to i32*
81*9880d681SAndroid Build Coastguard Worker  %7 = icmp eq i32* %6, %3
82*9880d681SAndroid Build Coastguard Worker  br i1 %7, label %9, label %8
83*9880d681SAndroid Build Coastguard Worker
84*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p4bb
85*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
86*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; <label>:8                                       ; preds = %0
89*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %4) #5
90*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %5) #5
91*9880d681SAndroid Build Coastguard Worker  br label %9
92*9880d681SAndroid Build Coastguard Worker
93*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %0, %8
94*9880d681SAndroid Build Coastguard Worker  ret void
95*9880d681SAndroid Build Coastguard Worker}
96*9880d681SAndroid Build Coastguard Worker
97*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p5bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
98*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
99*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
100*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
101*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %b1, i32* %2, i32* @g4
102*9880d681SAndroid Build Coastguard Worker  %4 = tail call noalias i8* @_Znam(i64 48) #4
103*9880d681SAndroid Build Coastguard Worker  %5 = tail call noalias i8* @_Znam(i64 48) #4
104*9880d681SAndroid Build Coastguard Worker  %.v = select i1 %b2, i8* %4, i8* %5
105*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i8* %.v to i32*
106*9880d681SAndroid Build Coastguard Worker  %7 = icmp eq i32* %6, %3
107*9880d681SAndroid Build Coastguard Worker  br i1 %7, label %9, label %8
108*9880d681SAndroid Build Coastguard Worker
109*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p5bb
110*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
111*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; <label>:8                                       ; preds = %0
114*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %4) #5
115*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %5) #5
116*9880d681SAndroid Build Coastguard Worker  br label %9
117*9880d681SAndroid Build Coastguard Worker
118*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %0, %8
119*9880d681SAndroid Build Coastguard Worker  ret void
120*9880d681SAndroid Build Coastguard Worker}
121*9880d681SAndroid Build Coastguard Worker
122*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p6bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
123*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
124*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
125*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
126*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %b1, i32* %2, i32* @g5
127*9880d681SAndroid Build Coastguard Worker  %4 = tail call noalias i8* @_Znam(i64 48) #4
128*9880d681SAndroid Build Coastguard Worker  %5 = tail call noalias i8* @_Znam(i64 48) #4
129*9880d681SAndroid Build Coastguard Worker  %.v = select i1 %b2, i8* %4, i8* %5
130*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i8* %.v to i32*
131*9880d681SAndroid Build Coastguard Worker  %7 = icmp eq i32* %6, %3
132*9880d681SAndroid Build Coastguard Worker  br i1 %7, label %9, label %8
133*9880d681SAndroid Build Coastguard Worker
134*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p6bb
135*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
136*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
137*9880d681SAndroid Build Coastguard Worker
138*9880d681SAndroid Build Coastguard Worker; <label>:8                                       ; preds = %0
139*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %4) #5
140*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %5) #5
141*9880d681SAndroid Build Coastguard Worker  br label %9
142*9880d681SAndroid Build Coastguard Worker
143*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %0, %8
144*9880d681SAndroid Build Coastguard Worker  ret void
145*9880d681SAndroid Build Coastguard Worker}
146*9880d681SAndroid Build Coastguard Worker
147*9880d681SAndroid Build Coastguard Worker; Here's another case involving multiple underlying objects, but this time we
148*9880d681SAndroid Build Coastguard Worker; must keep the comparison (it might involve a regular pointer-typed function
149*9880d681SAndroid Build Coastguard Worker; argument).
150*9880d681SAndroid Build Coastguard Worker
151*9880d681SAndroid Build Coastguard Workerdefine void @_Z4nopebbPi(i1 zeroext %b1, i1 zeroext %b2, i32* readnone %q) #0 {
152*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
153*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
154*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
155*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %b1, i32* %2, i32* %q
156*9880d681SAndroid Build Coastguard Worker  %4 = tail call noalias i8* @_Znam(i64 48) #4
157*9880d681SAndroid Build Coastguard Worker  %5 = tail call noalias i8* @_Znam(i64 48) #4
158*9880d681SAndroid Build Coastguard Worker  %.v = select i1 %b2, i8* %4, i8* %5
159*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i8* %.v to i32*
160*9880d681SAndroid Build Coastguard Worker  %7 = icmp eq i32* %6, %3
161*9880d681SAndroid Build Coastguard Worker  br i1 %7, label %9, label %8
162*9880d681SAndroid Build Coastguard Worker
163*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z4nopebbPi
164*9880d681SAndroid Build Coastguard Worker; CHECK: icmp
165*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
166*9880d681SAndroid Build Coastguard Worker
167*9880d681SAndroid Build Coastguard Worker; <label>:8                                       ; preds = %0
168*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %4) #5
169*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %5) #5
170*9880d681SAndroid Build Coastguard Worker  br label %9
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %0, %8
173*9880d681SAndroid Build Coastguard Worker  ret void
174*9880d681SAndroid Build Coastguard Worker}
175*9880d681SAndroid Build Coastguard Worker
176*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p3bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
177*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
178*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
179*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
180*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %b1, i32* %2, i32* @g1
181*9880d681SAndroid Build Coastguard Worker  %4 = tail call noalias i8* @_Znam(i64 48) #4
182*9880d681SAndroid Build Coastguard Worker  %5 = tail call noalias i8* @_Znam(i64 48) #4
183*9880d681SAndroid Build Coastguard Worker  %.v = select i1 %b2, i8* %4, i8* %5
184*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i8* %.v to i32*
185*9880d681SAndroid Build Coastguard Worker  %7 = icmp eq i32* %6, %3
186*9880d681SAndroid Build Coastguard Worker  br i1 %7, label %9, label %8
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p3bb
189*9880d681SAndroid Build Coastguard Worker; CHECK: icmp
190*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Worker; <label>:8                                       ; preds = %0
193*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %4) #5
194*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %5) #5
195*9880d681SAndroid Build Coastguard Worker  br label %9
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %0, %8
198*9880d681SAndroid Build Coastguard Worker  ret void
199*9880d681SAndroid Build Coastguard Worker}
200*9880d681SAndroid Build Coastguard Worker
201*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p7bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
202*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], align 16
203*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
204*9880d681SAndroid Build Coastguard Worker  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
205*9880d681SAndroid Build Coastguard Worker  %3 = select i1 %b1, i32* %2, i32* @g6
206*9880d681SAndroid Build Coastguard Worker  %4 = tail call noalias i8* @_Znam(i64 48) #4
207*9880d681SAndroid Build Coastguard Worker  %5 = tail call noalias i8* @_Znam(i64 48) #4
208*9880d681SAndroid Build Coastguard Worker  %.v = select i1 %b2, i8* %4, i8* %5
209*9880d681SAndroid Build Coastguard Worker  %6 = bitcast i8* %.v to i32*
210*9880d681SAndroid Build Coastguard Worker  %7 = icmp eq i32* %6, %3
211*9880d681SAndroid Build Coastguard Worker  br i1 %7, label %9, label %8
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p7bb
214*9880d681SAndroid Build Coastguard Worker; CHECK: icmp
215*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
216*9880d681SAndroid Build Coastguard Worker
217*9880d681SAndroid Build Coastguard Worker; <label>:8                                       ; preds = %0
218*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %4) #5
219*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %5) #5
220*9880d681SAndroid Build Coastguard Worker  br label %9
221*9880d681SAndroid Build Coastguard Worker
222*9880d681SAndroid Build Coastguard Worker; <label>:9                                       ; preds = %0, %8
223*9880d681SAndroid Build Coastguard Worker  ret void
224*9880d681SAndroid Build Coastguard Worker}
225*9880d681SAndroid Build Coastguard Worker
226*9880d681SAndroid Build Coastguard Workerdefine void @_Z2p2v(i32 %c) #0 {
227*9880d681SAndroid Build Coastguard Worker  %mStackData = alloca [10 x i32], i32 %c, align 16
228*9880d681SAndroid Build Coastguard Worker  %1 = bitcast [10 x i32]* %mStackData to i8*
229*9880d681SAndroid Build Coastguard Worker  %2 = tail call noalias i8* @_Znam(i64 48) #4
230*9880d681SAndroid Build Coastguard Worker  %3 = bitcast i8* %2 to i32*
231*9880d681SAndroid Build Coastguard Worker  %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
232*9880d681SAndroid Build Coastguard Worker  %5 = icmp eq i32* %3, %4
233*9880d681SAndroid Build Coastguard Worker  br i1 %5, label %7, label %6
234*9880d681SAndroid Build Coastguard Worker
235*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_Z2p2v
236*9880d681SAndroid Build Coastguard Worker; CHECK: icmp
237*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
238*9880d681SAndroid Build Coastguard Worker
239*9880d681SAndroid Build Coastguard Worker; <label>:6                                       ; preds = %0
240*9880d681SAndroid Build Coastguard Worker  call void @_ZdaPv(i8* %2) #5
241*9880d681SAndroid Build Coastguard Worker  br label %7
242*9880d681SAndroid Build Coastguard Worker
243*9880d681SAndroid Build Coastguard Worker; <label>:7                                       ; preds = %0, %6
244*9880d681SAndroid Build Coastguard Worker  ret void
245*9880d681SAndroid Build Coastguard Worker}
246*9880d681SAndroid Build Coastguard Worker
247*9880d681SAndroid Build Coastguard Worker; Function Attrs: nobuiltin
248*9880d681SAndroid Build Coastguard Workerdeclare noalias i8* @_Znam(i64) #2
249*9880d681SAndroid Build Coastguard Worker
250*9880d681SAndroid Build Coastguard Worker; Function Attrs: nobuiltin nounwind
251*9880d681SAndroid Build Coastguard Workerdeclare void @_ZdaPv(i8*) #3
252*9880d681SAndroid Build Coastguard Worker
253*9880d681SAndroid Build Coastguard Workerattributes #0 = { uwtable }
254*9880d681SAndroid Build Coastguard Workerattributes #1 = { nounwind }
255*9880d681SAndroid Build Coastguard Workerattributes #2 = { nobuiltin }
256*9880d681SAndroid Build Coastguard Workerattributes #3 = { nobuiltin nounwind }
257*9880d681SAndroid Build Coastguard Workerattributes #4 = { builtin }
258*9880d681SAndroid Build Coastguard Workerattributes #5 = { builtin nounwind }
259*9880d681SAndroid Build Coastguard Worker
260