[sanitizer] Improve FreeBSD ASLR detection
[llvm-project.git] / llvm / test / Transforms / DeadStoreElimination / multiblock-memoryphis.ll
blobb3faafd15b3bc4a801e099757b9c1be99143cfe1
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 @test4(i32* noalias %P) {
8 ; CHECK-LABEL: @test4(
9 ; CHECK-NEXT:    store i32 0, i32* [[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, i32* [[P]], align 4
15 ; CHECK-NEXT:    br label [[BB3]]
16 ; CHECK:       bb3:
17 ; CHECK-NEXT:    store i32 1, i32* [[P]], align 4
18 ; CHECK-NEXT:    ret void
20   store i32 0, i32* %P
21   br i1 true, label %bb1, label %bb2
22 bb1:
23   br label %bb3
24 bb2:
25   %x = load i32, i32* %P
26   br label %bb3
27 bb3:
28   store i32 1, i32* %P
29   ret void
32 define void @test5(i32* 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, i32* [[P:%.*]], align 4
41 ; CHECK-NEXT:    ret void
43   br i1 true, label %bb1, label %bb2
44 bb1:
45   store i32 1, i32* %P
46   br label %bb3
47 bb2:
48   store i32 1, i32* %P
49   br label %bb3
50 bb3:
51   store i32 0, i32* %P
52   ret void
55 define void @test8(i32* %P, i32* %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, i32* [[Q:%.*]], align 4
62 ; CHECK-NEXT:    br label [[BB3]]
63 ; CHECK:       bb3:
64 ; CHECK-NEXT:    store i32 0, i32* [[P:%.*]], align 4
65 ; CHECK-NEXT:    ret void
67   br i1 true, label %bb1, label %bb2
68 bb1:
69   store i32 1, i32* %P
70   br label %bb3
71 bb2:
72   store i32 1, i32* %Q
73   br label %bb3
74 bb3:
75   store i32 0, i32* %P
76   ret void
79 define void @test10(i32* noalias %P) {
80 ; CHECK-LABEL: @test10(
81 ; CHECK-NEXT:    store i32 1, i32* [[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   %P2 = bitcast i32* %P to i8*
91   store i32 0, i32* %P
92   br i1 true, label %bb1, label %bb2
93 bb1:
94   br label %bb3
95 bb2:
96   br label %bb3
97 bb3:
98   store i8 1, i8* %P2
99   ret void
102 declare void @hoge()
104 ; Check a function with a MemoryPhi with 3 incoming values.
105 define void @widget(i32* %Ptr, i1 %c1, i1 %c2, i32 %v1, i32 %v2, i32 %v3) {
106 ; CHECK-LABEL: @widget(
107 ; CHECK-NEXT:  bb:
108 ; CHECK-NEXT:    tail call void @hoge()
109 ; CHECK-NEXT:    br i1 [[C1:%.*]], label [[BB3:%.*]], label [[BB1:%.*]]
110 ; CHECK:       bb1:
111 ; CHECK-NEXT:    br i1 [[C2:%.*]], label [[BB2:%.*]], label [[BB3]]
112 ; CHECK:       bb2:
113 ; CHECK-NEXT:    br label [[BB3]]
114 ; CHECK:       bb3:
115 ; CHECK-NEXT:    br label [[BB4:%.*]]
116 ; CHECK:       bb4:
117 ; CHECK-NEXT:    switch i32 [[V1:%.*]], label [[BB8:%.*]] [
118 ; CHECK-NEXT:    i32 0, label [[BB5:%.*]]
119 ; CHECK-NEXT:    i32 1, label [[BB6:%.*]]
120 ; CHECK-NEXT:    i32 2, label [[BB7:%.*]]
121 ; CHECK-NEXT:    ]
122 ; CHECK:       bb5:
123 ; CHECK-NEXT:    store i32 0, i32* [[PTR:%.*]], align 4
124 ; CHECK-NEXT:    br label [[BB8]]
125 ; CHECK:       bb6:
126 ; CHECK-NEXT:    store i32 1, i32* [[PTR]], align 4
127 ; CHECK-NEXT:    br label [[BB8]]
128 ; CHECK:       bb7:
129 ; CHECK-NEXT:    store i32 2, i32* [[PTR]], align 4
130 ; CHECK-NEXT:    br label [[BB8]]
131 ; CHECK:       bb8:
132 ; CHECK-NEXT:    br label [[BB4]]
135   tail call void @hoge()
136   br i1 %c1, label %bb3, label %bb1
138 bb1:                                              ; preds = %bb
139   br i1 %c2, label %bb2, label %bb3
141 bb2:                                              ; preds = %bb1
142   store i32 -1, i32* %Ptr, align 4
143   br label %bb3
145 bb3:                                              ; preds = %bb2, %bb1, %bb
146   br label %bb4
148 bb4:                                              ; preds = %bb8, %bb3
149   switch i32 %v1, label %bb8 [
150   i32 0, label %bb5
151   i32 1, label %bb6
152   i32 2, label %bb7
153   ]
155 bb5:                                              ; preds = %bb4
156   store i32 0, i32* %Ptr, align 4
157   br label %bb8
159 bb6:                                              ; preds = %bb4
160   store i32 1, i32* %Ptr, align 4
161   br label %bb8
163 bb7:                                              ; preds = %bb4
164   store i32 2, i32* %Ptr, align 4
165   br label %bb8
167 bb8:                                              ; preds = %bb7, %bb6, %bb5, %bb4
168   br label %bb4
172 declare void @fn1_test11()
173 declare void @fn2_test11()
175 define void @test11(i1 %c, i8** %ptr.1) {
176 ; CHECK-LABEL: @test11(
177 ; CHECK-NEXT:  entry:
178 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[IF_THEN:%.*]], label [[EXIT:%.*]]
179 ; CHECK:       if.then:
180 ; CHECK-NEXT:    tail call void @fn2_test11() #0
181 ; CHECK-NEXT:    br label [[EXIT]]
182 ; CHECK:       exit:
183 ; CHECK-NEXT:    store i8* null, i8** [[PTR_1:%.*]], align 8
184 ; CHECK-NEXT:    tail call void @fn2_test11() #0
185 ; CHECK-NEXT:    ret void
187 entry:
188   br i1 %c, label %if.then, label %exit
190 if.then:                                      ; preds = %entry
191   tail call void @fn2_test11() #1
192   br label %exit
194 exit:
195   store i8* null, i8** %ptr.1, align 8
196   tail call void @fn2_test11() #1
197   ret void
200 attributes #1 = { nounwind }