llvm-project/clang/test/Frontend
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
Weverything.c
Wno-everything.c
aarch64-target-cpu.c [AArch64] Vulcan is now ThunderXT99 2017-03-07 21:24:53 +00:00
absolute-paths.c Add support for -fdiagnostics-absolute-paths: printing absolute paths in diagnostics 2016-08-26 15:45:36 +00:00
ast-codegen.c Revert "Revert r241620 and follow-up commits" and move the initialization 2015-07-08 01:00:30 +00:00
ast-main.c
ast-main.cpp
backend-diagnostic.c
backend-option.c Pass -backend-option to LLVM when there is no target machine. 2016-04-12 20:22:32 +00:00
cc1-return-codes.c
clang-abi-compat.cpp Add flag to request Clang is ABI-compatible with older versions of itself 2017-08-26 01:04:35 +00:00
cpp-output.c
darwin-eabi.c
darwin-version.c Allow iOS and tvOS version numbers with 2-digit major version numbers. 2016-07-18 20:29:14 +00:00
dependency-gen-escaping.c clang/test/Frontend/dependency-gen-escaping.c: Appease win32 hosts. Investigating. 2015-05-14 07:37:35 +00:00
dependency-gen.c Re-apply r267784, r267824 and r267830. 2016-04-28 17:09:37 +00:00
dependency-generation-crash.c Fix typo in my last commit. 2015-03-03 00:12:08 +00:00
diagnostics-option-names.c
disable-output.c
embed-bitcode.ll Change embed-bitcode linkage type 2016-05-16 18:54:58 +00:00
exceptions.c
float16.cpp Extend -ast-dump for CXXRecordDecl to dump the flags from the DefinitionData. 2017-09-22 00:11:15 +00:00
force-include-not-found.c Add back null check removed accidentally in r250554 2015-10-20 18:45:57 +00:00
gnu-inline.c Don't accept -std= values that would switch us to a different source language. 2017-04-26 23:44:33 +00:00
gnu-mcount.c Switch -mcount and -finstrument-functions to emit EnterExitInstrumenter attributes 2017-11-14 21:13:27 +00:00
hexagon-target-basic.c
iframework.c Add -iframeworkwithsysroot compiler option 2017-03-13 11:17:41 +00:00
include-duplicate-removal.c [Frontend] Fix an issue where a quoted search path is incorrectly 2016-12-02 09:51:51 +00:00
int128.cpp Provide __GLIBCXX_TYPE_INT_N_0 and __GLIBCXX_BITSIZE_INT_N_0 when in C++ gnu language extensions. 2016-07-21 07:44:41 +00:00
invalid-o-level.c Fix handling of invalid -O options. 2014-12-16 21:57:03 +00:00
ir-support-codegen.ll
ir-support-errors.ll
ir-support.c
lit.local.cfg [OpenCL] Actually activate Frontend/opencl.cl test and fix test bugs 2016-07-14 12:56:21 +00:00
macros.c
mfpmath.c
mips-long-double.c
objc-bool-is-bool.m [Frontend] The macro that describes the Objective-C bool type should 2017-01-20 16:48:25 +00:00
opencl.cl [OpenCL] Actually activate Frontend/opencl.cl test and fix test bugs 2016-07-14 12:56:21 +00:00
optimization-remark-analysis.c Add backend dignostic printer for unsupported features 2016-02-02 13:52:52 +00:00
optimization-remark-extra-analysis.c Fix ClangDiagnosticHandler::is*RemarkEnabled members 2017-09-19 17:59:40 +00:00
optimization-remark-line-directive.c Stop messing with the 'g' group of options in CompilerInvocation. 2015-10-08 04:24:12 +00:00
optimization-remark-options.c [ValueTracking] Enabling ValueTracking patch by default (recommit). Part 1. 2017-08-10 11:22:52 +00:00
optimization-remark-with-hotness.c [clang] Fix tests for Emitting Single Inline Remark 2017-08-21 16:40:35 +00:00
optimization-remark.c [clang] Fix tests for Emitting Single Inline Remark 2017-08-21 16:40:35 +00:00
output-failures.c
plugin-annotate-functions.c Add a PragmaHandler Registry for plugins to add PragmaHandlers to 2016-04-04 14:22:58 +00:00
plugin-delayed-template.cpp Don't leak TemplateIds when a plugin parses late-parsed templates at TU end. 2015-05-17 01:07:16 +00:00
plugin-vs-debug-info.cpp Give this test that uses Itanium mangling a triple 2016-11-30 00:31:16 +00:00
plugins.c Revert r260266 (and r260276), "clang-cl: Enable plugins on Windows" 2016-02-11 16:43:08 +00:00
pp-only-no-editor-placeholders.c [PR33394] Avoid lexing editor placeholders when Clang is used only 2017-06-16 20:13:39 +00:00
preprocessed-input.i Use filename in linemarker when compiling preprocessed source (Revised) 2017-03-07 20:20:23 +00:00
preprocessed-output-macro-first-token.c
print-header-includes.c clang-cl: Include /FI headers in /showIncludes output. 2016-03-23 18:00:22 +00:00
profile-sample-use-loc-tracking.c Use NoDebug compile units to mark debug metadata used only for sample-based 2016-04-08 22:43:06 +00:00
remove-file-on-signal.c [Support] Use FILE_SHARE_DELETE to fix RemoveFileOnSignal on Windows 2017-08-04 21:52:00 +00:00
rewrite-includes-bom.c
rewrite-includes-cli-include.c
rewrite-includes-eof.c
rewrite-includes-filenotfound.c PR32848: There isn't necessarily a FileChanged or FileSkipped for every InclusionDirective callback. 2017-06-02 01:05:44 +00:00
rewrite-includes-header-cmd-line.c
rewrite-includes-invalid-hasinclude.c
rewrite-includes-line-markers.c PR26771: don't forget the " 2" (returning from #included file) linemarker after including an empty file with -frewrite-includes. 2017-04-29 00:54:03 +00:00
rewrite-includes-messages.c
rewrite-includes-missing.c
rewrite-includes-modules.c Add pragma to perform module import and use it in -E output. 2017-04-29 00:34:47 +00:00
rewrite-includes-warnings.c
rewrite-includes.c
rewrite-macros.c
source-col-map.c This test requires UTF-8 output to print the UT-8 characters. 2015-09-11 13:29:12 +00:00
stats-file.c CC1: Add -save-stats option 2016-09-26 18:53:34 +00:00
stdin.c
stdlang.c [OpenCL] Allow -std={cl|CL}{|1.1|1.2|2.0} in driver 2016-06-17 17:19:28 +00:00
system-header-line-directive-ms-lineendings.c Remove .gitattributes, add comment to lineendings. 2017-08-24 23:25:05 +00:00
system-header-line-directive.c Add test coverage for recent behavior change in GNU line marker pre-processing 2017-05-23 16:09:13 +00:00
system-header-prefix.c
trigraphs.cpp Add driver flags -ftrigraphs, -fno-trigraphs. 2014-12-23 22:32:37 +00:00
undef.c
unknown-pragmas.c
verify-directive.h
verify-fatal.c
verify-ignore-unexpected.c Add `-verify-ignore-unexpected` option to ignore unexpected diagnostics in VerifyDiagnosticsConsumer 2015-06-13 07:11:40 +00:00
verify-unknown-arg.c Destroy the diagnostic client first in ~DiagnosticEngine 2014-12-17 20:23:11 +00:00
verify.c
verify2.c
verify2.h
verify3.c
warning-mapping-1.c
warning-mapping-2.c
warning-mapping-3.c
warning-mapping-4.c
warning-mapping-5.c
warning-options.cpp
windows-nul.c
x86-target-cpu.c [X86] Add recent CPU strings to some of the tests that check other cpu names. 2017-01-10 06:02:16 +00:00
x86_64-nacl-types.cpp Fix copy-paste errors in the test 2015-02-23 22:08:10 +00:00