[llvm] 71bc606 - [LowerAllowCheckPass] allow to specify runtime.check hotness (#145998)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Jun 27 11:28:10 PDT 2025
Author: Florian Mayer
Date: 2025-06-27T11:28:07-07:00
New Revision: 71bc606e95d6771467326013c2e006728eabf4a8
URL: https://github.com/llvm/llvm-project/commit/71bc606e95d6771467326013c2e006728eabf4a8
DIFF: https://github.com/llvm/llvm-project/commit/71bc606e95d6771467326013c2e006728eabf4a8.diff
LOG: [LowerAllowCheckPass] allow to specify runtime.check hotness (#145998)
Added:
Modified:
llvm/include/llvm/Transforms/Instrumentation/LowerAllowCheckPass.h
llvm/lib/Passes/PassBuilder.cpp
llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
llvm/test/Transforms/lower-builtin-allow-check-remarks.ll
Removed:
################################################################################
diff --git a/llvm/include/llvm/Transforms/Instrumentation/LowerAllowCheckPass.h b/llvm/include/llvm/Transforms/Instrumentation/LowerAllowCheckPass.h
index 7b095ea24b4b0..37bc728779836 100644
--- a/llvm/include/llvm/Transforms/Instrumentation/LowerAllowCheckPass.h
+++ b/llvm/include/llvm/Transforms/Instrumentation/LowerAllowCheckPass.h
@@ -27,6 +27,7 @@ class LowerAllowCheckPass : public PassInfoMixin<LowerAllowCheckPass> {
public:
struct Options {
std::vector<unsigned int> cutoffs;
+ unsigned int runtime_check = 0;
};
explicit LowerAllowCheckPass(LowerAllowCheckPass::Options Opts)
diff --git a/llvm/lib/Passes/PassBuilder.cpp b/llvm/lib/Passes/PassBuilder.cpp
index f95c32d859d14..bb266ac776891 100644
--- a/llvm/lib/Passes/PassBuilder.cpp
+++ b/llvm/lib/Passes/PassBuilder.cpp
@@ -938,6 +938,19 @@ parseLowerAllowCheckPassOptions(StringRef Params) {
Result.cutoffs[index] = cutoff;
}
+ } else if (ParamName.starts_with("runtime_check")) {
+ StringRef ValueString;
+ std::tie(std::ignore, ValueString) = ParamName.split("=");
+ int runtime_check;
+ if (ValueString.getAsInteger(0, runtime_check)) {
+ return make_error<StringError>(
+ formatv("invalid LowerAllowCheck pass runtime_check parameter '{}' "
+ "({})",
+ ValueString, Params)
+ .str(),
+ inconvertibleErrorCode());
+ }
+ Result.runtime_check = runtime_check;
} else {
return make_error<StringError>(
formatv("invalid LowerAllowCheck pass parameter '{}'", ParamName)
diff --git a/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp b/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
index 196f58a8f1d1c..e7a6fa48e9004 100644
--- a/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
+++ b/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
@@ -74,7 +74,7 @@ static void emitRemark(IntrinsicInst *II, OptimizationRemarkEmitter &ORE,
static bool removeUbsanTraps(Function &F, const BlockFrequencyInfo &BFI,
const ProfileSummaryInfo *PSI,
OptimizationRemarkEmitter &ORE,
- const std::vector<unsigned int> &cutoffs) {
+ const LowerAllowCheckPass::Options &Opts) {
SmallVector<std::pair<IntrinsicInst *, bool>, 16> ReplaceWithValue;
std::unique_ptr<RandomNumberGenerator> Rng;
@@ -89,8 +89,10 @@ static bool removeUbsanTraps(Function &F, const BlockFrequencyInfo &BFI,
return HotPercentileCutoff;
else if (II->getIntrinsicID() == Intrinsic::allow_ubsan_check) {
auto *Kind = cast<ConstantInt>(II->getArgOperand(0));
- if (Kind->getZExtValue() < cutoffs.size())
- return cutoffs[Kind->getZExtValue()];
+ if (Kind->getZExtValue() < Opts.cutoffs.size())
+ return Opts.cutoffs[Kind->getZExtValue()];
+ } else if (II->getIntrinsicID() == Intrinsic::allow_runtime_check) {
+ return Opts.runtime_check;
}
return 0;
@@ -157,7 +159,7 @@ PreservedAnalyses LowerAllowCheckPass::run(Function &F,
OptimizationRemarkEmitter &ORE =
AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
- return removeUbsanTraps(F, BFI, PSI, ORE, Opts.cutoffs)
+ return removeUbsanTraps(F, BFI, PSI, ORE, Opts)
// We do not change the CFG, we only replace the intrinsics with
// true or false.
? PreservedAnalyses::none().preserveSet<CFGAnalyses>()
@@ -193,5 +195,11 @@ void LowerAllowCheckPass::printPipeline(
i++;
}
+ if (Opts.runtime_check) {
+ if (printed)
+ OS << ";";
+ OS << "runtime_check=" << Opts.runtime_check;
+ }
+
OS << '>';
}
diff --git a/llvm/test/Transforms/lower-builtin-allow-check-remarks.ll b/llvm/test/Transforms/lower-builtin-allow-check-remarks.ll
index 190f4b240537e..3030cc02f8689 100644
--- a/llvm/test/Transforms/lower-builtin-allow-check-remarks.ll
+++ b/llvm/test/Transforms/lower-builtin-allow-check-remarks.ll
@@ -4,12 +4,21 @@
; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-percentile-cutoff-hot=0 -pass-remarks=lower-allow-check -pass-remarks-missed=lower-allow-check -S 2>&1 | FileCheck %s
; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check)' -lower-allow-check-percentile-cutoff-hot=1000000 -pass-remarks=lower-allow-check -pass-remarks-missed=lower-allow-check -S 2>&1 | FileCheck %s --check-prefixes=REMOVE
+; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check<cutoffs[7]=0;runtime_check=1000000>)' -pass-remarks=lower-allow-check -pass-remarks-missed=lower-allow-check -S 2>&1 | FileCheck %s --check-prefixes=MIXED
+; RUN: opt < %s -passes='require<profile-summary>,function(lower-allow-check<cutoffs[7]=1000000;runtime_check=0>)' -pass-remarks=lower-allow-check -pass-remarks-missed=lower-allow-check -S 2>&1 | FileCheck %s --check-prefixes=MIXED2
+
; CHECK: remark: <unknown>:0:0: Allowed check: Kind=test_check F=test_runtime BB=entry1
; CHECK: remark: <unknown>:0:0: Allowed check: Kind=7 F=test_ubsan BB=entry2
; REMOVE: remark: <unknown>:0:0: Removed check: Kind=test_check F=test_runtime BB=entry1
; REMOVE: remark: <unknown>:0:0: Removed check: Kind=7 F=test_ubsan BB=entry2
+; MIXED: remark: <unknown>:0:0: Removed check: Kind=test_check F=test_runtime BB=entry1
+; MIXED: remark: <unknown>:0:0: Allowed check: Kind=7 F=test_ubsan BB=entry2
+
+; MIXED2: remark: <unknown>:0:0: Allowed check: Kind=test_check F=test_runtime BB=entry1
+; MIXED2: remark: <unknown>:0:0: Removed check: Kind=7 F=test_ubsan BB=entry2
+
target triple = "x86_64-pc-linux-gnu"
define i1 @test_runtime() local_unnamed_addr {
More information about the llvm-commits
mailing list