[llvm] [UBSAN] Emit optimization remarks (PR #88304)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 10 11:22:49 PDT 2024
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-llvm-ir
Author: Vitaly Buka (vitalybuka)
<details>
<summary>Changes</summary>
---
Full diff: https://github.com/llvm/llvm-project/pull/88304.diff
2 Files Affected:
- (modified) llvm/lib/IR/DiagnosticInfo.cpp (+5-1)
- (modified) llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp (+29-3)
``````````diff
diff --git a/llvm/lib/IR/DiagnosticInfo.cpp b/llvm/lib/IR/DiagnosticInfo.cpp
index 342c4cbbc39d65..31971b179fb4be 100644
--- a/llvm/lib/IR/DiagnosticInfo.cpp
+++ b/llvm/lib/IR/DiagnosticInfo.cpp
@@ -179,8 +179,12 @@ DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key,
else if (isa<Constant>(V)) {
raw_string_ostream OS(Val);
V->printAsOperand(OS, /*PrintType=*/false);
- } else if (auto *I = dyn_cast<Instruction>(V))
+ } else if (auto *I = dyn_cast<Instruction>(V)) {
Val = I->getOpcodeName();
+ } else if (auto *MD = dyn_cast<MetadataAsValue>(V)) {
+ if (auto *S = dyn_cast<MDString>(MD->getMetadata()))
+ Val = S->getString();
+ }
}
DiagnosticInfoOptimizationBase::Argument::Argument(StringRef Key, const Type *T)
diff --git a/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp b/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
index cdc8318f088c27..6c5a20227d0a36 100644
--- a/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
+++ b/llvm/lib/Transforms/Instrumentation/LowerAllowCheckPass.cpp
@@ -10,11 +10,16 @@
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
+#include "llvm/ADT/StringRef.h"
+#include "llvm/Analysis/OptimizationRemarkEmitter.h"
#include "llvm/Analysis/ProfileSummaryInfo.h"
#include "llvm/IR/Constant.h"
+#include "llvm/IR/Constants.h"
+#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/Intrinsics.h"
+#include "llvm/IR/Metadata.h"
#include "llvm/Support/RandomNumberGenerator.h"
#include <memory>
#include <random>
@@ -35,8 +40,26 @@ static cl::opt<float>
STATISTIC(NumChecksTotal, "Number of checks");
STATISTIC(NumChecksRemoved, "Number of removed checks");
+static void emitRemark(IntrinsicInst *II, OptimizationRemarkEmitter &ORE,
+ bool Removed) {
+ ore::NV Kind("Kind", II->getArgOperand(0));
+ ore::NV BB("Block", II->getParent()->getName());
+ if (Removed) {
+ ORE.emit([&]() {
+ return OptimizationRemark(DEBUG_TYPE, "Removed", II)
+ << "Removed check: Kind=" << Kind << " BB=" << BB;
+ });
+ } else {
+ ORE.emit([&]() {
+ return OptimizationRemarkMissed(DEBUG_TYPE, "Allowed", II)
+ << "Allowed check: Kind=" << Kind << " BB=" << BB;
+ });
+ }
+}
+
static bool removeUbsanTraps(Function &F, const BlockFrequencyInfo &BFI,
- const ProfileSummaryInfo *PSI) {
+ const ProfileSummaryInfo *PSI,
+ OptimizationRemarkEmitter &ORE) {
SmallVector<std::pair<IntrinsicInst *, bool>, 16> ReplaceWithValue;
std::unique_ptr<RandomNumberGenerator> Rng;
@@ -75,6 +98,7 @@ static bool removeUbsanTraps(Function &F, const BlockFrequencyInfo &BFI,
});
if (ToRemove)
++NumChecksRemoved;
+ emitRemark(II, ORE, ToRemove);
break;
}
default:
@@ -99,9 +123,11 @@ PreservedAnalyses LowerAllowCheckPass::run(Function &F,
ProfileSummaryInfo *PSI =
MAMProxy.getCachedResult<ProfileSummaryAnalysis>(*F.getParent());
BlockFrequencyInfo &BFI = AM.getResult<BlockFrequencyAnalysis>(F);
+ OptimizationRemarkEmitter &ORE =
+ AM.getResult<OptimizationRemarkEmitterAnalysis>(F);
- return removeUbsanTraps(F, BFI, PSI) ? PreservedAnalyses::none()
- : PreservedAnalyses::all();
+ return removeUbsanTraps(F, BFI, PSI, ORE) ? PreservedAnalyses::none()
+ : PreservedAnalyses::all();
}
bool LowerAllowCheckPass::IsRequested() {
``````````
</details>
https://github.com/llvm/llvm-project/pull/88304
More information about the llvm-commits
mailing list