forked from OSchip/llvm-project
bac6cd5bf8
Reimplements MisExpect diagnostics from D66324 to reconstruct its original checking methodology only using MD_prof branch_weights metadata. New checks rely on 2 invariants: 1) For frontend instrumentation, MD_prof branch_weights will always be populated before llvm.expect intrinsics are lowered. 2) for IR and sample profiling, llvm.expect intrinsics will always be lowered before branch_weights are populated from the IR profiles. These invariants allow the checking to assume how the existing branch weights are populated depending on the profiling method used, and emit the correct diagnostics. If these invariants are ever invalidated, the MisExpect related checks would need to be updated, potentially by re-introducing MD_misexpect metadata, and ensuring it always will be transformed the same way as branch_weights in other optimization passes. Frontend based profiling is now enabled without using LLVM Args, by introducing a new CodeGen option, and checking if the -Wmisexpect flag has been passed on the command line. Reviewed By: tejohnson Differential Revision: https://reviews.llvm.org/D115907 |
||
---|---|---|
.. | ||
Inputs | ||
README | ||
branch-logical-mixed.cpp | ||
branch-profdup.cpp | ||
c-avoid-direct-call.c | ||
c-captured.c | ||
c-collision.c | ||
c-counter-overflows.c | ||
c-general.c | ||
c-generate.c | ||
c-indirect-call.c | ||
c-linkage-available_externally.c | ||
c-linkage.c | ||
c-outdated-data.c | ||
c-ternary.c | ||
c-unprofiled-blocks.c | ||
c-unprofiled.c | ||
c-unreachable-after-switch.c | ||
coverage-prefix-map.c | ||
cxx-abc-deleting-dtor.cpp | ||
cxx-class.cpp | ||
cxx-hash-v2.cpp | ||
cxx-implicit.cpp | ||
cxx-indirect-call.cpp | ||
cxx-lambda.cpp | ||
cxx-linkage.cpp | ||
cxx-missing-bodies.cpp | ||
cxx-rangefor.cpp | ||
cxx-stmt-initializers.cpp | ||
cxx-structors.cpp | ||
cxx-templates.cpp | ||
cxx-throws.cpp | ||
cxx-virtual-destructor-calls.cpp | ||
def-assignop.cpp | ||
def-ctors.cpp | ||
def-dtors.cpp | ||
func-entry.c | ||
gcc-flag-compatibility-aix.c | ||
gcc-flag-compatibility.c | ||
misexpect-branch-cold.c | ||
misexpect-branch-nonconst-expected-val.c | ||
misexpect-branch-unpredictable.c | ||
misexpect-branch.c | ||
misexpect-switch-default.c | ||
misexpect-switch-nonconst.c | ||
misexpect-switch-only-default-case.c | ||
misexpect-switch.c | ||
objc-general.m | ||
profile-does-not-exist.c | ||
profile-summary.c |
README
These are tests for instrumentation based profiling. This specifically means the -fprofile-instr-generate and -fprofile-instr-use driver flags. Tests in this directory should usually test both: - the generation of instrumentation (-fprofile-instr-generate), and - the use of profile data from instrumented runs (-fprofile-instr-use). In order to test -fprofile-instr-use without actually running an instrumented program, .profdata files are checked into Inputs/. The input source files must include a main function such that building with -fprofile-instr-generate and running the resulting program generates the same .profdata file that is consumed by the tests for -fprofile-instr-use. Even tests that only check -fprofile-instr-use should include such a main function, so that profile data can be regenerated as the .profdata file format evolves.