LLVM 18.0.0git
|
#include "llvm/Transforms/Scalar/LowerExpectIntrinsic.h"
#include "llvm/ADT/SmallVector.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/ADT/iterator_range.h"
#include "llvm/IR/BasicBlock.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/Intrinsics.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/MDBuilder.h"
#include "llvm/InitializePasses.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Transforms/Scalar.h"
#include "llvm/Transforms/Utils/MisExpect.h"
#include <cmath>
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 (Intrinsic::ID IntrinsicID, CallInst *CI, int BranchCount) |
static bool | handleSwitchExpect (SwitchInst &SI) |
static void | handlePhiDef (CallInst *Expect) |
Handler for PHINodes that define the value argument to an @llvm.expect call. | |
template<class BrSelInst > | |
static bool | handleBrSelExpect (BrSelInst &BSI) |
static bool | handleBranchExpect (BranchInst &BI) |
static bool | lowerExpectIntrinsic (Function &F) |
INITIALIZE_PASS (LowerExpectIntrinsic, "lower-expect", "Lower 'expect' Intrinsics", false, false) FunctionPass *llvm | |
Variables | |
static cl::opt< uint32_t > | LikelyBranchWeight ("likely-branch-weight", cl::Hidden, cl::init(2000), cl::desc("Weight of the branch likely to be taken (default = 2000)")) |
static cl::opt< uint32_t > | UnlikelyBranchWeight ("unlikely-branch-weight", cl::Hidden, cl::init(1), cl::desc("Weight of the branch unlikely to be taken (default = 1)")) |
#define DEBUG_TYPE "lower-expect-intrinsic" |
Definition at line 34 of file LowerExpectIntrinsic.cpp.
|
static |
Definition at line 59 of file LowerExpectIntrinsic.cpp.
References assert(), llvm::CallBase::getArgOperand(), llvm::User::getNumOperands(), LikelyBranchWeight, and UnlikelyBranchWeight.
Referenced by handleBrSelExpect(), handlePhiDef(), and handleSwitchExpect().
|
static |
Definition at line 361 of file LowerExpectIntrinsic.cpp.
References llvm::BranchInst::isUnconditional().
Referenced by lowerExpectIntrinsic().
|
static |
Definition at line 280 of file LowerExpectIntrinsic.cpp.
References llvm::misexpect::checkFrontendInstrumentation(), llvm::MDBuilder::createBranchWeights(), llvm::CallBase::getArgOperand(), llvm::ConstantInt::getBitWidth(), getBranchWeight(), llvm::CallBase::getCalledFunction(), llvm::Value::getContext(), llvm::Function::getIntrinsicID(), llvm::User::getOperand(), llvm::CmpInst::getPredicate(), llvm::ConstantInt::getZExtValue(), llvm::CmpInst::ICMP_EQ, llvm::CmpInst::ICMP_NE, and llvm::User::setOperand().
Referenced by lowerExpectIntrinsic().
|
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 122 of file LowerExpectIntrinsic.cpp.
References llvm::MDBuilder::createBranchWeights(), llvm::CallBase::getArgOperand(), getBranchWeight(), llvm::CallBase::getCalledFunction(), llvm::Function::getIntrinsicID(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::BasicBlock::getParent(), llvm::Instruction::getParent(), llvm::BasicBlock::getSinglePredecessor(), llvm::BranchInst::getSuccessor(), llvm::BasicBlock::getTerminator(), llvm::ConstantInt::getValue(), llvm::BranchInst::isConditional(), llvm::BranchInst::isUnconditional(), llvm_unreachable, llvm::SmallVectorTemplateBase< T, bool >::push_back(), llvm::reverse(), llvm::Instruction::setMetadata(), and std::swap().
Referenced by lowerExpectIntrinsic().
|
static |
Definition at line 79 of file LowerExpectIntrinsic.cpp.
References llvm::misexpect::checkExpectAnnotations(), llvm::MDBuilder::createBranchWeights(), llvm::CallBase::getArgOperand(), getBranchWeight(), llvm::CallBase::getCalledFunction(), llvm::SwitchInst::CaseHandleImpl< SwitchInstT, ConstantIntT, BasicBlockT >::getCaseIndex(), llvm::Value::getContext(), and llvm::Function::getIntrinsicID().
Referenced by lowerExpectIntrinsic().
INITIALIZE_PASS | ( | LowerExpectIntrinsic | , |
"lower-expect" | , | ||
"Lower 'expect' Intrinsics" | , | ||
false | , | ||
false | |||
) |
Definition at line 439 of file LowerExpectIntrinsic.cpp.
Definition at line 368 of file LowerExpectIntrinsic.cpp.
References llvm::Instruction::eraseFromParent(), F, llvm::CallBase::getArgOperand(), llvm::CallBase::getCalledFunction(), llvm::Function::getIntrinsicID(), handleBranchExpect(), handleBrSelExpect(), handlePhiDef(), handleSwitchExpect(), llvm::make_early_inc_range(), llvm::Value::replaceAllUsesWith(), and llvm::reverse().
Referenced by llvm::LowerExpectIntrinsicPass::run().
STATISTIC | ( | ExpectIntrinsicsHandled | , |
"Number of 'expect' intrinsic instructions handled" | |||
) |
|
static |
Referenced by getBranchWeight(), and llvm::misexpect::verifyMisExpect().
|
static |
Referenced by getBranchWeight(), and llvm::misexpect::verifyMisExpect().