1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -basic-aa -dse -S | FileCheck %s
3
4target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
5
6
7define void @test2(i32* noalias %P) {
8; CHECK-LABEL: @test2(
9; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
10; CHECK:       bb1:
11; CHECK-NEXT:    br label [[BB3:%.*]]
12; CHECK:       bb2:
13; CHECK-NEXT:    br label [[BB3]]
14; CHECK:       bb3:
15; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
16; CHECK-NEXT:    ret void
17;
18  store i32 1, i32* %P
19  br i1 true, label %bb1, label %bb2
20bb1:
21  br label %bb3
22bb2:
23  br label %bb3
24bb3:
25  store i32 0, i32* %P
26  ret void
27}
28
29define void @test3(i32* noalias %P) {
30; CHECK-LABEL: @test3(
31; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
32; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
33; CHECK:       bb1:
34; CHECK-NEXT:    br label [[BB3:%.*]]
35; CHECK:       bb2:
36; CHECK-NEXT:    store i32 1, i32* [[P]], align 4
37; CHECK-NEXT:    br label [[BB3]]
38; CHECK:       bb3:
39; CHECK-NEXT:    ret void
40;
41  store i32 0, i32* %P
42  br i1 true, label %bb1, label %bb2
43bb1:
44  br label %bb3
45bb2:
46  store i32 1, i32* %P
47  br label %bb3
48bb3:
49  ret void
50}
51
52
53define void @test7(i32* noalias %P, i32* noalias %Q) {
54; CHECK-LABEL: @test7(
55; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
56; CHECK:       bb1:
57; CHECK-NEXT:    [[TMP1:%.*]] = load i32, i32* [[P:%.*]], align 4
58; CHECK-NEXT:    br label [[BB3:%.*]]
59; CHECK:       bb2:
60; CHECK-NEXT:    br label [[BB3]]
61; CHECK:       bb3:
62; CHECK-NEXT:    store i32 0, i32* [[Q:%.*]], align 4
63; CHECK-NEXT:    store i32 0, i32* [[P]], align 4
64; CHECK-NEXT:    ret void
65;
66  store i32 1, i32* %Q
67  br i1 true, label %bb1, label %bb2
68bb1:
69  load i32, i32* %P
70  br label %bb3
71bb2:
72  br label %bb3
73bb3:
74  store i32 0, i32* %Q
75  store i32 0, i32* %P
76  ret void
77}
78
79define i32 @test22(i32* %P, i32* noalias %Q, i32* %R) {
80; CHECK-LABEL: @test22(
81; CHECK-NEXT:    store i32 2, i32* [[P:%.*]], align 4
82; CHECK-NEXT:    store i32 3, i32* [[Q:%.*]], align 4
83; CHECK-NEXT:    [[L:%.*]] = load i32, i32* [[R:%.*]], align 4
84; CHECK-NEXT:    ret i32 [[L]]
85;
86  store i32 1, i32* %Q
87  store i32 2, i32* %P
88  store i32 3, i32* %Q
89  %l = load i32, i32* %R
90  ret i32 %l
91}
92
93define void @test9(i32* noalias %P) {
94; CHECK-LABEL: @test9(
95; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
96; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
97; CHECK:       bb1:
98; CHECK-NEXT:    br label [[BB3:%.*]]
99; CHECK:       bb2:
100; CHECK-NEXT:    ret void
101; CHECK:       bb3:
102; CHECK-NEXT:    store i32 1, i32* [[P]], align 4
103; CHECK-NEXT:    ret void
104;
105  store i32 0, i32* %P
106  br i1 true, label %bb1, label %bb2
107bb1:
108  br label %bb3
109bb2:
110  ret void
111bb3:
112  store i32 1, i32* %P
113  ret void
114}
115
116; We cannot eliminate `store i32 0, i32* %P`, as it is read by the later load.
117; Make sure that we check the uses of `store i32 1, i32* %P.1 which does not
118; alias %P. Note that uses point to the *first* def that may alias.
119define void @overlapping_read(i32* %P) {
120; CHECK-LABEL: @overlapping_read(
121; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
122; CHECK-NEXT:    [[P_1:%.*]] = getelementptr i32, i32* [[P]], i32 1
123; CHECK-NEXT:    store i32 1, i32* [[P_1]], align 4
124; CHECK-NEXT:    [[P_64:%.*]] = bitcast i32* [[P]] to i64*
125; CHECK-NEXT:    [[LV:%.*]] = load i64, i64* [[P_64]], align 8
126; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
127; CHECK:       bb1:
128; CHECK-NEXT:    br label [[BB3:%.*]]
129; CHECK:       bb2:
130; CHECK-NEXT:    br label [[BB3]]
131; CHECK:       bb3:
132; CHECK-NEXT:    store i32 2, i32* [[P]], align 4
133; CHECK-NEXT:    ret void
134;
135  store i32 0, i32* %P
136  %P.1 = getelementptr i32, i32* %P, i32 1
137  store i32 1, i32* %P.1
138
139  %P.64 = bitcast i32* %P to i64*
140  %lv = load i64, i64* %P.64
141  br i1 true, label %bb1, label %bb2
142bb1:
143  br label %bb3
144bb2:
145  br label %bb3
146bb3:
147  store i32 2, i32* %P
148  ret void
149}
150
151define void @test10(i32* %P) {
152; CHECK-LABEL: @test10(
153; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
154; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
155; CHECK:       bb1:
156; CHECK-NEXT:    store i32 1, i32* [[P]], align 4
157; CHECK-NEXT:    br label [[BB3:%.*]]
158; CHECK:       bb2:
159; CHECK-NEXT:    ret void
160; CHECK:       bb3:
161; CHECK-NEXT:    ret void
162;
163  store i32 0, i32* %P
164  br i1 true, label %bb1, label %bb2
165bb1:
166  store i32 1, i32* %P
167  br label %bb3
168bb2:
169  ret void
170bb3:
171  ret void
172}
173
174
175define void @test11() {
176; CHECK-LABEL: @test11(
177; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
178; CHECK:       bb1:
179; CHECK-NEXT:    br label [[BB3:%.*]]
180; CHECK:       bb2:
181; CHECK-NEXT:    ret void
182; CHECK:       bb3:
183; CHECK-NEXT:    ret void
184;
185  %P = alloca i32
186  store i32 0, i32* %P
187  br i1 true, label %bb1, label %bb2
188bb1:
189  store i32 0, i32* %P
190  br label %bb3
191bb2:
192  ret void
193bb3:
194  ret void
195}
196
197
198define void @test12(i32* %P) {
199; CHECK-LABEL: @test12(
200; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
201; CHECK:       bb1:
202; CHECK-NEXT:    store i32 1, i32* [[P:%.*]], align 4
203; CHECK-NEXT:    br label [[BB3:%.*]]
204; CHECK:       bb2:
205; CHECK-NEXT:    store i32 1, i32* [[P]], align 4
206; CHECK-NEXT:    ret void
207; CHECK:       bb3:
208; CHECK-NEXT:    ret void
209;
210  store i32 0, i32* %P
211  br i1 true, label %bb1, label %bb2
212bb1:
213  store i32 1, i32* %P
214  br label %bb3
215bb2:
216  store i32 1, i32* %P
217  ret void
218bb3:
219  ret void
220}
221
222
223define void @test13(i32* %P) {
224; CHECK-LABEL: @test13(
225; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
226; CHECK:       bb1:
227; CHECK-NEXT:    store i32 1, i32* [[P:%.*]], align 4
228; CHECK-NEXT:    br label [[BB3:%.*]]
229; CHECK:       bb2:
230; CHECK-NEXT:    store i32 1, i32* [[P]], align 4
231; CHECK-NEXT:    br label [[BB3]]
232; CHECK:       bb3:
233; CHECK-NEXT:    ret void
234;
235  store i32 0, i32* %P
236  br i1 true, label %bb1, label %bb2
237bb1:
238  store i32 1, i32* %P
239  br label %bb3
240bb2:
241  store i32 1, i32* %P
242  br label %bb3
243bb3:
244  ret void
245}
246