Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / Transforms / SimplifyCFG / speculatively-execute-block-profmd.ll
blob7b285ac78c2a56670ee9ebc3b04d362a4d3eca61
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2 ; RUN: opt -S -passes=simplifycfg -simplifycfg-require-and-preserve-domtree=1 -two-entry-phi-node-folding-threshold=0 -phi-node-folding-threshold=4 < %s | FileCheck %s
4 declare void @sideeffect0()
5 declare void @sideeffect1()
6 declare void @sideeffect2()
8 define i32 @unknown(i1 %c, i32 %a, i32 %b) {
9 ; CHECK-LABEL: @unknown(
10 ; CHECK-NEXT:  entry:
11 ; CHECK-NEXT:    call void @sideeffect0()
12 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[DISPATCH:%.*]], label [[END:%.*]]
13 ; CHECK:       dispatch:
14 ; CHECK-NEXT:    call void @sideeffect1()
15 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
16 ; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[A]], [[B]]
17 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0
18 ; CHECK-NEXT:    br label [[END]]
19 ; CHECK:       end:
20 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[DISPATCH]] ]
21 ; CHECK-NEXT:    call void @sideeffect2()
22 ; CHECK-NEXT:    ret i32 [[RES]]
24 entry:
25   call void @sideeffect0()
26   br i1 %c, label %dispatch, label %end
28 dispatch:
29   call void @sideeffect1()
30   %cmp = icmp eq i32 %a, %b
31   br i1 %cmp, label %cond.true, label %end
33 cond.true:
34   %val = add i32 %a, %b
35   br label %end
37 end:
38   %res = phi i32 [ -1, %entry ], [ 0, %dispatch ], [ %val, %cond.true ]
39   call void @sideeffect2()
40   ret i32 %res
43 define i32 @predictably_taken(i1 %c, i32 %a, i32 %b) {
44 ; CHECK-LABEL: @predictably_taken(
45 ; CHECK-NEXT:  entry:
46 ; CHECK-NEXT:    call void @sideeffect0()
47 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[DISPATCH:%.*]], label [[END:%.*]]
48 ; CHECK:       dispatch:
49 ; CHECK-NEXT:    call void @sideeffect1()
50 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
51 ; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[A]], [[B]]
52 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0, !prof [[PROF0:![0-9]+]]
53 ; CHECK-NEXT:    br label [[END]]
54 ; CHECK:       end:
55 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[DISPATCH]] ]
56 ; CHECK-NEXT:    call void @sideeffect2()
57 ; CHECK-NEXT:    ret i32 [[RES]]
59 entry:
60   call void @sideeffect0()
61   br i1 %c, label %dispatch, label %end
63 dispatch:
64   call void @sideeffect1()
65   %cmp = icmp eq i32 %a, %b
66   br i1 %cmp, label %cond.true, label %end, !prof !0 ; likely branches to %cond.true
68 cond.true:
69   %val = add i32 %a, %b
70   br label %end
72 end:
73   %res = phi i32 [ -1, %entry ], [ 0, %dispatch ], [ %val, %cond.true ]
74   call void @sideeffect2()
75   ret i32 %res
78 define i32 @predictably_nontaken(i1 %c, i32 %a, i32 %b) {
79 ; CHECK-LABEL: @predictably_nontaken(
80 ; CHECK-NEXT:  entry:
81 ; CHECK-NEXT:    call void @sideeffect0()
82 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[DISPATCH:%.*]], label [[END:%.*]]
83 ; CHECK:       dispatch:
84 ; CHECK-NEXT:    call void @sideeffect1()
85 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
86 ; CHECK-NEXT:    br i1 [[CMP]], label [[END]], label [[COND_TRUE:%.*]], !prof [[PROF0]]
87 ; CHECK:       cond.true:
88 ; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[A]], [[B]]
89 ; CHECK-NEXT:    br label [[END]]
90 ; CHECK:       end:
91 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ 0, [[DISPATCH]] ], [ [[VAL]], [[COND_TRUE]] ]
92 ; CHECK-NEXT:    call void @sideeffect2()
93 ; CHECK-NEXT:    ret i32 [[RES]]
95 entry:
96   call void @sideeffect0()
97   br i1 %c, label %dispatch, label %end
99 dispatch:
100   call void @sideeffect1()
101   %cmp = icmp eq i32 %a, %b
102   br i1 %cmp, label %end, label %cond.true, !prof !0 ; likely branches to %end
104 cond.true:
105   %val = add i32 %a, %b
106   br label %end
108 end:
109   %res = phi i32 [ -1, %entry ], [ 0, %dispatch ], [ %val, %cond.true ]
110   call void @sideeffect2()
111   ret i32 %res
114 define i32 @almost_predictably_nontaken(i1 %c, i32 %a, i32 %b) {
115 ; CHECK-LABEL: @almost_predictably_nontaken(
116 ; CHECK-NEXT:  entry:
117 ; CHECK-NEXT:    call void @sideeffect0()
118 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[DISPATCH:%.*]], label [[END:%.*]]
119 ; CHECK:       dispatch:
120 ; CHECK-NEXT:    call void @sideeffect1()
121 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
122 ; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[A]], [[B]]
123 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i32 0, i32 [[VAL]], !prof [[PROF1:![0-9]+]]
124 ; CHECK-NEXT:    br label [[END]]
125 ; CHECK:       end:
126 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[DISPATCH]] ]
127 ; CHECK-NEXT:    call void @sideeffect2()
128 ; CHECK-NEXT:    ret i32 [[RES]]
130 entry:
131   call void @sideeffect0()
132   br i1 %c, label %dispatch, label %end
134 dispatch:
135   call void @sideeffect1()
136   %cmp = icmp eq i32 %a, %b
137   br i1 %cmp, label %end, label %cond.true, !prof !1 ; almost likely branches to %end
139 cond.true:
140   %val = add i32 %a, %b
141   br label %end
143 end:
144   %res = phi i32 [ -1, %entry ], [ 0, %dispatch ], [ %val, %cond.true ]
145   call void @sideeffect2()
146   ret i32 %res
149 define i32 @unpredictable(i1 %c, i32 %a, i32 %b) {
150 ; CHECK-LABEL: @unpredictable(
151 ; CHECK-NEXT:  entry:
152 ; CHECK-NEXT:    call void @sideeffect0()
153 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[DISPATCH:%.*]], label [[END:%.*]]
154 ; CHECK:       dispatch:
155 ; CHECK-NEXT:    call void @sideeffect1()
156 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
157 ; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[A]], [[B]]
158 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0, !unpredictable [[META2:![0-9]+]]
159 ; CHECK-NEXT:    br label [[END]]
160 ; CHECK:       end:
161 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[DISPATCH]] ]
162 ; CHECK-NEXT:    call void @sideeffect2()
163 ; CHECK-NEXT:    ret i32 [[RES]]
165 entry:
166   call void @sideeffect0()
167   br i1 %c, label %dispatch, label %end
169 dispatch:
170   call void @sideeffect1()
171   %cmp = icmp eq i32 %a, %b
172   br i1 %cmp, label %cond.true, label %end, !unpredictable !2 ; unpredictable
174 cond.true:
175   %val = add i32 %a, %b
176   br label %end
178 end:
179   %res = phi i32 [ -1, %entry ], [ 0, %dispatch ], [ %val, %cond.true ]
180   call void @sideeffect2()
181   ret i32 %res
184 define i32 @unpredictable_yet_taken(i1 %c, i32 %a, i32 %b) {
185 ; CHECK-LABEL: @unpredictable_yet_taken(
186 ; CHECK-NEXT:  entry:
187 ; CHECK-NEXT:    call void @sideeffect0()
188 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[DISPATCH:%.*]], label [[END:%.*]]
189 ; CHECK:       dispatch:
190 ; CHECK-NEXT:    call void @sideeffect1()
191 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
192 ; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[A]], [[B]]
193 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i32 [[VAL]], i32 0, !prof [[PROF0]], !unpredictable [[META2]]
194 ; CHECK-NEXT:    br label [[END]]
195 ; CHECK:       end:
196 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[DISPATCH]] ]
197 ; CHECK-NEXT:    call void @sideeffect2()
198 ; CHECK-NEXT:    ret i32 [[RES]]
200 entry:
201   call void @sideeffect0()
202   br i1 %c, label %dispatch, label %end
204 dispatch:
205   call void @sideeffect1()
206   %cmp = icmp eq i32 %a, %b
207   br i1 %cmp, label %cond.true, label %end, !prof !0, !unpredictable !2 ; likely branches to %cond.true, yet unpredictable
209 cond.true:
210   %val = add i32 %a, %b
211   br label %end
213 end:
214   %res = phi i32 [ -1, %entry ], [ 0, %dispatch ], [ %val, %cond.true ]
215   call void @sideeffect2()
216   ret i32 %res
219 define i32 @unpredictable_yet_nontaken(i1 %c, i32 %a, i32 %b) {
220 ; CHECK-LABEL: @unpredictable_yet_nontaken(
221 ; CHECK-NEXT:  entry:
222 ; CHECK-NEXT:    call void @sideeffect0()
223 ; CHECK-NEXT:    br i1 [[C:%.*]], label [[DISPATCH:%.*]], label [[END:%.*]]
224 ; CHECK:       dispatch:
225 ; CHECK-NEXT:    call void @sideeffect1()
226 ; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[A:%.*]], [[B:%.*]]
227 ; CHECK-NEXT:    [[VAL:%.*]] = add i32 [[A]], [[B]]
228 ; CHECK-NEXT:    [[SPEC_SELECT:%.*]] = select i1 [[CMP]], i32 0, i32 [[VAL]], !prof [[PROF0]], !unpredictable [[META2]]
229 ; CHECK-NEXT:    br label [[END]]
230 ; CHECK:       end:
231 ; CHECK-NEXT:    [[RES:%.*]] = phi i32 [ -1, [[ENTRY:%.*]] ], [ [[SPEC_SELECT]], [[DISPATCH]] ]
232 ; CHECK-NEXT:    call void @sideeffect2()
233 ; CHECK-NEXT:    ret i32 [[RES]]
235 entry:
236   call void @sideeffect0()
237   br i1 %c, label %dispatch, label %end
239 dispatch:
240   call void @sideeffect1()
241   %cmp = icmp eq i32 %a, %b
242   br i1 %cmp, label %end, label %cond.true, !prof !0, !unpredictable !2 ; likely branches to %end, yet unpredictable
244 cond.true:
245   %val = add i32 %a, %b
246   br label %end
248 end:
249   %res = phi i32 [ -1, %entry ], [ 0, %dispatch ], [ %val, %cond.true ]
250   call void @sideeffect2()
251   ret i32 %res
254 !0 = !{!"branch_weights", i32 99, i32 1}
255 !1 = !{!"branch_weights", i32 70, i32 1}
256 !2 = !{}
258 ; CHECK: !0 = !{!"branch_weights", i32 99, i32 1}
259 ; CHECK: !1 = !{!"branch_weights", i32 70, i32 1}
260 ; CHECK: !2 = !{}