LLVM 24.0.0git
LowerExpectIntrinsic.cpp File Reference

Go to the source code of this file.

Macros

#define DEBUG_TYPE   "lower-expect-intrinsic"

Functions

 STATISTIC (ExpectIntrinsicsHandled, "Number of 'expect' intrinsic instructions handled")
static std::tuple< uint32_t, uint32_t > getBranchWeight (const ScalarOptions &Opts, Intrinsic::ID IntrinsicID, CallInst *CI, int BranchCount)
static bool handleSwitchExpect (const ScalarOptions &Opts, SwitchInst &SI)
static void handlePhiDef (const ScalarOptions &Opts, CallInst *Expect)
 Handler for PHINodes that define the value argument to an @llvm.expect call.
template<class BrSelInst>
static bool handleBrSelExpect (const ScalarOptions &Opts, BrSelInst &BSI)
static bool lowerExpectIntrinsic (Function &F)

Macro Definition Documentation

◆ DEBUG_TYPE

#define DEBUG_TYPE   "lower-expect-intrinsic"

Definition at line 31 of file LowerExpectIntrinsic.cpp.

Function Documentation

◆ getBranchWeight()

std::tuple< uint32_t, uint32_t > getBranchWeight ( const ScalarOptions & Opts,
Intrinsic::ID IntrinsicID,
CallInst * CI,
int BranchCount )
static

◆ handleBrSelExpect()

◆ handlePhiDef()

void handlePhiDef ( const ScalarOptions & Opts,
CallInst * Expect )
static

Handler for PHINodes that define the value argument to an @llvm.expect call.

If the operand of the phi has a constant value and it 'contradicts' with the expected value of phi def, then the corresponding incoming edge of the phi is unlikely to be taken. Using that information, the branch probability info for the originating branch can be inferred.

Definition at line 107 of file LowerExpectIntrinsic.cpp.

References llvm::cast(), llvm::MDBuilder::createBranchWeights(), llvm::dyn_cast(), llvm::CallBase::getArgOperand(), getBranchWeight(), llvm::CallBase::getCalledFunction(), llvm::Function::getIntrinsicID(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::ilist_detail::node_parent_access< NodeTy, ParentTy >::getParent(), llvm::BasicBlock::getSinglePredecessor(), llvm::CondBrInst::getSuccessor(), llvm::BasicBlock::getTerminator(), llvm::ConstantInt::getValue(), llvm::isa(), llvm_unreachable, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::reverse(), llvm::Instruction::setMetadata(), and std::swap().

Referenced by lowerExpectIntrinsic().

◆ handleSwitchExpect()

◆ lowerExpectIntrinsic()

◆ STATISTIC()

STATISTIC ( ExpectIntrinsicsHandled ,
"Number of 'expect' intrinsic instructions handled"  )