[PATCH] D131816: [InstrProf] Add option to avoid instrumenting small functions

Ellis Hoag via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 12 16:34:02 PDT 2022


ellis created this revision.
Herald added subscribers: Enna1, wenlei, hiraditya.
Herald added a project: All.
ellis edited the summary of this revision.
ellis added reviewers: phosek, davidxl, MaskRay.
Herald added a subscriber: StephenFan.
ellis published this revision for review.
ellis added a comment.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.

I originally wanted to check this threshold in clang and add the `skipprofile` attribute for small functions. Unfortunately, clang doesn't have a good idea of how small functions are, i.e., how many instructions they have, before codegen and before optimizations. Of course, the number of IR instructions does not map directly to the size of the assembly function, but this is the best we can do since this is when we are injecting instrumentation.


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


Repository:
  rG LLVM Github Monorepo

https://reviews.llvm.org/D131816

Files:
  llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
  llvm/test/Transforms/PGOProfile/function_size_threshold.ll


Index: llvm/test/Transforms/PGOProfile/function_size_threshold.ll
===================================================================
--- /dev/null
+++ 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: define i32 @small(
+define i32 @small(i32 %i) {
+  ; ALL: call void @llvm.instrprof.increment({{.*}})
+  %add = add i32 %i, 4
+  ret i32 %add
+}
+
+; CHECK: 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({{.*}})
Index: llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
===================================================================
--- llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
+++ llvm/lib/Transforms/Instrumentation/PGOInstrumentation.cpp
@@ -292,6 +292,10 @@
     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 @@
       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);


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D131816.452322.patch
Type: text/x-patch
Size: 2346 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20220812/7c973a60/attachment.bin>


More information about the llvm-commits mailing list