[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / Transforms / DeadStoreElimination / multiblock-memoryphis.ll
blobdf85fa993b0b19094e69ac4604e84537d4ba2127
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 @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
20   store i32 0, ptr %P
21   br i1 true, label %bb1, label %bb2
22 bb1:
23   br label %bb3
24 bb2:
25   %x = load i32, ptr %P
26   br label %bb3
27 bb3:
28   store i32 1, ptr %P
29   ret void
32 define 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
43   br i1 true, label %bb1, label %bb2
44 bb1:
45   store i32 1, ptr %P
46   br label %bb3
47 bb2:
48   store i32 1, ptr %P
49   br label %bb3
50 bb3:
51   store i32 0, ptr %P
52   ret void
55 define 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
67   br i1 true, label %bb1, label %bb2
68 bb1:
69   store i32 1, ptr %P
70   br label %bb3
71 bb2:
72   store i32 1, ptr %Q
73   br label %bb3
74 bb3:
75   store i32 0, ptr %P
76   ret void
79 define 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
90   store i32 0, ptr %P
91   br i1 true, label %bb1, label %bb2
92 bb1:
93   br label %bb3
94 bb2:
95   br label %bb3
96 bb3:
97   store i8 1, ptr %P
98   ret void
101 declare void @hoge()
103 ; Check a function with a MemoryPhi with 3 incoming values.
104 define 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]]
134   tail call void @hoge()
135   br i1 %c1, label %bb3, label %bb1
137 bb1:                                              ; preds = %bb
138   br i1 %c2, label %bb2, label %bb3
140 bb2:                                              ; preds = %bb1
141   store i32 -1, ptr %Ptr, align 4
142   br label %bb3
144 bb3:                                              ; preds = %bb2, %bb1, %bb
145   br label %bb4
147 bb4:                                              ; 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   ]
154 bb5:                                              ; preds = %bb4
155   store i32 0, ptr %Ptr, align 4
156   br label %bb8
158 bb6:                                              ; preds = %bb4
159   store i32 1, ptr %Ptr, align 4
160   br label %bb8
162 bb7:                                              ; preds = %bb4
163   store i32 2, ptr %Ptr, align 4
164   br label %bb8
166 bb8:                                              ; preds = %bb7, %bb6, %bb5, %bb4
167   br label %bb4
171 declare void @fn1_test11()
172 declare void @fn2_test11()
174 define 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
186 entry:
187   br i1 %c, label %if.then, label %exit
189 if.then:                                      ; preds = %entry
190   tail call void @fn2_test11() #1
191   br label %exit
193 exit:
194   store ptr null, ptr %ptr.1, align 8
195   tail call void @fn2_test11() #1
196   ret void
199 attributes #1 = { nounwind }