diff options
Diffstat (limited to 'llvm/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp')
-rw-r--r-- | llvm/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp | 10 |
1 files changed, 10 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp b/llvm/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp index 7ba17069f42..ecc646a490b 100644 --- a/llvm/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp +++ b/llvm/lib/Transforms/Scalar/LowerGuardIntrinsic.cpp @@ -21,12 +21,18 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/Intrinsics.h" #include "llvm/IR/IRBuilder.h" +#include "llvm/IR/MDBuilder.h" #include "llvm/IR/Module.h" #include "llvm/Pass.h" #include "llvm/Transforms/Utils/BasicBlockUtils.h" using namespace llvm; +static cl::opt<uint32_t> LikelyBranchWeight( + "guards-likely-branch-weight", cl::Hidden, cl::init(1 << 20), + cl::desc("The probability of a guard failing is assumed to be the " + "reciprocal of this value (default = 1 << 20)")); + namespace { struct LowerGuardIntrinsic : public FunctionPass { static char ID; @@ -59,6 +65,10 @@ static void MakeGuardControlFlowExplicit(Function *DeoptIntrinsic, if (auto *MD = CI->getMetadata(LLVMContext::MD_make_implicit)) CheckBI->setMetadata(LLVMContext::MD_make_implicit, MD); + MDBuilder MDB(CI->getContext()); + CheckBI->setMetadata(LLVMContext::MD_prof, + MDB.createBranchWeights(LikelyBranchWeight, 1)); + IRBuilder<> B(DeoptBlockTerm); auto *DeoptCall = B.CreateCall(DeoptIntrinsic, Args, {DeoptOB}, ""); |