1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt -passes=instsimplify -S < %s | FileCheck %s
3target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
4target triple = "x86_64-unknown-linux-gnu"
5
6@g1 = global i32 0, align 4
7@g2 = internal global i32 0, align 4
8@g3 = unnamed_addr global i32 0, align 4
9@g4 = hidden global i32 0, align 4
10@g5 = protected global i32 0, align 4
11@g6 = thread_local unnamed_addr global i32 0, align 4
12
13; Make sure we can simplify away a pointer comparison between
14; dynamically-allocated memory and a local stack allocation.
15;   void p()
16;   {
17;     int *mData;
18;     int mStackData[10];
19;     mData = new int[12];
20;     if (mData != mStackData) {
21;       delete[] mData;
22;     }
23;   }
24
25define void @_Z2p1v() #0 {
26; CHECK-LABEL: @_Z2p1v(
27; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3:[0-9]+]]
28; CHECK-NEXT:    br i1 false, label [[TMP3:%.*]], label [[TMP2:%.*]]
29; CHECK:       2:
30; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4:[0-9]+]]
31; CHECK-NEXT:    br label [[TMP3]]
32; CHECK:       3:
33; CHECK-NEXT:    ret void
34;
35  %mStackData = alloca [10 x i32], align 16
36  %1 = bitcast [10 x i32]* %mStackData to i8*
37  %2 = tail call noalias i8* @_Znam(i64 48) #4
38  %3 = bitcast i8* %2 to i32*
39  %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
40  %5 = icmp eq i32* %3, %4
41  br i1 %5, label %7, label %6
42
43
44; <label>:6                                       ; preds = %0
45  call void @_ZdaPv(i8* %2) #5
46  br label %7
47
48; <label>:7                                       ; preds = %0, %6
49  ret void
50}
51
52; Also check a more-complicated case with multiple underlying objects.
53
54define void @_Z2p2bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
55; CHECK-LABEL: @_Z2p2bb(
56; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
57; CHECK-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
58; CHECK-NEXT:    br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]]
59; CHECK:       3:
60; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]]
61; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]]
62; CHECK-NEXT:    br label [[TMP4]]
63; CHECK:       4:
64; CHECK-NEXT:    ret void
65;
66  %mStackData = alloca [10 x i32], align 16
67  %1 = bitcast [10 x i32]* %mStackData to i8*
68  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
69  %3 = select i1 %b1, i32* %2, i32* @g2
70  %4 = tail call noalias i8* @_Znam(i64 48) #4
71  %5 = tail call noalias i8* @_Znam(i64 48) #4
72  %.v = select i1 %b2, i8* %4, i8* %5
73  %6 = bitcast i8* %.v to i32*
74  %7 = icmp eq i32* %6, %3
75  br i1 %7, label %9, label %8
76
77
78; <label>:8                                       ; preds = %0
79  call void @_ZdaPv(i8* %4) #5
80  call void @_ZdaPv(i8* %5) #5
81  br label %9
82
83; <label>:9                                       ; preds = %0, %8
84  ret void
85}
86
87define void @_Z2p4bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
88; CHECK-LABEL: @_Z2p4bb(
89; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
90; CHECK-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
91; CHECK-NEXT:    br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]]
92; CHECK:       3:
93; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]]
94; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]]
95; CHECK-NEXT:    br label [[TMP4]]
96; CHECK:       4:
97; CHECK-NEXT:    ret void
98;
99  %mStackData = alloca [10 x i32], align 16
100  %1 = bitcast [10 x i32]* %mStackData to i8*
101  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
102  %3 = select i1 %b1, i32* %2, i32* @g3
103  %4 = tail call noalias i8* @_Znam(i64 48) #4
104  %5 = tail call noalias i8* @_Znam(i64 48) #4
105  %.v = select i1 %b2, i8* %4, i8* %5
106  %6 = bitcast i8* %.v to i32*
107  %7 = icmp eq i32* %6, %3
108  br i1 %7, label %9, label %8
109
110
111; <label>:8                                       ; preds = %0
112  call void @_ZdaPv(i8* %4) #5
113  call void @_ZdaPv(i8* %5) #5
114  br label %9
115
116; <label>:9                                       ; preds = %0, %8
117  ret void
118}
119
120define void @_Z2p5bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
121; CHECK-LABEL: @_Z2p5bb(
122; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
123; CHECK-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
124; CHECK-NEXT:    br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]]
125; CHECK:       3:
126; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]]
127; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]]
128; CHECK-NEXT:    br label [[TMP4]]
129; CHECK:       4:
130; CHECK-NEXT:    ret void
131;
132  %mStackData = alloca [10 x i32], align 16
133  %1 = bitcast [10 x i32]* %mStackData to i8*
134  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
135  %3 = select i1 %b1, i32* %2, i32* @g4
136  %4 = tail call noalias i8* @_Znam(i64 48) #4
137  %5 = tail call noalias i8* @_Znam(i64 48) #4
138  %.v = select i1 %b2, i8* %4, i8* %5
139  %6 = bitcast i8* %.v to i32*
140  %7 = icmp eq i32* %6, %3
141  br i1 %7, label %9, label %8
142
143
144; <label>:8                                       ; preds = %0
145  call void @_ZdaPv(i8* %4) #5
146  call void @_ZdaPv(i8* %5) #5
147  br label %9
148
149; <label>:9                                       ; preds = %0, %8
150  ret void
151}
152
153define void @_Z2p6bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
154; CHECK-LABEL: @_Z2p6bb(
155; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
156; CHECK-NEXT:    [[TMP2:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
157; CHECK-NEXT:    br i1 false, label [[TMP4:%.*]], label [[TMP3:%.*]]
158; CHECK:       3:
159; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]]
160; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP2]]) #[[ATTR4]]
161; CHECK-NEXT:    br label [[TMP4]]
162; CHECK:       4:
163; CHECK-NEXT:    ret void
164;
165  %mStackData = alloca [10 x i32], align 16
166  %1 = bitcast [10 x i32]* %mStackData to i8*
167  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
168  %3 = select i1 %b1, i32* %2, i32* @g5
169  %4 = tail call noalias i8* @_Znam(i64 48) #4
170  %5 = tail call noalias i8* @_Znam(i64 48) #4
171  %.v = select i1 %b2, i8* %4, i8* %5
172  %6 = bitcast i8* %.v to i32*
173  %7 = icmp eq i32* %6, %3
174  br i1 %7, label %9, label %8
175
176
177; <label>:8                                       ; preds = %0
178  call void @_ZdaPv(i8* %4) #5
179  call void @_ZdaPv(i8* %5) #5
180  br label %9
181
182; <label>:9                                       ; preds = %0, %8
183  ret void
184}
185
186; Here's another case involving multiple underlying objects, but this time we
187; must keep the comparison (it might involve a regular pointer-typed function
188; argument).
189
190define void @_Z4nopebbPi(i1 zeroext %b1, i1 zeroext %b2, i32* readnone %q) #0 {
191; CHECK-LABEL: @_Z4nopebbPi(
192; CHECK-NEXT:    [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16
193; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0
194; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[B1:%.*]], i32* [[TMP1]], i32* [[Q:%.*]]
195; CHECK-NEXT:    [[TMP3:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
196; CHECK-NEXT:    [[TMP4:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
197; CHECK-NEXT:    [[DOTV:%.*]] = select i1 [[B2:%.*]], i8* [[TMP3]], i8* [[TMP4]]
198; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i8* [[DOTV]] to i32*
199; CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i32* [[TMP5]], [[TMP2]]
200; CHECK-NEXT:    br i1 [[TMP6]], label [[TMP8:%.*]], label [[TMP7:%.*]]
201; CHECK:       7:
202; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP3]]) #[[ATTR4]]
203; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP4]]) #[[ATTR4]]
204; CHECK-NEXT:    br label [[TMP8]]
205; CHECK:       8:
206; CHECK-NEXT:    ret void
207;
208  %mStackData = alloca [10 x i32], align 16
209  %1 = bitcast [10 x i32]* %mStackData to i8*
210  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
211  %3 = select i1 %b1, i32* %2, i32* %q
212  %4 = tail call noalias i8* @_Znam(i64 48) #4
213  %5 = tail call noalias i8* @_Znam(i64 48) #4
214  %.v = select i1 %b2, i8* %4, i8* %5
215  %6 = bitcast i8* %.v to i32*
216  %7 = icmp eq i32* %6, %3
217  br i1 %7, label %9, label %8
218
219
220; <label>:8                                       ; preds = %0
221  call void @_ZdaPv(i8* %4) #5
222  call void @_ZdaPv(i8* %5) #5
223  br label %9
224
225; <label>:9                                       ; preds = %0, %8
226  ret void
227}
228
229define void @_Z2p3bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
230; CHECK-LABEL: @_Z2p3bb(
231; CHECK-NEXT:    [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16
232; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0
233; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[B1:%.*]], i32* [[TMP1]], i32* @g1
234; CHECK-NEXT:    [[TMP3:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
235; CHECK-NEXT:    [[TMP4:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
236; CHECK-NEXT:    [[DOTV:%.*]] = select i1 [[B2:%.*]], i8* [[TMP3]], i8* [[TMP4]]
237; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i8* [[DOTV]] to i32*
238; CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i32* [[TMP5]], [[TMP2]]
239; CHECK-NEXT:    br i1 [[TMP6]], label [[TMP8:%.*]], label [[TMP7:%.*]]
240; CHECK:       7:
241; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP3]]) #[[ATTR4]]
242; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP4]]) #[[ATTR4]]
243; CHECK-NEXT:    br label [[TMP8]]
244; CHECK:       8:
245; CHECK-NEXT:    ret void
246;
247  %mStackData = alloca [10 x i32], align 16
248  %1 = bitcast [10 x i32]* %mStackData to i8*
249  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
250  %3 = select i1 %b1, i32* %2, i32* @g1
251  %4 = tail call noalias i8* @_Znam(i64 48) #4
252  %5 = tail call noalias i8* @_Znam(i64 48) #4
253  %.v = select i1 %b2, i8* %4, i8* %5
254  %6 = bitcast i8* %.v to i32*
255  %7 = icmp eq i32* %6, %3
256  br i1 %7, label %9, label %8
257
258
259; <label>:8                                       ; preds = %0
260  call void @_ZdaPv(i8* %4) #5
261  call void @_ZdaPv(i8* %5) #5
262  br label %9
263
264; <label>:9                                       ; preds = %0, %8
265  ret void
266}
267
268define void @_Z2p7bb(i1 zeroext %b1, i1 zeroext %b2) #0 {
269; CHECK-LABEL: @_Z2p7bb(
270; CHECK-NEXT:    [[MSTACKDATA:%.*]] = alloca [10 x i32], align 16
271; CHECK-NEXT:    [[TMP1:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0
272; CHECK-NEXT:    [[TMP2:%.*]] = select i1 [[B1:%.*]], i32* [[TMP1]], i32* @g6
273; CHECK-NEXT:    [[TMP3:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
274; CHECK-NEXT:    [[TMP4:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
275; CHECK-NEXT:    [[DOTV:%.*]] = select i1 [[B2:%.*]], i8* [[TMP3]], i8* [[TMP4]]
276; CHECK-NEXT:    [[TMP5:%.*]] = bitcast i8* [[DOTV]] to i32*
277; CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i32* [[TMP5]], [[TMP2]]
278; CHECK-NEXT:    br i1 [[TMP6]], label [[TMP8:%.*]], label [[TMP7:%.*]]
279; CHECK:       7:
280; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP3]]) #[[ATTR4]]
281; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP4]]) #[[ATTR4]]
282; CHECK-NEXT:    br label [[TMP8]]
283; CHECK:       8:
284; CHECK-NEXT:    ret void
285;
286  %mStackData = alloca [10 x i32], align 16
287  %1 = bitcast [10 x i32]* %mStackData to i8*
288  %2 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
289  %3 = select i1 %b1, i32* %2, i32* @g6
290  %4 = tail call noalias i8* @_Znam(i64 48) #4
291  %5 = tail call noalias i8* @_Znam(i64 48) #4
292  %.v = select i1 %b2, i8* %4, i8* %5
293  %6 = bitcast i8* %.v to i32*
294  %7 = icmp eq i32* %6, %3
295  br i1 %7, label %9, label %8
296
297
298; <label>:8                                       ; preds = %0
299  call void @_ZdaPv(i8* %4) #5
300  call void @_ZdaPv(i8* %5) #5
301  br label %9
302
303; <label>:9                                       ; preds = %0, %8
304  ret void
305}
306
307define void @_Z2p2v(i32 %c) #0 {
308; CHECK-LABEL: @_Z2p2v(
309; CHECK-NEXT:    [[MSTACKDATA:%.*]] = alloca [10 x i32], i32 [[C:%.*]], align 16
310; CHECK-NEXT:    [[TMP1:%.*]] = tail call noalias i8* @_Znam(i64 48) #[[ATTR3]]
311; CHECK-NEXT:    [[TMP2:%.*]] = bitcast i8* [[TMP1]] to i32*
312; CHECK-NEXT:    [[TMP3:%.*]] = getelementptr inbounds [10 x i32], [10 x i32]* [[MSTACKDATA]], i64 0, i64 0
313; CHECK-NEXT:    [[TMP4:%.*]] = icmp eq i32* [[TMP2]], [[TMP3]]
314; CHECK-NEXT:    br i1 [[TMP4]], label [[TMP6:%.*]], label [[TMP5:%.*]]
315; CHECK:       5:
316; CHECK-NEXT:    call void @_ZdaPv(i8* [[TMP1]]) #[[ATTR4]]
317; CHECK-NEXT:    br label [[TMP6]]
318; CHECK:       6:
319; CHECK-NEXT:    ret void
320;
321  %mStackData = alloca [10 x i32], i32 %c, align 16
322  %1 = bitcast [10 x i32]* %mStackData to i8*
323  %2 = tail call noalias i8* @_Znam(i64 48) #4
324  %3 = bitcast i8* %2 to i32*
325  %4 = getelementptr inbounds [10 x i32], [10 x i32]* %mStackData, i64 0, i64 0
326  %5 = icmp eq i32* %3, %4
327  br i1 %5, label %7, label %6
328
329
330; <label>:6                                       ; preds = %0
331  call void @_ZdaPv(i8* %2) #5
332  br label %7
333
334; <label>:7                                       ; preds = %0, %6
335  ret void
336}
337
338; Function Attrs: nobuiltin
339declare noalias i8* @_Znam(i64) #2
340
341; Function Attrs: nobuiltin nounwind
342declare void @_ZdaPv(i8*) #3
343
344attributes #0 = { uwtable }
345attributes #1 = { nounwind }
346attributes #2 = { nobuiltin }
347attributes #3 = { nobuiltin nounwind }
348attributes #4 = { builtin }
349attributes #5 = { builtin nounwind }
350
351