Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,7 @@ class LowerAllowCheckPass : public PassInfoMixin<LowerAllowCheckPass> {
public:
struct Options {
std::vector<unsigned int> cutoffs;
uint64_t runtime_check;
};

explicit LowerAllowCheckPass(LowerAllowCheckPass::Options Opts)
Expand Down
13 changes: 13 additions & 0 deletions llvm/lib/Passes/PassBuilder.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -932,6 +932,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)
Expand Down
18 changes: 14 additions & 4 deletions llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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;
Expand Down Expand Up @@ -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>()
Expand All @@ -182,14 +184,22 @@ void LowerAllowCheckPass::printPipeline(
// correctness.
// TODO: print shorter output by combining adjacent runs, etc.
int i = 0;
bool printed = false;
for (unsigned int cutoff : Opts.cutoffs) {
if (cutoff > 0) {
if (i > 0)
OS << ";";
OS << "cutoffs[" << i << "]=" << cutoff;
printed = true;
}

i++;
}
if (Opts.runtime_check) {
if (printed)
OS << ";";
OS << "runtime_check=" << Opts.runtime_check;
}

OS << '>';
}
9 changes: 9 additions & 0 deletions llvm/test/Transforms/lower-builtin-allow-check-remarks.ll
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down