danielcdh created this revision. Herald added subscribers: Prazek, mehdi_amini.
Because SamplePGO passes will be invoked twice in ThinLTO build: once at compile phase, the other at backend. We want to make sure the IR at the 2nd phase matches the hot part in pro file, thus we do not want to inline hot callsites in the first phase. https://reviews.llvm.org/D31202 Files: lib/CodeGen/BackendUtil.cpp test/CodeGen/Inputs/pgo-sample-thinlto-summary.prof test/CodeGen/pgo-sample-thinlto-summary.c Index: test/CodeGen/pgo-sample-thinlto-summary.c =================================================================== --- /dev/null +++ test/CodeGen/pgo-sample-thinlto-summary.c @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -o - 2>&1 | FileCheck %s -check-prefix=INLINE +// RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -flto=thin -o - 2>&1 | FileCheck %s -check-prefix=NOINLINE +// Checks if hot call is inlined by normal compile, but not inlined by +// thinlto compile. + +int baz(int); +int g; + +void foo(int n) { + for (int i = 0; i < n; i++) + g += baz(i); +} + +// INLINE-NOT: call{{.*}}foo +// NOINLINE: call{{.*}}foo +void bar(int n) { + for (int i = 0; i < n; i++) + foo(i); +} Index: test/CodeGen/Inputs/pgo-sample-thinlto-summary.prof =================================================================== --- /dev/null +++ test/CodeGen/Inputs/pgo-sample-thinlto-summary.prof @@ -0,0 +1,2 @@ +bar:100:100 + 2: 2000 foo:2000 Index: lib/CodeGen/BackendUtil.cpp =================================================================== --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -318,8 +318,13 @@ !CodeGenOpts.DisableLifetimeMarkers); PMBuilder.Inliner = createAlwaysInlinerLegacyPass(InsertLifetimeIntrinsics); } else { + // We do not want to inline hot callsites for SamplePGO module-summary build + // because profile annotation will happen again in ThinLTO backend, and we + // want the IR of the hot path to match the profile. PMBuilder.Inliner = createFunctionInliningPass( - CodeGenOpts.OptimizationLevel, CodeGenOpts.OptimizeSize); + CodeGenOpts.OptimizationLevel, CodeGenOpts.OptimizeSize, + (!CodeGenOpts.SampleProfileFile.empty() && + CodeGenOpts.EmitSummaryIndex)); } PMBuilder.OptLevel = CodeGenOpts.OptimizationLevel;
Index: test/CodeGen/pgo-sample-thinlto-summary.c =================================================================== --- /dev/null +++ test/CodeGen/pgo-sample-thinlto-summary.c @@ -0,0 +1,19 @@ +// RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -o - 2>&1 | FileCheck %s -check-prefix=INLINE +// RUN: %clang_cc1 -O2 -fprofile-sample-use=%S/Inputs/pgo-sample-thinlto-summary.prof %s -emit-llvm -flto=thin -o - 2>&1 | FileCheck %s -check-prefix=NOINLINE +// Checks if hot call is inlined by normal compile, but not inlined by +// thinlto compile. + +int baz(int); +int g; + +void foo(int n) { + for (int i = 0; i < n; i++) + g += baz(i); +} + +// INLINE-NOT: call{{.*}}foo +// NOINLINE: call{{.*}}foo +void bar(int n) { + for (int i = 0; i < n; i++) + foo(i); +} Index: test/CodeGen/Inputs/pgo-sample-thinlto-summary.prof =================================================================== --- /dev/null +++ test/CodeGen/Inputs/pgo-sample-thinlto-summary.prof @@ -0,0 +1,2 @@ +bar:100:100 + 2: 2000 foo:2000 Index: lib/CodeGen/BackendUtil.cpp =================================================================== --- lib/CodeGen/BackendUtil.cpp +++ lib/CodeGen/BackendUtil.cpp @@ -318,8 +318,13 @@ !CodeGenOpts.DisableLifetimeMarkers); PMBuilder.Inliner = createAlwaysInlinerLegacyPass(InsertLifetimeIntrinsics); } else { + // We do not want to inline hot callsites for SamplePGO module-summary build + // because profile annotation will happen again in ThinLTO backend, and we + // want the IR of the hot path to match the profile. PMBuilder.Inliner = createFunctionInliningPass( - CodeGenOpts.OptimizationLevel, CodeGenOpts.OptimizeSize); + CodeGenOpts.OptimizationLevel, CodeGenOpts.OptimizeSize, + (!CodeGenOpts.SampleProfileFile.empty() && + CodeGenOpts.EmitSummaryIndex)); } PMBuilder.OptLevel = CodeGenOpts.OptimizationLevel;
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits