llvm-project/clang/test/Profile
Vedant Kumar 6186971a4a [PGO] Detect more structural changes with the stable hash
Lifting from Bob Wilson's notes: The hash value that we compute and
store in PGO profile data to detect out-of-date profiles does not
include enough information. This means that many significant changes to
the source will not cause compiler warnings about the profile being out
of date, and worse, we may continue to use the outdated profile data to
make bad optimization decisions.  There is some tension here because
some source changes won't affect PGO and we don't want to invalidate the
profile unnecessarily.

This patch adds a new hashing scheme which is more sensitive to loop
nesting, conditions, and out-of-order control flow. Here are examples
which show snippets which get the same hash under the current scheme,
and different hashes under the new scheme:

Loop Nesting Example
--------------------

  // Snippet 1
  while (foo()) {
    while (bar()) {}
  }

  // Snippet 2
  while (foo()) {}
  while (bar()) {}

Condition Example
-----------------

  // Snippet 1
  if (foo())
    bar();
  baz();

  // Snippet 2
  if (foo())
    bar();
  else
    baz();

Out-of-order Control Flow Example
---------------------------------

  // Snippet 1
  while (foo()) {
    if (bar()) {}
    baz();
  }

  // Snippet 2
  while (foo()) {
    if (bar())
      continue;
    baz();
  }

In each of these cases, it's useful to differentiate between the
snippets because swapping their profiles gives bad optimization hints.

The new hashing scheme considers some logical operators in an effort to
detect more changes in conditions. This isn't a perfect scheme. E.g, it
does not produce the same hash for these equivalent snippets:

  // Snippet 1
  bool c = !a || b;
  if (d && e) {}

  // Snippet 2
  bool f = d && e;
  bool c = !a || b;
  if (f) {}

This would require an expensive data flow analysis. Short of that, the
new hashing scheme looks reasonably complete, based on a scan over the
statements we place counters on.

Profiles which use the old version of the PGO hash remain valid and can
be used without issue (there are tests in tree which check this).

rdar://17068282

Differential Revision: https://reviews.llvm.org/D39446

llvm-svn: 318229
2017-11-14 23:56:53 +00:00
..
Inputs [PGO] Detect more structural changes with the stable hash 2017-11-14 23:56:53 +00:00
README
c-avoid-direct-call.c [PGO] Avoid instrumenting constants at value sites 2016-03-31 18:41:34 +00:00
c-captured.c [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
c-counter-overflows.c [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
c-general.c [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
c-generate.c [profiling] Tighten test cases which refer to "profn" vars. NFC. 2017-02-18 01:50:14 +00:00
c-indirect-call.c Add test for D21736. 2016-11-22 20:03:40 +00:00
c-linkage-available_externally.c [Profile] Update testcase for r283948 (NFC) 2016-10-11 21:56:05 +00:00
c-linkage.c
c-outdated-data.c [PGO] Detect more structural changes with the stable hash 2017-11-14 23:56:53 +00:00
c-ternary.c Weaken test/Profile/c-ternary.c 2017-02-25 07:21:23 +00:00
c-unprofiled-blocks.c [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
c-unprofiled.c [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
c-unreachable-after-switch.c
cxx-class.cpp [profiling] PR31992: Don't skip interesting non-base constructors 2017-02-24 01:15:19 +00:00
cxx-hash-v2.cpp [PGO] Detect more structural changes with the stable hash 2017-11-14 23:56:53 +00:00
cxx-implicit.cpp
cxx-indirect-call.cpp Add test for D21736. 2016-11-22 20:03:40 +00:00
cxx-lambda.cpp [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
cxx-linkage.cpp
cxx-missing-bodies.cpp [Profile] Do not assign counters to functions without bodies 2017-06-30 21:02:14 +00:00
cxx-rangefor.cpp [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
cxx-stmt-initializers.cpp [Coverage] Support for C++17 if initializers 2016-10-14 23:38:16 +00:00
cxx-structors.cpp Fix a typo. NFC. 2017-06-30 21:02:14 +00:00
cxx-templates.cpp [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
cxx-throws.cpp [profile] Use cc1 in these tests instead of the driver. 2016-04-23 02:11:16 +00:00
cxx-virtual-destructor-calls.cpp [profiling] Update test cases to deal with name variable change (NFC) 2017-02-14 20:03:56 +00:00
def-assignop.cpp
def-ctors.cpp
def-dtors.cpp
func-entry.c Make '-disable-llvm-optzns' an alias for '-disable-llvm-passes'. 2016-12-23 00:23:01 +00:00
gcc-flag-compatibility.c Fix two test cases I missed updating in r291850. Sorry for the noise. 2017-01-12 22:48:28 +00:00
objc-general.m [PGO] Detect more structural changes with the stable hash 2017-11-14 23:56:53 +00:00
profile-does-not-exist.c [PGO] Change profile use cc1 option to handle IR level profiles 2016-03-02 20:59:36 +00:00
profile-summary.c Make '-disable-llvm-optzns' an alias for '-disable-llvm-passes'. 2016-12-23 00:23:01 +00:00

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.