Files
clang-p2996/clang/test/Profile/Inputs/c-general.proftext
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

158 lines
659 B
Plaintext

simple_loops
1245818015463121
4
1
100
100
75
conditionals
4190663230902537370
11
1
100
50
50
33
33
16
99
100
99
100
early_exits
8265526549255474475
9
1
0
51
1
25
1
25
1
0
jumps
15872630527555456493
22
1
1
0
1
0
0
1
0
1
2
3
2
0
3
0
1
1
1
10
0
10
9
switches
11892326508727782373
19
1
1
1
15
7
1
0
2
2
3
3
4
4
0
4
4
5
1
0
big_switch
16933280399284440835
17
1
32
32
1
0
1
1
11
11
1
1
15
15
1
1
2
2
boolean_operators
1245693242827665
8
1
100
34
66
17
34
33
50
boolop_loops
11270260636676715317
9
1
50
51
50
26
50
51
50
26
conditional_operator
54992
3
1
0
1
do_fallthrough
6898770640283947069
4
1
10
2
8
main
24
1
1
c-general.c:static_func
18129
2
1
10