xref: /llvm-project/llvm/test/Transforms/PGOProfile/PR41279.ll (revision 9ff36df5a4a7d52c51e950522870bb64912688d2)
1; Test that instrumentaiton works fine for the case of failing the split critical edges.
2; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --check-prefix=GEN
3; RUN: llvm-profdata merge %S/Inputs/PR41279.proftext -o %t.profdata
4; RUN: opt < %s -passes=pgo-instr-use -pgo-test-profile-file=%t.profdata -S | FileCheck %s --check-prefix=USE
5
6declare void @f3(ptr, ptr, i64)
7declare { ptr, i64 } @f0(ptr)
8declare i64 @f1()
9declare void @invok2(ptr, ptr noalias readonly align 1, i64)
10declare void @invok1(ptr, ptr, i64)
11declare i32 @__CxxFrameHandler3(...)
12
13define void @foo(ptr, ptr) personality ptr @__CxxFrameHandler3 {
14; USE-LABEL: @foo
15; USE-SAME: !prof ![[FUNC_ENTRY_COUNT:[0-9]+]]
16
17  %3 = alloca i8, align 1
18  store i8 0, ptr %3, align 1
19  %4 = call i64 @f1()
20  %5 = icmp ult i64 %4, 32
21  br i1 %5, label %7, label %13
22; USE: br i1 %5, label %7, label %13
23; USE-SAME: !prof ![[BW_ENTRY1:[0-9]+]]
24
256:
26  cleanupret from %17 unwind to caller
27; GEN: 6:
28; GEN:  call void @llvm.instrprof.increment(ptr @__profn_foo, i64 {{[0-9]+}}, i32 4, i32 2)
29
307:
31  store i8 1, ptr %3, align 1
32  %8 = call { ptr, i64 } @f0(ptr %0)
33  %9 = extractvalue { ptr, i64 } %8, 0
34  %10 = extractvalue { ptr, i64 } %8, 1
35  invoke void @invok1(ptr %1, ptr %0, i64 1)
36          to label %11 unwind label %16
37; GEN: 7:
38; GEN-NOT: call void @llvm.instrprof.increment
39
4011:
41  store i8 0, ptr %3, align 1
42  invoke void @invok2(ptr %1, ptr noalias readonly align 1 %9, i64 %10)
43          to label %12 unwind label %16
44; GEN: 11:
45; GEN-NOT: call void @llvm.instrprof.increment
46
4712:
48  store i8 0, ptr %3, align 1
49  br label %14
50; GEN: 12:
51; GEN:  call void @llvm.instrprof.increment(ptr @__profn_foo, i64 {{[0-9]+}}, i32 4, i32 1)
52
5313:
54  call void @f3(ptr %0, ptr %1, i64 1)
55  br label %14
56; GEN: 13:
57; GEN:  call void @llvm.instrprof.increment(ptr @__profn_foo, i64 {{[0-9]+}}, i32 4, i32 0)
58
5914:
60  ret void
61
6215:
63  store i8 0, ptr %3, align 1
64  br label %6
65; GEN: 15:
66; GEN:  call void @llvm.instrprof.increment(ptr @__profn_foo, i64 {{[0-9]+}}, i32 4, i32 3)
67
6816:
69  %17 = cleanuppad within none []
70  %18 = load i8, ptr %3, align 1
71  %19 = trunc i8 %18 to i1
72  br i1 %19, label %15, label %6
73; USE: br i1 %19, label %15, label %6
74; USE-SAME: !prof ![[BW_ENTRY2:[0-9]+]]
75}
76
77; USE-DAG: {{![0-9]+}} = !{i32 1, !"ProfileSummary", {{![0-9]+}}}
78; USE-DAG: {{![0-9]+}} = !{!"DetailedSummary", {{![0-9]+}}}
79; USE-DAG: ![[FUNC_ENTRY_COUNT]] = !{!"function_entry_count", i64 8}
80; USE-DAG: ![[BW_ENTRY1]] = !{!"branch_weights", i32 5, i32 3}
81; USE-DAG: ![[BW_ENTRY2]] = !{!"branch_weights", i32 2, i32 1}
82
83