[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / DeadStoreElimination / multiblock-simple.ll
blob77bf5dee026ad9c03843d49d01b21af2b6c8d768
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -passes=dse -S | FileCheck %s
4 target datalayout = "e-m:e-p:32:32-i64:64-v128:64:128-a:0:32-n32-S64"
7 define void @test2(ptr 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, ptr [[P:%.*]], align 4
16 ; CHECK-NEXT:    ret void
18   store i32 1, ptr %P
19   br i1 true, label %bb1, label %bb2
20 bb1:
21   br label %bb3
22 bb2:
23   br label %bb3
24 bb3:
25   store i32 0, ptr %P
26   ret void
29 define void @test3(ptr noalias %P) {
30 ; CHECK-LABEL: @test3(
31 ; CHECK-NEXT:    store i32 0, ptr [[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, ptr [[P]], align 4
37 ; CHECK-NEXT:    br label [[BB3]]
38 ; CHECK:       bb3:
39 ; CHECK-NEXT:    ret void
41   store i32 0, ptr %P
42   br i1 true, label %bb1, label %bb2
43 bb1:
44   br label %bb3
45 bb2:
46   store i32 1, ptr %P
47   br label %bb3
48 bb3:
49   ret void
53 define void @test7(ptr noalias %P, ptr 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, ptr [[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, ptr [[Q:%.*]], align 4
63 ; CHECK-NEXT:    store i32 0, ptr [[P]], align 4
64 ; CHECK-NEXT:    ret void
66   store i32 1, ptr %Q
67   br i1 true, label %bb1, label %bb2
68 bb1:
69   load i32, ptr %P
70   br label %bb3
71 bb2:
72   br label %bb3
73 bb3:
74   store i32 0, ptr %Q
75   store i32 0, ptr %P
76   ret void
79 define i32 @test22(ptr %P, ptr noalias %Q, ptr %R) {
80 ; CHECK-LABEL: @test22(
81 ; CHECK-NEXT:    store i32 2, ptr [[P:%.*]], align 4
82 ; CHECK-NEXT:    store i32 3, ptr [[Q:%.*]], align 4
83 ; CHECK-NEXT:    [[L:%.*]] = load i32, ptr [[R:%.*]], align 4
84 ; CHECK-NEXT:    ret i32 [[L]]
86   store i32 1, ptr %Q
87   store i32 2, ptr %P
88   store i32 3, ptr %Q
89   %l = load i32, ptr %R
90   ret i32 %l
93 define void @test9(ptr noalias %P) {
94 ; CHECK-LABEL: @test9(
95 ; CHECK-NEXT:    store i32 0, ptr [[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, ptr [[P]], align 4
103 ; CHECK-NEXT:    ret void
105   store i32 0, ptr %P
106   br i1 true, label %bb1, label %bb2
107 bb1:
108   br label %bb3
109 bb2:
110   ret void
111 bb3:
112   store i32 1, ptr %P
113   ret void
116 ; We cannot eliminate `store i32 0, ptr %P`, as it is read by the later load.
117 ; Make sure that we check the uses of `store i32 1, ptr %P.1 which does not
118 ; alias %P. Note that uses point to the *first* def that may alias.
119 define void @overlapping_read(ptr %P) {
120 ; CHECK-LABEL: @overlapping_read(
121 ; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 4
122 ; CHECK-NEXT:    [[P_1:%.*]] = getelementptr i32, ptr [[P]], i32 1
123 ; CHECK-NEXT:    store i32 1, ptr [[P_1]], align 4
124 ; CHECK-NEXT:    [[LV:%.*]] = load i64, ptr [[P]], align 8
125 ; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
126 ; CHECK:       bb1:
127 ; CHECK-NEXT:    br label [[BB3:%.*]]
128 ; CHECK:       bb2:
129 ; CHECK-NEXT:    br label [[BB3]]
130 ; CHECK:       bb3:
131 ; CHECK-NEXT:    store i32 2, ptr [[P]], align 4
132 ; CHECK-NEXT:    ret void
134   store i32 0, ptr %P
135   %P.1 = getelementptr i32, ptr %P, i32 1
136   store i32 1, ptr %P.1
138   %lv = load i64, ptr %P
139   br i1 true, label %bb1, label %bb2
140 bb1:
141   br label %bb3
142 bb2:
143   br label %bb3
144 bb3:
145   store i32 2, ptr %P
146   ret void
149 define void @test10(ptr %P) {
150 ; CHECK-LABEL: @test10(
151 ; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 4
152 ; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
153 ; CHECK:       bb1:
154 ; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
155 ; CHECK-NEXT:    br label [[BB3:%.*]]
156 ; CHECK:       bb2:
157 ; CHECK-NEXT:    ret void
158 ; CHECK:       bb3:
159 ; CHECK-NEXT:    ret void
161   store i32 0, ptr %P
162   br i1 true, label %bb1, label %bb2
163 bb1:
164   store i32 1, ptr %P
165   br label %bb3
166 bb2:
167   ret void
168 bb3:
169   ret void
173 define void @test11() {
174 ; CHECK-LABEL: @test11(
175 ; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
176 ; CHECK:       bb1:
177 ; CHECK-NEXT:    br label [[BB3:%.*]]
178 ; CHECK:       bb2:
179 ; CHECK-NEXT:    ret void
180 ; CHECK:       bb3:
181 ; CHECK-NEXT:    ret void
183   %P = alloca i32
184   store i32 0, ptr %P
185   br i1 true, label %bb1, label %bb2
186 bb1:
187   store i32 0, ptr %P
188   br label %bb3
189 bb2:
190   ret void
191 bb3:
192   ret void
196 define void @test12(ptr %P) {
197 ; CHECK-LABEL: @test12(
198 ; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
199 ; CHECK:       bb1:
200 ; CHECK-NEXT:    store i32 1, ptr [[P:%.*]], align 4
201 ; CHECK-NEXT:    br label [[BB3:%.*]]
202 ; CHECK:       bb2:
203 ; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
204 ; CHECK-NEXT:    ret void
205 ; CHECK:       bb3:
206 ; CHECK-NEXT:    ret void
208   store i32 0, ptr %P
209   br i1 true, label %bb1, label %bb2
210 bb1:
211   store i32 1, ptr %P
212   br label %bb3
213 bb2:
214   store i32 1, ptr %P
215   ret void
216 bb3:
217   ret void
221 define void @test13(ptr %P) {
222 ; CHECK-LABEL: @test13(
223 ; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
224 ; CHECK:       bb1:
225 ; CHECK-NEXT:    store i32 1, ptr [[P:%.*]], align 4
226 ; CHECK-NEXT:    br label [[BB3:%.*]]
227 ; CHECK:       bb2:
228 ; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
229 ; CHECK-NEXT:    br label [[BB3]]
230 ; CHECK:       bb3:
231 ; CHECK-NEXT:    ret void
233   store i32 0, ptr %P
234   br i1 true, label %bb1, label %bb2
235 bb1:
236   store i32 1, ptr %P
237   br label %bb3
238 bb2:
239   store i32 1, ptr %P
240   br label %bb3
241 bb3:
242   ret void