xref: /llvm-project/llvm/test/Transforms/lower-builtin-allow-check.ll (revision fa9ac62d02fd6b5028f301ee398c3d3a1c0eacae)
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
5;
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
10;
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
17
18target triple = "x86_64-pc-linux-gnu"
19
20declare void @llvm.ubsantrap(i8 immarg)
21declare i1 @llvm.allow.ubsan.check(i8 immarg)
22
23define 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]]
36;
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]]
49;
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]]
62;
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]]
75;
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]]
88;
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]]
101;
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]]
114;
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
120
1213:
122  tail call void @llvm.ubsantrap(i8 22)
123  unreachable
124
1254:
126  %5 = load i32, ptr %0, align 4
127  ret i32 %5
128}
129
130
131define 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]]
144;
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]]
157;
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]]
170;
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]]
183;
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]]
196;
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]]
209;
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]]
222;
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
228
2293:
230  tail call void @llvm.ubsantrap(i8 22)
231  unreachable
232
2334:
234  %5 = load i32, ptr %0, align 4
235  ret i32 %5
236}
237
238define 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]]
251;
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]]
264;
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]]
277;
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]]
290;
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]]
303;
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]]
316;
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]]
329;
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
335
3363:
337  tail call void @llvm.ubsantrap(i8 22)
338  unreachable
339
3404:
341  %5 = load i32, ptr %0, align 4
342  ret i32 %5
343}
344
345
346define 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]]
365;
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]]
384;
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]]
403;
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]]
422;
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]]
441;
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]]
460;
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]]
479;
480  %3 = icmp eq i32 %0, 0
481  br i1 %3, label %9, label %4, !prof !38
482
4834:
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
489
4906:
491  tail call void @llvm.ubsantrap(i8 22) #2
492  unreachable
493
4947:
495  %8 = load i32, ptr %1, align 4
496  br label %9
497
4989:
499  %10 = phi i32 [ %8, %7 ], [ 0, %2 ]
500  ret i32 %10
501}
502
503define 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]]
522;
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]]
541;
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]]
560;
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]]
579;
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]]
598;
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]]
617;
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]]
636;
637  %3 = icmp eq i32 %0, 0
638  br i1 %3, label %9, label %4, !prof !37
639
6404:
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
646
6476:
648  tail call void @llvm.ubsantrap(i8 22) #2
649  unreachable
650
6517:
652  %8 = load i32, ptr %1, align 4
653  br label %9
654
6559:
656  %10 = phi i32 [ %8, %7 ], [ 0, %2 ]
657  ret i32 %10
658}
659
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}
677
678!36 = !{!"function_entry_count", i64 1000}
679!39 = !{!"function_entry_count", i64 7000}
680
681!37 = !{!"branch_weights", i32 1, i32 1000}
682!38 = !{!"branch_weights", i32 1000, i32 1}
683
684;.
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}
689;.
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}
694;.
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}
699;.
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}
704;.
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}
709;.
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}
714;.
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}
719;.
720