[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / Transforms / lower-builtin-allow-check.ll
blobfb8726942992897944e1a12197be4a82abc24fa6
1 ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4
2 ; RUN: opt < %s -passes='function(lower-allow-check)' -S | FileCheck %s --check-prefixes=NOPROFILE
3 ; RUN: opt < %s -passes='function(lower-allow-check)' -lower-allow-check-random-rate=0 -S | FileCheck %s --check-prefixes=NONE
4 ; RUN: opt < %s -passes='function(lower-allow-check)' -lower-allow-check-random-rate=1 -S | FileCheck %s --check-prefixes=ALL
6 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check<cutoffs[22]=990000>)' -S | FileCheck %s --check-prefixes=HOT99
7 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check<cutoffs[22]=700000>)' -S | FileCheck %s --check-prefixes=HOT70
8 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check<cutoffs[22]=990000>)' -lower-allow-check-random-rate=0 -S | FileCheck %s --check-prefixes=NONE99
9 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check<cutoffs[22]=700000>)' -lower-allow-check-random-rate=1 -S | FileCheck %s --check-prefixes=ALL70
11 ; -lower-allow-check-percentile-cutoff is deprecated and will be removed in the future;
12 ; use the cutoffs parameter to the lower-allow-check pass, as shown above.
13 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-percentile-cutoff-hot=990000 -S | FileCheck %s --check-prefixes=HOT99
14 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-percentile-cutoff-hot=700000 -S | FileCheck %s --check-prefixes=HOT70
15 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-random-rate=0 -lower-allow-check-percentile-cutoff-hot=990000 -S | FileCheck %s --check-prefixes=NONE99
16 ; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-random-rate=1 -lower-allow-check-percentile-cutoff-hot=700000 -S | FileCheck %s --check-prefixes=ALL70
18 target triple = "x86_64-pc-linux-gnu"
20 declare void @llvm.ubsantrap(i8 immarg)
21 declare i1 @llvm.allow.ubsan.check(i8 immarg)
23 define dso_local noundef i32 @simple(ptr noundef readonly %0) {
24 ; NOPROFILE-LABEL: define dso_local noundef i32 @simple(
25 ; NOPROFILE-SAME: ptr noundef readonly [[TMP0:%.*]]) {
26 ; NOPROFILE-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
27 ; NOPROFILE-NEXT:    [[HOT:%.*]] = xor i1 true, true
28 ; NOPROFILE-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
29 ; NOPROFILE-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
30 ; NOPROFILE:       3:
31 ; NOPROFILE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
32 ; NOPROFILE-NEXT:    unreachable
33 ; NOPROFILE:       4:
34 ; NOPROFILE-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
35 ; NOPROFILE-NEXT:    ret i32 [[TMP5]]
37 ; NONE-LABEL: define dso_local noundef i32 @simple(
38 ; NONE-SAME: ptr noundef readonly [[TMP0:%.*]]) {
39 ; NONE-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
40 ; NONE-NEXT:    [[HOT:%.*]] = xor i1 false, true
41 ; NONE-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
42 ; NONE-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
43 ; NONE:       3:
44 ; NONE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
45 ; NONE-NEXT:    unreachable
46 ; NONE:       4:
47 ; NONE-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
48 ; NONE-NEXT:    ret i32 [[TMP5]]
50 ; ALL-LABEL: define dso_local noundef i32 @simple(
51 ; ALL-SAME: ptr noundef readonly [[TMP0:%.*]]) {
52 ; ALL-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
53 ; ALL-NEXT:    [[HOT:%.*]] = xor i1 true, true
54 ; ALL-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
55 ; ALL-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
56 ; ALL:       3:
57 ; ALL-NEXT:    tail call void @llvm.ubsantrap(i8 22)
58 ; ALL-NEXT:    unreachable
59 ; ALL:       4:
60 ; ALL-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
61 ; ALL-NEXT:    ret i32 [[TMP5]]
63 ; HOT99-LABEL: define dso_local noundef i32 @simple(
64 ; HOT99-SAME: ptr noundef readonly [[TMP0:%.*]]) {
65 ; HOT99-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
66 ; HOT99-NEXT:    [[HOT:%.*]] = xor i1 true, true
67 ; HOT99-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
68 ; HOT99-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
69 ; HOT99:       3:
70 ; HOT99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
71 ; HOT99-NEXT:    unreachable
72 ; HOT99:       4:
73 ; HOT99-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
74 ; HOT99-NEXT:    ret i32 [[TMP5]]
76 ; HOT70-LABEL: define dso_local noundef i32 @simple(
77 ; HOT70-SAME: ptr noundef readonly [[TMP0:%.*]]) {
78 ; HOT70-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
79 ; HOT70-NEXT:    [[HOT:%.*]] = xor i1 true, true
80 ; HOT70-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
81 ; HOT70-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
82 ; HOT70:       3:
83 ; HOT70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
84 ; HOT70-NEXT:    unreachable
85 ; HOT70:       4:
86 ; HOT70-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
87 ; HOT70-NEXT:    ret i32 [[TMP5]]
89 ; NONE99-LABEL: define dso_local noundef i32 @simple(
90 ; NONE99-SAME: ptr noundef readonly [[TMP0:%.*]]) {
91 ; NONE99-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
92 ; NONE99-NEXT:    [[HOT:%.*]] = xor i1 false, true
93 ; NONE99-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
94 ; NONE99-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
95 ; NONE99:       3:
96 ; NONE99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
97 ; NONE99-NEXT:    unreachable
98 ; NONE99:       4:
99 ; NONE99-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
100 ; NONE99-NEXT:    ret i32 [[TMP5]]
102 ; ALL70-LABEL: define dso_local noundef i32 @simple(
103 ; ALL70-SAME: ptr noundef readonly [[TMP0:%.*]]) {
104 ; ALL70-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
105 ; ALL70-NEXT:    [[HOT:%.*]] = xor i1 true, true
106 ; ALL70-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
107 ; ALL70-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
108 ; ALL70:       3:
109 ; ALL70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
110 ; ALL70-NEXT:    unreachable
111 ; ALL70:       4:
112 ; ALL70-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
113 ; ALL70-NEXT:    ret i32 [[TMP5]]
115   %chk = icmp eq ptr %0, null
116   %allow = call i1 @llvm.allow.ubsan.check(i8 22)
117   %hot = xor i1 %allow, true
118   %2 = or i1 %chk, %hot
119   br i1 %2, label %3, label %4
122   tail call void @llvm.ubsantrap(i8 22)
123   unreachable
126   %5 = load i32, ptr %0, align 4
127   ret i32 %5
131 define dso_local noundef i32 @hot(ptr noundef readonly %0) !prof !36 {
132 ; NOPROFILE-LABEL: define dso_local noundef i32 @hot(
133 ; NOPROFILE-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] {
134 ; NOPROFILE-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
135 ; NOPROFILE-NEXT:    [[HOT:%.*]] = xor i1 true, true
136 ; NOPROFILE-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
137 ; NOPROFILE-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
138 ; NOPROFILE:       3:
139 ; NOPROFILE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
140 ; NOPROFILE-NEXT:    unreachable
141 ; NOPROFILE:       4:
142 ; NOPROFILE-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
143 ; NOPROFILE-NEXT:    ret i32 [[TMP5]]
145 ; NONE-LABEL: define dso_local noundef i32 @hot(
146 ; NONE-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] {
147 ; NONE-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
148 ; NONE-NEXT:    [[HOT:%.*]] = xor i1 false, true
149 ; NONE-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
150 ; NONE-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
151 ; NONE:       3:
152 ; NONE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
153 ; NONE-NEXT:    unreachable
154 ; NONE:       4:
155 ; NONE-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
156 ; NONE-NEXT:    ret i32 [[TMP5]]
158 ; ALL-LABEL: define dso_local noundef i32 @hot(
159 ; ALL-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] {
160 ; ALL-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
161 ; ALL-NEXT:    [[HOT:%.*]] = xor i1 true, true
162 ; ALL-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
163 ; ALL-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
164 ; ALL:       3:
165 ; ALL-NEXT:    tail call void @llvm.ubsantrap(i8 22)
166 ; ALL-NEXT:    unreachable
167 ; ALL:       4:
168 ; ALL-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
169 ; ALL-NEXT:    ret i32 [[TMP5]]
171 ; HOT99-LABEL: define dso_local noundef i32 @hot(
172 ; HOT99-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] {
173 ; HOT99-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
174 ; HOT99-NEXT:    [[HOT:%.*]] = xor i1 false, true
175 ; HOT99-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
176 ; HOT99-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
177 ; HOT99:       3:
178 ; HOT99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
179 ; HOT99-NEXT:    unreachable
180 ; HOT99:       4:
181 ; HOT99-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
182 ; HOT99-NEXT:    ret i32 [[TMP5]]
184 ; HOT70-LABEL: define dso_local noundef i32 @hot(
185 ; HOT70-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] {
186 ; HOT70-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
187 ; HOT70-NEXT:    [[HOT:%.*]] = xor i1 true, true
188 ; HOT70-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
189 ; HOT70-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
190 ; HOT70:       3:
191 ; HOT70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
192 ; HOT70-NEXT:    unreachable
193 ; HOT70:       4:
194 ; HOT70-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
195 ; HOT70-NEXT:    ret i32 [[TMP5]]
197 ; NONE99-LABEL: define dso_local noundef i32 @hot(
198 ; NONE99-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] {
199 ; NONE99-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
200 ; NONE99-NEXT:    [[HOT:%.*]] = xor i1 false, true
201 ; NONE99-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
202 ; NONE99-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
203 ; NONE99:       3:
204 ; NONE99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
205 ; NONE99-NEXT:    unreachable
206 ; NONE99:       4:
207 ; NONE99-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
208 ; NONE99-NEXT:    ret i32 [[TMP5]]
210 ; ALL70-LABEL: define dso_local noundef i32 @hot(
211 ; ALL70-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF16:![0-9]+]] {
212 ; ALL70-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
213 ; ALL70-NEXT:    [[HOT:%.*]] = xor i1 true, true
214 ; ALL70-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
215 ; ALL70-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
216 ; ALL70:       3:
217 ; ALL70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
218 ; ALL70-NEXT:    unreachable
219 ; ALL70:       4:
220 ; ALL70-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
221 ; ALL70-NEXT:    ret i32 [[TMP5]]
223   %chk = icmp eq ptr %0, null
224   %allow = call i1 @llvm.allow.ubsan.check(i8 22)
225   %hot = xor i1 %allow, true
226   %2 = or i1 %chk, %hot
227   br i1 %2, label %3, label %4
230   tail call void @llvm.ubsantrap(i8 22)
231   unreachable
234   %5 = load i32, ptr %0, align 4
235   ret i32 %5
238 define dso_local noundef i32 @veryHot(ptr noundef readonly %0) !prof !39 {
239 ; NOPROFILE-LABEL: define dso_local noundef i32 @veryHot(
240 ; NOPROFILE-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] {
241 ; NOPROFILE-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
242 ; NOPROFILE-NEXT:    [[HOT:%.*]] = xor i1 true, true
243 ; NOPROFILE-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
244 ; NOPROFILE-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
245 ; NOPROFILE:       3:
246 ; NOPROFILE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
247 ; NOPROFILE-NEXT:    unreachable
248 ; NOPROFILE:       4:
249 ; NOPROFILE-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
250 ; NOPROFILE-NEXT:    ret i32 [[TMP5]]
252 ; NONE-LABEL: define dso_local noundef i32 @veryHot(
253 ; NONE-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] {
254 ; NONE-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
255 ; NONE-NEXT:    [[HOT:%.*]] = xor i1 false, true
256 ; NONE-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
257 ; NONE-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
258 ; NONE:       3:
259 ; NONE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
260 ; NONE-NEXT:    unreachable
261 ; NONE:       4:
262 ; NONE-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
263 ; NONE-NEXT:    ret i32 [[TMP5]]
265 ; ALL-LABEL: define dso_local noundef i32 @veryHot(
266 ; ALL-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] {
267 ; ALL-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
268 ; ALL-NEXT:    [[HOT:%.*]] = xor i1 true, true
269 ; ALL-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
270 ; ALL-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
271 ; ALL:       3:
272 ; ALL-NEXT:    tail call void @llvm.ubsantrap(i8 22)
273 ; ALL-NEXT:    unreachable
274 ; ALL:       4:
275 ; ALL-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
276 ; ALL-NEXT:    ret i32 [[TMP5]]
278 ; HOT99-LABEL: define dso_local noundef i32 @veryHot(
279 ; HOT99-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] {
280 ; HOT99-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
281 ; HOT99-NEXT:    [[HOT:%.*]] = xor i1 false, true
282 ; HOT99-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
283 ; HOT99-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
284 ; HOT99:       3:
285 ; HOT99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
286 ; HOT99-NEXT:    unreachable
287 ; HOT99:       4:
288 ; HOT99-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
289 ; HOT99-NEXT:    ret i32 [[TMP5]]
291 ; HOT70-LABEL: define dso_local noundef i32 @veryHot(
292 ; HOT70-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] {
293 ; HOT70-NEXT:    [[TMP2:%.*]] = icmp eq ptr [[TMP0]], null
294 ; HOT70-NEXT:    [[HOT:%.*]] = xor i1 false, true
295 ; HOT70-NEXT:    [[TMP6:%.*]] = or i1 [[TMP2]], [[HOT]]
296 ; HOT70-NEXT:    br i1 [[TMP6]], label [[TMP3:%.*]], label [[TMP4:%.*]]
297 ; HOT70:       3:
298 ; HOT70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
299 ; HOT70-NEXT:    unreachable
300 ; HOT70:       4:
301 ; HOT70-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
302 ; HOT70-NEXT:    ret i32 [[TMP5]]
304 ; NONE99-LABEL: define dso_local noundef i32 @veryHot(
305 ; NONE99-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] {
306 ; NONE99-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
307 ; NONE99-NEXT:    [[HOT:%.*]] = xor i1 false, true
308 ; NONE99-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
309 ; NONE99-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
310 ; NONE99:       3:
311 ; NONE99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
312 ; NONE99-NEXT:    unreachable
313 ; NONE99:       4:
314 ; NONE99-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
315 ; NONE99-NEXT:    ret i32 [[TMP5]]
317 ; ALL70-LABEL: define dso_local noundef i32 @veryHot(
318 ; ALL70-SAME: ptr noundef readonly [[TMP0:%.*]]) !prof [[PROF17:![0-9]+]] {
319 ; ALL70-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP0]], null
320 ; ALL70-NEXT:    [[HOT:%.*]] = xor i1 false, true
321 ; ALL70-NEXT:    [[TMP2:%.*]] = or i1 [[CHK]], [[HOT]]
322 ; ALL70-NEXT:    br i1 [[TMP2]], label [[TMP3:%.*]], label [[TMP4:%.*]]
323 ; ALL70:       3:
324 ; ALL70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
325 ; ALL70-NEXT:    unreachable
326 ; ALL70:       4:
327 ; ALL70-NEXT:    [[TMP5:%.*]] = load i32, ptr [[TMP0]], align 4
328 ; ALL70-NEXT:    ret i32 [[TMP5]]
330   %chk = icmp eq ptr %0, null
331   %allow = call i1 @llvm.allow.ubsan.check(i8 22)
332   %hot = xor i1 %allow, true
333   %2 = or i1 %chk, %hot
334   br i1 %2, label %3, label %4
337   tail call void @llvm.ubsantrap(i8 22)
338   unreachable
341   %5 = load i32, ptr %0, align 4
342   ret i32 %5
346 define dso_local noundef i32 @branchColdFnHot(i32 noundef %0, ptr noundef readonly %1) !prof !39 {
347 ; NOPROFILE-LABEL: define dso_local noundef i32 @branchColdFnHot(
348 ; NOPROFILE-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] {
349 ; NOPROFILE-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
350 ; NOPROFILE-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]]
351 ; NOPROFILE:       4:
352 ; NOPROFILE-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
353 ; NOPROFILE-NEXT:    [[HOT:%.*]] = xor i1 true, true
354 ; NOPROFILE-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
355 ; NOPROFILE-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
356 ; NOPROFILE:       6:
357 ; NOPROFILE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
358 ; NOPROFILE-NEXT:    unreachable
359 ; NOPROFILE:       7:
360 ; NOPROFILE-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
361 ; NOPROFILE-NEXT:    br label [[TMP9]]
362 ; NOPROFILE:       9:
363 ; NOPROFILE-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
364 ; NOPROFILE-NEXT:    ret i32 [[TMP10]]
366 ; NONE-LABEL: define dso_local noundef i32 @branchColdFnHot(
367 ; NONE-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] {
368 ; NONE-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
369 ; NONE-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]]
370 ; NONE:       4:
371 ; NONE-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
372 ; NONE-NEXT:    [[HOT:%.*]] = xor i1 false, true
373 ; NONE-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
374 ; NONE-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
375 ; NONE:       6:
376 ; NONE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
377 ; NONE-NEXT:    unreachable
378 ; NONE:       7:
379 ; NONE-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
380 ; NONE-NEXT:    br label [[TMP9]]
381 ; NONE:       9:
382 ; NONE-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
383 ; NONE-NEXT:    ret i32 [[TMP10]]
385 ; ALL-LABEL: define dso_local noundef i32 @branchColdFnHot(
386 ; ALL-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] {
387 ; ALL-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
388 ; ALL-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]]
389 ; ALL:       4:
390 ; ALL-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP1]], null
391 ; ALL-NEXT:    [[HOT:%.*]] = xor i1 true, true
392 ; ALL-NEXT:    [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]]
393 ; ALL-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]]
394 ; ALL:       6:
395 ; ALL-NEXT:    tail call void @llvm.ubsantrap(i8 22)
396 ; ALL-NEXT:    unreachable
397 ; ALL:       7:
398 ; ALL-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
399 ; ALL-NEXT:    br label [[TMP9]]
400 ; ALL:       9:
401 ; ALL-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
402 ; ALL-NEXT:    ret i32 [[TMP10]]
404 ; HOT99-LABEL: define dso_local noundef i32 @branchColdFnHot(
405 ; HOT99-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] {
406 ; HOT99-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
407 ; HOT99-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]]
408 ; HOT99:       4:
409 ; HOT99-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
410 ; HOT99-NEXT:    [[HOT:%.*]] = xor i1 true, true
411 ; HOT99-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
412 ; HOT99-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
413 ; HOT99:       6:
414 ; HOT99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
415 ; HOT99-NEXT:    unreachable
416 ; HOT99:       7:
417 ; HOT99-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
418 ; HOT99-NEXT:    br label [[TMP9]]
419 ; HOT99:       9:
420 ; HOT99-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
421 ; HOT99-NEXT:    ret i32 [[TMP10]]
423 ; HOT70-LABEL: define dso_local noundef i32 @branchColdFnHot(
424 ; HOT70-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] {
425 ; HOT70-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
426 ; HOT70-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]]
427 ; HOT70:       4:
428 ; HOT70-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
429 ; HOT70-NEXT:    [[HOT:%.*]] = xor i1 true, true
430 ; HOT70-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
431 ; HOT70-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
432 ; HOT70:       6:
433 ; HOT70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
434 ; HOT70-NEXT:    unreachable
435 ; HOT70:       7:
436 ; HOT70-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
437 ; HOT70-NEXT:    br label [[TMP9]]
438 ; HOT70:       9:
439 ; HOT70-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
440 ; HOT70-NEXT:    ret i32 [[TMP10]]
442 ; NONE99-LABEL: define dso_local noundef i32 @branchColdFnHot(
443 ; NONE99-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] {
444 ; NONE99-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
445 ; NONE99-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]]
446 ; NONE99:       4:
447 ; NONE99-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP1]], null
448 ; NONE99-NEXT:    [[HOT:%.*]] = xor i1 false, true
449 ; NONE99-NEXT:    [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]]
450 ; NONE99-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]]
451 ; NONE99:       6:
452 ; NONE99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
453 ; NONE99-NEXT:    unreachable
454 ; NONE99:       7:
455 ; NONE99-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
456 ; NONE99-NEXT:    br label [[TMP9]]
457 ; NONE99:       9:
458 ; NONE99-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
459 ; NONE99-NEXT:    ret i32 [[TMP10]]
461 ; ALL70-LABEL: define dso_local noundef i32 @branchColdFnHot(
462 ; ALL70-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF17]] {
463 ; ALL70-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
464 ; ALL70-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF18:![0-9]+]]
465 ; ALL70:       4:
466 ; ALL70-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP1]], null
467 ; ALL70-NEXT:    [[HOT:%.*]] = xor i1 true, true
468 ; ALL70-NEXT:    [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]]
469 ; ALL70-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]]
470 ; ALL70:       6:
471 ; ALL70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
472 ; ALL70-NEXT:    unreachable
473 ; ALL70:       7:
474 ; ALL70-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
475 ; ALL70-NEXT:    br label [[TMP9]]
476 ; ALL70:       9:
477 ; ALL70-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
478 ; ALL70-NEXT:    ret i32 [[TMP10]]
480   %3 = icmp eq i32 %0, 0
481   br i1 %3, label %9, label %4, !prof !38
484   %chk = icmp eq ptr %1, null
485   %allow = call i1 @llvm.allow.ubsan.check(i8 22)
486   %hot = xor i1 %allow, true
487   %5 = or i1 %chk, %hot
488   br i1 %5, label %6, label %7
491   tail call void @llvm.ubsantrap(i8 22) #2
492   unreachable
495   %8 = load i32, ptr %1, align 4
496   br label %9
499   %10 = phi i32 [ %8, %7 ], [ 0, %2 ]
500   ret i32 %10
503 define dso_local noundef i32 @branchHotFnCold(i32 noundef %0, ptr noundef readonly %1) !prof !36 {
504 ; NOPROFILE-LABEL: define dso_local noundef i32 @branchHotFnCold(
505 ; NOPROFILE-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] {
506 ; NOPROFILE-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
507 ; NOPROFILE-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]]
508 ; NOPROFILE:       4:
509 ; NOPROFILE-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
510 ; NOPROFILE-NEXT:    [[HOT:%.*]] = xor i1 true, true
511 ; NOPROFILE-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
512 ; NOPROFILE-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
513 ; NOPROFILE:       6:
514 ; NOPROFILE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
515 ; NOPROFILE-NEXT:    unreachable
516 ; NOPROFILE:       7:
517 ; NOPROFILE-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
518 ; NOPROFILE-NEXT:    br label [[TMP9]]
519 ; NOPROFILE:       9:
520 ; NOPROFILE-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
521 ; NOPROFILE-NEXT:    ret i32 [[TMP10]]
523 ; NONE-LABEL: define dso_local noundef i32 @branchHotFnCold(
524 ; NONE-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] {
525 ; NONE-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
526 ; NONE-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]]
527 ; NONE:       4:
528 ; NONE-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
529 ; NONE-NEXT:    [[HOT:%.*]] = xor i1 false, true
530 ; NONE-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
531 ; NONE-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
532 ; NONE:       6:
533 ; NONE-NEXT:    tail call void @llvm.ubsantrap(i8 22)
534 ; NONE-NEXT:    unreachable
535 ; NONE:       7:
536 ; NONE-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
537 ; NONE-NEXT:    br label [[TMP9]]
538 ; NONE:       9:
539 ; NONE-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
540 ; NONE-NEXT:    ret i32 [[TMP10]]
542 ; ALL-LABEL: define dso_local noundef i32 @branchHotFnCold(
543 ; ALL-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] {
544 ; ALL-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
545 ; ALL-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]]
546 ; ALL:       4:
547 ; ALL-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP1]], null
548 ; ALL-NEXT:    [[HOT:%.*]] = xor i1 true, true
549 ; ALL-NEXT:    [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]]
550 ; ALL-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]]
551 ; ALL:       6:
552 ; ALL-NEXT:    tail call void @llvm.ubsantrap(i8 22)
553 ; ALL-NEXT:    unreachable
554 ; ALL:       7:
555 ; ALL-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
556 ; ALL-NEXT:    br label [[TMP9]]
557 ; ALL:       9:
558 ; ALL-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
559 ; ALL-NEXT:    ret i32 [[TMP10]]
561 ; HOT99-LABEL: define dso_local noundef i32 @branchHotFnCold(
562 ; HOT99-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] {
563 ; HOT99-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
564 ; HOT99-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]]
565 ; HOT99:       4:
566 ; HOT99-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
567 ; HOT99-NEXT:    [[HOT:%.*]] = xor i1 false, true
568 ; HOT99-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
569 ; HOT99-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
570 ; HOT99:       6:
571 ; HOT99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
572 ; HOT99-NEXT:    unreachable
573 ; HOT99:       7:
574 ; HOT99-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
575 ; HOT99-NEXT:    br label [[TMP9]]
576 ; HOT99:       9:
577 ; HOT99-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
578 ; HOT99-NEXT:    ret i32 [[TMP10]]
580 ; HOT70-LABEL: define dso_local noundef i32 @branchHotFnCold(
581 ; HOT70-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] {
582 ; HOT70-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
583 ; HOT70-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]]
584 ; HOT70:       4:
585 ; HOT70-NEXT:    [[TMP5:%.*]] = icmp eq ptr [[TMP1]], null
586 ; HOT70-NEXT:    [[HOT:%.*]] = xor i1 true, true
587 ; HOT70-NEXT:    [[TMP11:%.*]] = or i1 [[TMP5]], [[HOT]]
588 ; HOT70-NEXT:    br i1 [[TMP11]], label [[TMP6:%.*]], label [[TMP7:%.*]]
589 ; HOT70:       6:
590 ; HOT70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
591 ; HOT70-NEXT:    unreachable
592 ; HOT70:       7:
593 ; HOT70-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
594 ; HOT70-NEXT:    br label [[TMP9]]
595 ; HOT70:       9:
596 ; HOT70-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
597 ; HOT70-NEXT:    ret i32 [[TMP10]]
599 ; NONE99-LABEL: define dso_local noundef i32 @branchHotFnCold(
600 ; NONE99-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] {
601 ; NONE99-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
602 ; NONE99-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]]
603 ; NONE99:       4:
604 ; NONE99-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP1]], null
605 ; NONE99-NEXT:    [[HOT:%.*]] = xor i1 false, true
606 ; NONE99-NEXT:    [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]]
607 ; NONE99-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]]
608 ; NONE99:       6:
609 ; NONE99-NEXT:    tail call void @llvm.ubsantrap(i8 22)
610 ; NONE99-NEXT:    unreachable
611 ; NONE99:       7:
612 ; NONE99-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
613 ; NONE99-NEXT:    br label [[TMP9]]
614 ; NONE99:       9:
615 ; NONE99-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
616 ; NONE99-NEXT:    ret i32 [[TMP10]]
618 ; ALL70-LABEL: define dso_local noundef i32 @branchHotFnCold(
619 ; ALL70-SAME: i32 noundef [[TMP0:%.*]], ptr noundef readonly [[TMP1:%.*]]) !prof [[PROF16]] {
620 ; ALL70-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[TMP0]], 0
621 ; ALL70-NEXT:    br i1 [[TMP3]], label [[TMP9:%.*]], label [[TMP4:%.*]], !prof [[PROF19:![0-9]+]]
622 ; ALL70:       4:
623 ; ALL70-NEXT:    [[CHK:%.*]] = icmp eq ptr [[TMP1]], null
624 ; ALL70-NEXT:    [[HOT:%.*]] = xor i1 true, true
625 ; ALL70-NEXT:    [[TMP5:%.*]] = or i1 [[CHK]], [[HOT]]
626 ; ALL70-NEXT:    br i1 [[TMP5]], label [[TMP6:%.*]], label [[TMP7:%.*]]
627 ; ALL70:       6:
628 ; ALL70-NEXT:    tail call void @llvm.ubsantrap(i8 22)
629 ; ALL70-NEXT:    unreachable
630 ; ALL70:       7:
631 ; ALL70-NEXT:    [[TMP8:%.*]] = load i32, ptr [[TMP1]], align 4
632 ; ALL70-NEXT:    br label [[TMP9]]
633 ; ALL70:       9:
634 ; ALL70-NEXT:    [[TMP10:%.*]] = phi i32 [ [[TMP8]], [[TMP7]] ], [ 0, [[TMP2:%.*]] ]
635 ; ALL70-NEXT:    ret i32 [[TMP10]]
637   %3 = icmp eq i32 %0, 0
638   br i1 %3, label %9, label %4, !prof !37
641   %chk = icmp eq ptr %1, null
642   %allow = call i1 @llvm.allow.ubsan.check(i8 22)
643   %hot = xor i1 %allow, true
644   %5 = or i1 %chk, %hot
645   br i1 %5, label %6, label %7
648   tail call void @llvm.ubsantrap(i8 22) #2
649   unreachable
652   %8 = load i32, ptr %1, align 4
653   br label %9
656   %10 = phi i32 [ %8, %7 ], [ 0, %2 ]
657   ret i32 %10
660 !llvm.module.flags = !{!6}
661 !6 = !{i32 1, !"ProfileSummary", !7}
662 !7 = !{!8, !9, !10, !11, !12, !13, !14, !17}
663 !8 = !{!"ProfileFormat", !"InstrProf"}
664 !9 = !{!"TotalCount", i64 30000}
665 !10 = !{!"MaxCount", i64 10000}
666 !11 = !{!"MaxInternalCount", i64 10000}
667 !12 = !{!"MaxFunctionCount", i64 10000}
668 !13 = !{!"NumCounts", i64 3}
669 !14 = !{!"NumFunctions", i64 5}
670 !17 = !{!"DetailedSummary", !18}
671 !18 = !{!19, !29, !30, !32, !34}
672 !19 = !{i32 10000, i64 10000, i32 3}
673 !29 = !{i32 950000, i64 5000, i32 3}
674 !30 = !{i32 990000, i64 500, i32 4}
675 !32 = !{i32 999900, i64 250, i32 4}
676 !34 = !{i32 999999, i64 1, i32 6}
678 !36 = !{!"function_entry_count", i64 1000}
679 !39 = !{!"function_entry_count", i64 7000}
681 !37 = !{!"branch_weights", i32 1, i32 1000}
682 !38 = !{!"branch_weights", i32 1000, i32 1}
685 ; NOPROFILE: [[PROF16]] = !{!"function_entry_count", i64 1000}
686 ; NOPROFILE: [[PROF17]] = !{!"function_entry_count", i64 7000}
687 ; NOPROFILE: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
688 ; NOPROFILE: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}
690 ; NONE: [[PROF16]] = !{!"function_entry_count", i64 1000}
691 ; NONE: [[PROF17]] = !{!"function_entry_count", i64 7000}
692 ; NONE: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
693 ; NONE: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}
695 ; ALL: [[PROF16]] = !{!"function_entry_count", i64 1000}
696 ; ALL: [[PROF17]] = !{!"function_entry_count", i64 7000}
697 ; ALL: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
698 ; ALL: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}
700 ; HOT99: [[PROF16]] = !{!"function_entry_count", i64 1000}
701 ; HOT99: [[PROF17]] = !{!"function_entry_count", i64 7000}
702 ; HOT99: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
703 ; HOT99: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}
705 ; HOT70: [[PROF16]] = !{!"function_entry_count", i64 1000}
706 ; HOT70: [[PROF17]] = !{!"function_entry_count", i64 7000}
707 ; HOT70: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
708 ; HOT70: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}
710 ; NONE99: [[PROF16]] = !{!"function_entry_count", i64 1000}
711 ; NONE99: [[PROF17]] = !{!"function_entry_count", i64 7000}
712 ; NONE99: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
713 ; NONE99: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}
715 ; ALL70: [[PROF16]] = !{!"function_entry_count", i64 1000}
716 ; ALL70: [[PROF17]] = !{!"function_entry_count", i64 7000}
717 ; ALL70: [[PROF18]] = !{!"branch_weights", i32 1000, i32 1}
718 ; ALL70: [[PROF19]] = !{!"branch_weights", i32 1, i32 1000}