[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / DeadStoreElimination / multiblock-simple.ll
blobe30c78e44e02a864cfb06220cdd4440c176114f2
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt < %s -basic-aa -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(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
18   store i32 1, i32* %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, i32* %P
26   ret void
29 define 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
41   store i32 0, i32* %P
42   br i1 true, label %bb1, label %bb2
43 bb1:
44   br label %bb3
45 bb2:
46   store i32 1, i32* %P
47   br label %bb3
48 bb3:
49   ret void
53 define 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
66   store i32 1, i32* %Q
67   br i1 true, label %bb1, label %bb2
68 bb1:
69   load i32, i32* %P
70   br label %bb3
71 bb2:
72   br label %bb3
73 bb3:
74   store i32 0, i32* %Q
75   store i32 0, i32* %P
76   ret void
79 define 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]]
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
93 define 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
105   store i32 0, i32* %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, i32* %P
113   ret void
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.
119 define 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
135   store i32 0, i32* %P
136   %P.1 = getelementptr i32, i32* %P, i32 1
137   store i32 1, i32* %P.1
139   %P.64 = bitcast i32* %P to i64*
140   %lv = load i64, i64* %P.64
141   br i1 true, label %bb1, label %bb2
142 bb1:
143   br label %bb3
144 bb2:
145   br label %bb3
146 bb3:
147   store i32 2, i32* %P
148   ret void
151 define 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
163   store i32 0, i32* %P
164   br i1 true, label %bb1, label %bb2
165 bb1:
166   store i32 1, i32* %P
167   br label %bb3
168 bb2:
169   ret void
170 bb3:
171   ret void
175 define 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
185   %P = alloca i32
186   store i32 0, i32* %P
187   br i1 true, label %bb1, label %bb2
188 bb1:
189   store i32 0, i32* %P
190   br label %bb3
191 bb2:
192   ret void
193 bb3:
194   ret void
198 define 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
210   store i32 0, i32* %P
211   br i1 true, label %bb1, label %bb2
212 bb1:
213   store i32 1, i32* %P
214   br label %bb3
215 bb2:
216   store i32 1, i32* %P
217   ret void
218 bb3:
219   ret void
223 define 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
235   store i32 0, i32* %P
236   br i1 true, label %bb1, label %bb2
237 bb1:
238   store i32 1, i32* %P
239   br label %bb3
240 bb2:
241   store i32 1, i32* %P
242   br label %bb3
243 bb3:
244   ret void