ldc/tests/PGO/branching_switch.d
2016-06-20 17:28:27 +02:00

100 lines
3.2 KiB
D

// Test instrumentation of switch with non-constant case expression.
// RUN: %ldc -c -output-ll -fprofile-instr-generate -of=%t.ll %s && FileCheck %s --check-prefix=PROFGEN < %t.ll
// RUN: %ldc -fprofile-instr-generate=%t.profraw -run %s \
// RUN: && %profdata merge %t.profraw -o %t.profdata \
// RUN: && %ldc -boundscheck=off -c -output-ll -of=%t2.ll -fprofile-instr-use=%t.profdata %s \
// RUN: && FileCheck %s -check-prefix=PROFUSE < %t2.ll
extern(C): // simplify name mangling for simpler string matching
// PROFGEN-DAG: @[[BoB:__(llvm_profile_counters|profc)_bunch_of_branches]] ={{.*}} global [15 x i64] zeroinitializer
// PROFGEN-LABEL: @bunch_of_branches()
// PROFUSE-LABEL: @bunch_of_branches()
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 0
// PROFUSE-SAME: !prof ![[BoB0:[0-9]+]]
void bunch_of_branches() {
uint i;
uint two = 2;
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 1
// PROFUSE: br {{.*}} !prof ![[BoB1:[0-9]+]]
for (i = 1; i < 4; ++i) {
switch (i) {
// default counter:
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 10
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 3
case 1: // 1 + 1*gototarget
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 4
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 5
// PROFUSE: br {{.*}} !prof ![[BoB5:[0-9]+]]
if (i != 1) {}
goto default;
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 6
case 11: // 0x
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 7
// never reached, no branch weights
if (i != 11) {}
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 8
case two: // 1x
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 9
// PROFUSE: br {{.*}} !prof ![[BoB9:[0-9]+]]
if (i != 2) {}
goto case 1;
default: // 1 + 1*gototarget
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 11
// fall through
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 12
case 5: // 0 + 2*fallthrough
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 13
// PROFUSE: br {{.*}} !prof ![[BoB13:[0-9]+]]
if (i != 5) {}
break;
}
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 2
// Bunch of compares and branches is put at the end in IR
// PROFUSE: br {{.*}} !prof ![[BoB3:[0-9]+]]
// PROFUSE: br {{.*}} !prof ![[BoB6:[0-9]+]]
// PROFUSE: br {{.*}} !prof ![[BoB8:[0-9]+]]
// PROFUSE: br {{.*}} !prof ![[BoB12:[0-9]+]]
}
// PROFGEN: store {{.*}} @[[BoB]], i64 0, i64 14
// PROFUSE: br {{.*}} !prof ![[BoB14:[0-9]+]]
if (i) {}
}
// PROFGEN-LABEL: @_Dmain(
// PROFUSE-LABEL: @_Dmain(
extern(D):
void main() {
bunch_of_branches();
}
// PROFUSE-DAG: ![[BoB0]] = !{!"function_entry_count", i64 1}
// PROFUSE-DAG: ![[BoB1]] = !{!"branch_weights", i32 4, i32 2}
// PROFUSE-DAG: ![[BoB3]] = !{!"branch_weights", i32 2, i32 3}
// PROFUSE-DAG: ![[BoB6]] = !{!"branch_weights", i32 1, i32 3}
// PROFUSE-DAG: ![[BoB8]] = !{!"branch_weights", i32 2, i32 2}
// PROFUSE-DAG: ![[BoB12]] = !{!"branch_weights", i32 1, i32 2}
// PROFUSE-DAG: ![[BoB5]] = !{!"branch_weights", i32 2, i32 2}
// PROFUSE-DAG: ![[BoB9]] = !{!"branch_weights", i32 1, i32 2}
// PROFUSE-DAG: ![[BoB13]] = !{!"branch_weights", i32 4, i32 1}