[llvm] 6f61594 - [InstrProf] Add option to avoid instrumenting small functions

Ellis Hoag via llvm-commits llvm-commits at lists.llvm.org
Wed Aug 17 06:47:19 PDT 2022


Author: Ellis Hoag
Date: 2022-08-17T06:47:15-07:00
New Revision: 6f61594d8cd4cca559b3c87f2fa47d4bdc017c82

URL: https://github.com/llvm/llvm-project/commit/6f61594d8cd4cca559b3c87f2fa47d4bdc017c82
DIFF: https://github.com/llvm/llvm-project/commit/6f61594d8cd4cca559b3c87f2fa47d4bdc017c82.diff

LOG: [InstrProf] Add option to avoid instrumenting small functions

If a function only has a few instructions, instrumentation can significantly increase the size and performance overhead of that function. Add the `-pgo-function-size-threshold` option to select a size threshold so these small functions are not instrumented.

A similar option `-fxray-instruction-threshold=<N>` is used for XRay to reduce binary size overhead [1].

[1] https://www.llvm.org/docs/XRay.html

Reviewed By: MaskRay

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

Added: 
    llvm/test/Transforms/PGOProfile/function_size_threshold.ll

Modified: 
    llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
index ca3c4ba578df..e55a58734c22 100644
--- a/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
+++ b/llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
@@ -292,6 +292,10 @@ static cl::opt<std::string> PGOTraceFuncHash(
     cl::value_desc("function name"),
     cl::desc("Trace the hash of the function with this name."));
 
+static cl::opt<unsigned> PGOFunctionSizeThreshold(
+    "pgo-function-size-threshold", cl::Hidden,
+    cl::desc("Do not instrument functions smaller than this threshold"));
+
 namespace llvm {
 // Command line option to turn on CFG dot dump after profile annotation.
 // Defined in Analysis/BlockFrequencyInfo.cpp:  -pgo-view-counts
@@ -1576,6 +1580,8 @@ static bool InstrumentAllFunctions(
       continue;
     if (F.hasFnAttribute(llvm::Attribute::SkipProfile))
       continue;
+    if (F.getInstructionCount() < PGOFunctionSizeThreshold)
+      continue;
     auto &TLI = LookupTLI(F);
     auto *BPI = LookupBPI(F);
     auto *BFI = LookupBFI(F);

diff  --git a/llvm/test/Transforms/PGOProfile/function_size_threshold.ll b/llvm/test/Transforms/PGOProfile/function_size_threshold.ll
new file mode 100644
index 000000000000..e1207a649e29
--- /dev/null
+++ b/llvm/test/Transforms/PGOProfile/function_size_threshold.ll
@@ -0,0 +1,29 @@
+; RUN: opt < %s -passes=pgo-instr-gen -S | FileCheck %s --implicit-check-not='llvm.instrprof.' --check-prefixes=CHECK,ALL
+; RUN: opt < %s -passes=pgo-instr-gen -pgo-function-size-threshold=2 -S | FileCheck %s --implicit-check-not='llvm.instrprof.' --check-prefixes=CHECK,ALL
+; RUN: opt < %s -passes=pgo-instr-gen -pgo-function-size-threshold=3 -S | FileCheck %s --implicit-check-not='llvm.instrprof.'
+target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"
+target triple = "x86_64-unknown-linux-gnu"
+
+; CHECK-LABEL: define i32 @small(
+define i32 @small(i32 %i) {
+  ; ALL: call void @llvm.instrprof.increment({{.*}})
+  %add = add i32 %i, 4
+  ret i32 %add
+}
+
+; CHECK-LABEL: define i32 @large(
+define i32 @large(i32 %0) {
+  ; CHECK: call void @llvm.instrprof.increment({{.*}})
+  %2 = shl nsw i32 %0, 3
+  %3 = or i32 %2, 4
+  %4 = mul i32 %3, %0
+  %5 = or i32 %4, 3
+  %6 = sdiv i32 2, %0
+  %7 = add nsw i32 %5, %6
+  %8 = mul nsw i32 %0, %0
+  %9 = udiv i32 5, %8
+  %10 = add nsw i32 %7, %9
+  ret i32 %10
+}
+
+; CHECK: declare void @llvm.instrprof.increment({{.*}})


        


More information about the llvm-commits mailing list