xref: /llvm-project/llvm/test/Transforms/DeadStoreElimination/multiblock-memoryphis.ll (revision f497a00da968b0ff90d8c98caa184d14b9a92495)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2; RUN: opt < %s -passes=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 @test4(ptr noalias %P) {
8; CHECK-LABEL: @test4(
9; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 4
10; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
11; CHECK:       bb1:
12; CHECK-NEXT:    br label [[BB3:%.*]]
13; CHECK:       bb2:
14; CHECK-NEXT:    [[X:%.*]] = load i32, ptr [[P]], align 4
15; CHECK-NEXT:    br label [[BB3]]
16; CHECK:       bb3:
17; CHECK-NEXT:    store i32 1, ptr [[P]], align 4
18; CHECK-NEXT:    ret void
19;
20  store i32 0, ptr %P
21  br i1 true, label %bb1, label %bb2
22bb1:
23  br label %bb3
24bb2:
25  %x = load i32, ptr %P
26  br label %bb3
27bb3:
28  store i32 1, ptr %P
29  ret void
30}
31
32define void @test5(ptr noalias %P) {
33; CHECK-LABEL: @test5(
34; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
35; CHECK:       bb1:
36; CHECK-NEXT:    br label [[BB3:%.*]]
37; CHECK:       bb2:
38; CHECK-NEXT:    br label [[BB3]]
39; CHECK:       bb3:
40; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 4
41; CHECK-NEXT:    ret void
42;
43  br i1 true, label %bb1, label %bb2
44bb1:
45  store i32 1, ptr %P
46  br label %bb3
47bb2:
48  store i32 1, ptr %P
49  br label %bb3
50bb3:
51  store i32 0, ptr %P
52  ret void
53}
54
55define void @test8(ptr %P, ptr %Q) {
56; CHECK-LABEL: @test8(
57; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
58; CHECK:       bb1:
59; CHECK-NEXT:    br label [[BB3:%.*]]
60; CHECK:       bb2:
61; CHECK-NEXT:    store i32 1, ptr [[Q:%.*]], align 4
62; CHECK-NEXT:    br label [[BB3]]
63; CHECK:       bb3:
64; CHECK-NEXT:    store i32 0, ptr [[P:%.*]], align 4
65; CHECK-NEXT:    ret void
66;
67  br i1 true, label %bb1, label %bb2
68bb1:
69  store i32 1, ptr %P
70  br label %bb3
71bb2:
72  store i32 1, ptr %Q
73  br label %bb3
74bb3:
75  store i32 0, ptr %P
76  ret void
77}
78
79define void @test10(ptr noalias %P) {
80; CHECK-LABEL: @test10(
81; CHECK-NEXT:    store i32 1, ptr [[P:%.*]], align 4
82; CHECK-NEXT:    br i1 true, label [[BB1:%.*]], label [[BB2:%.*]]
83; CHECK:       bb1:
84; CHECK-NEXT:    br label [[BB3:%.*]]
85; CHECK:       bb2:
86; CHECK-NEXT:    br label [[BB3]]
87; CHECK:       bb3:
88; CHECK-NEXT:    ret void
89;
90  store i32 0, ptr %P
91  br i1 true, label %bb1, label %bb2
92bb1:
93  br label %bb3
94bb2:
95  br label %bb3
96bb3:
97  store i8 1, ptr %P
98  ret void
99}
100
101declare void @hoge()
102
103; Check a function with a MemoryPhi with 3 incoming values.
104define void @widget(ptr %Ptr, i1 %c1, i1 %c2, i32 %v1, i32 %v2, i32 %v3) {
105; CHECK-LABEL: @widget(
106; CHECK-NEXT:  bb:
107; CHECK-NEXT:    tail call void @hoge()
108; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB3:%.*]], label [[BB1:%.*]]
109; CHECK:       bb1:
110; CHECK-NEXT:    br i1 [[C2:%.*]], label [[BB2:%.*]], label [[BB3]]
111; CHECK:       bb2:
112; CHECK-NEXT:    br label [[BB3]]
113; CHECK:       bb3:
114; CHECK-NEXT:    br label [[BB4:%.*]]
115; CHECK:       bb4:
116; CHECK-NEXT:    switch i32 [[V1:%.*]], label [[BB8:%.*]] [
117; CHECK-NEXT:    i32 0, label [[BB5:%.*]]
118; CHECK-NEXT:    i32 1, label [[BB6:%.*]]
119; CHECK-NEXT:    i32 2, label [[BB7:%.*]]
120; CHECK-NEXT:    ]
121; CHECK:       bb5:
122; CHECK-NEXT:    store i32 0, ptr [[PTR:%.*]], align 4
123; CHECK-NEXT:    br label [[BB8]]
124; CHECK:       bb6:
125; CHECK-NEXT:    store i32 1, ptr [[PTR]], align 4
126; CHECK-NEXT:    br label [[BB8]]
127; CHECK:       bb7:
128; CHECK-NEXT:    store i32 2, ptr [[PTR]], align 4
129; CHECK-NEXT:    br label [[BB8]]
130; CHECK:       bb8:
131; CHECK-NEXT:    br label [[BB4]]
132;
133bb:
134  tail call void @hoge()
135  br i1 %c1, label %bb3, label %bb1
136
137bb1:                                              ; preds = %bb
138  br i1 %c2, label %bb2, label %bb3
139
140bb2:                                              ; preds = %bb1
141  store i32 -1, ptr %Ptr, align 4
142  br label %bb3
143
144bb3:                                              ; preds = %bb2, %bb1, %bb
145  br label %bb4
146
147bb4:                                              ; preds = %bb8, %bb3
148  switch i32 %v1, label %bb8 [
149  i32 0, label %bb5
150  i32 1, label %bb6
151  i32 2, label %bb7
152  ]
153
154bb5:                                              ; preds = %bb4
155  store i32 0, ptr %Ptr, align 4
156  br label %bb8
157
158bb6:                                              ; preds = %bb4
159  store i32 1, ptr %Ptr, align 4
160  br label %bb8
161
162bb7:                                              ; preds = %bb4
163  store i32 2, ptr %Ptr, align 4
164  br label %bb8
165
166bb8:                                              ; preds = %bb7, %bb6, %bb5, %bb4
167  br label %bb4
168}
169
170
171declare void @fn1_test11()
172declare void @fn2_test11()
173
174define void @test11(i1 %c, ptr %ptr.1) {
175; CHECK-LABEL: @test11(
176; CHECK-NEXT:  entry:
177; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]]
178; CHECK:       if.then:
179; CHECK-NEXT:    tail call void @fn2_test11() #0
180; CHECK-NEXT:    br label [[EXIT]]
181; CHECK:       exit:
182; CHECK-NEXT:    store ptr null, ptr [[PTR_1:%.*]], align 8
183; CHECK-NEXT:    tail call void @fn2_test11() #0
184; CHECK-NEXT:    ret void
185;
186entry:
187  br i1 %c, label %if.then, label %exit
188
189if.then:                                      ; preds = %entry
190  tail call void @fn2_test11() #1
191  br label %exit
192
193exit:
194  store ptr null, ptr %ptr.1, align 8
195  tail call void @fn2_test11() #1
196  ret void
197}
198
199attributes #1 = { nounwind }
200