LLVM API Documentation
#include "llvm/CodeGen/Passes.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/ADT/SmallSet.h"
#include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/IR/CallSite.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DataLayout.h"
#include "llvm/IR/DerivedTypes.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/Function.h"
#include "llvm/IR/GetElementPtrTypeIterator.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InlineAsm.h"
#include "llvm/IR/Instructions.h"
#include "llvm/IR/IntrinsicInst.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/IR/ValueMap.h"
#include "llvm/Pass.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
#include "llvm/Target/TargetLibraryInfo.h"
#include "llvm/Target/TargetLowering.h"
#include "llvm/Target/TargetSubtargetInfo.h"
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/BuildLibCalls.h"
#include "llvm/Transforms/Utils/BypassSlowDivision.h"
#include "llvm/Transforms/Utils/Local.h"
Go to the source code of this file.
Defines | |
#define | DEBUG_TYPE "codegenprepare" |
Functions | |
STATISTIC (NumBlocksElim,"Number of blocks eliminated") | |
STATISTIC (NumPHIsElim,"Number of trivial PHIs eliminated") | |
STATISTIC (NumGEPsElim,"Number of GEPs converted to casts") | |
STATISTIC (NumCmpUses,"Number of uses of Cmp expressions replaced with uses of ""sunken Cmps") | |
STATISTIC (NumCastUses,"Number of uses of Cast expressions replaced with uses ""of sunken Casts") | |
STATISTIC (NumMemoryInsts,"Number of memory instructions whose address ""computations were sunk") | |
STATISTIC (NumExtsMoved,"Number of [s|z]ext instructions combined with loads") | |
STATISTIC (NumExtUses,"Number of uses of [s|z]ext instructions optimized") | |
STATISTIC (NumRetsDup,"Number of return instructions duplicated") | |
STATISTIC (NumDbgValueMoved,"Number of debug value instructions moved") | |
STATISTIC (NumSelectsExpanded,"Number of selects turned into branches") | |
STATISTIC (NumAndCmpsMoved,"Number of and/cmp's pushed into branches") | |
INITIALIZE_TM_PASS (CodeGenPrepare,"codegenprepare","Optimize for code generation", false, false) FunctionPass *llvm | |
static bool | SinkCast (CastInst *CI) |
SinkCast - Sink the specified cast instruction into its user blocks. | |
static bool | OptimizeNoopCopyExpression (CastInst *CI, const TargetLowering &TLI) |
static bool | OptimizeCmpExpression (CmpInst *CI) |
static bool | isExtractBitsCandidateUse (Instruction *User) |
static bool | SinkShiftAndTruncate (BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI, DenseMap< BasicBlock *, BinaryOperator * > &InsertedShifts, const TargetLowering &TLI) |
static bool | OptimizeExtractBits (BinaryOperator *ShiftI, ConstantInt *CI, const TargetLowering &TLI) |
static bool | IsNonLocalValue (Value *V, BasicBlock *BB) |
static bool | isFormingBranchFromSelectProfitable (SelectInst *SI) |
static bool | isBroadcastShuffle (ShuffleVectorInst *SVI) |
Variables | |
static cl::opt< bool > | DisableBranchOpts ("disable-cgp-branch-opts", cl::Hidden, cl::init(false), cl::desc("Disable branch optimizations in CodeGenPrepare")) |
static cl::opt< bool > | DisableSelectToBranch ("disable-cgp-select2branch", cl::Hidden, cl::init(false), cl::desc("Disable select to branch conversion.")) |
static cl::opt< bool > | AddrSinkUsingGEPs ("addr-sink-using-gep", cl::Hidden, cl::init(false), cl::desc("Address sinking in CGP using GEPs.")) |
static cl::opt< bool > | EnableAndCmpSinking ("enable-andcmp-sinking", cl::Hidden, cl::init(true), cl::desc("Enable sinkinig and/cmp into branches.")) |
#define DEBUG_TYPE "codegenprepare" |
Definition at line 49 of file CodeGenPrepare.cpp.
INITIALIZE_TM_PASS | ( | CodeGenPrepare | , |
"codegenprepare" | , | ||
"Optimize for code generation" | , | ||
false | , | ||
false | |||
) |
Definition at line 154 of file CodeGenPrepare.cpp.
static bool isBroadcastShuffle | ( | ShuffleVectorInst * | SVI | ) | [static] |
Definition at line 3105 of file CodeGenPrepare.cpp.
References llvm::ShuffleVectorInst::getShuffleMask().
static bool isExtractBitsCandidateUse | ( | Instruction * | User | ) | [static] |
isExtractBitsCandidateUse - Check if the candidates could be combined with shift instruction, which includes: 1. Truncate instruction 2. And instruction and the imm is a mask of the low bits: imm & (imm+1) == 0
Definition at line 627 of file CodeGenPrepare.cpp.
References llvm::APIntOps::And(), llvm::Instruction::getOpcode(), and llvm::User::getOperand().
Referenced by OptimizeExtractBits().
static bool isFormingBranchFromSelectProfitable | ( | SelectInst * | SI | ) | [static] |
isFormingBranchFromSelectProfitable - Returns true if a SelectInst should be turned into an explicit branch.
Definition at line 3019 of file CodeGenPrepare.cpp.
References llvm::dyn_cast(), llvm::SelectInst::getCondition(), llvm::User::getOperand(), and llvm::Value::hasOneUse().
static bool IsNonLocalValue | ( | Value * | V, |
BasicBlock * | BB | ||
) | [static] |
IsNonLocalValue - Return true if the specified values are defined in a different basic block than BB.
Definition at line 2531 of file CodeGenPrepare.cpp.
References llvm::Instruction::getParent().
static bool OptimizeCmpExpression | ( | CmpInst * | CI | ) | [static] |
OptimizeCmpExpression - sink the given CmpInst into user blocks to reduce the number of virtual registers that must be created and coalesced. This is a clear win except on targets with multiple condition code registers (PowerPC), where it might lose; some adjustment may be wanted there.
Return true if any changes are made.
InsertedCmp - Only insert a cmp in each block once.
Definition at line 573 of file CodeGenPrepare.cpp.
References llvm::CmpInst::Create(), llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getFirstInsertionPt(), llvm::CmpInst::getOpcode(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::CmpInst::getPredicate(), llvm::Value::use_empty(), llvm::Value::user_begin(), and llvm::Value::user_end().
static bool OptimizeExtractBits | ( | BinaryOperator * | ShiftI, |
ConstantInt * | CI, | ||
const TargetLowering & | TLI | ||
) | [static] |
OptimizeExtractBits - sink the shift *right* instruction into user blocks if the uses could potentially be combined with this shift instruction and generate BitExtract instruction. It will only be applied if the architecture supports BitExtract instruction. Here is an example: BB1: x.extract.shift = lshr i64 arg1, 32 BB2: x.extract.trunc = trunc i64 x.extract.shift to i16 ==>
BB2: x.extract.shift.1 = lshr i64 arg1, 32 x.extract.trunc = trunc i64 x.extract.shift.1 to i16
CodeGen will recoginze the pattern in BB2 and generate BitExtract instruction. Return true if any changes are made.
Only insert instructions in each block once.
Definition at line 729 of file CodeGenPrepare.cpp.
References llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getFirstInsertionPt(), llvm::BinaryOperator::getOpcode(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::Value::getType(), llvm::TargetLoweringBase::getValueType(), isExtractBitsCandidateUse(), llvm::TargetLoweringBase::isTypeLegal(), SinkShiftAndTruncate(), llvm::Value::use_empty(), llvm::Value::user_begin(), and llvm::Value::user_end().
static bool OptimizeNoopCopyExpression | ( | CastInst * | CI, |
const TargetLowering & | TLI | ||
) | [static] |
OptimizeNoopCopyExpression - If the specified cast instruction is a noop copy (e.g. it's casting from one pointer type to another, i32->i8 on PPC), sink it into user blocks to reduce the number of virtual registers that must be created and coalesced.
Return true if any changes are made.
Definition at line 537 of file CodeGenPrepare.cpp.
References llvm::EVT::bitsLT(), llvm::Value::getContext(), llvm::User::getOperand(), llvm::Value::getType(), llvm::TargetLoweringBase::getTypeAction(), llvm::TargetLoweringBase::getTypeToTransformTo(), llvm::TargetLoweringBase::getValueType(), llvm::EVT::isInteger(), SinkCast(), and llvm::TargetLoweringBase::TypePromoteInteger.
SinkCast - Sink the specified cast instruction into its user blocks.
InsertedCasts - Only insert a cast in each block once.
Definition at line 480 of file CodeGenPrepare.cpp.
References llvm::CastInst::Create(), llvm::Instruction::eraseFromParent(), llvm::BasicBlock::getFirstInsertionPt(), llvm::PHINode::getIncomingBlock(), llvm::CastInst::getOpcode(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::Value::getType(), llvm::Value::use_empty(), llvm::Value::user_begin(), and llvm::Value::user_end().
Referenced by OptimizeNoopCopyExpression().
static bool SinkShiftAndTruncate | ( | BinaryOperator * | ShiftI, |
Instruction * | User, | ||
ConstantInt * | CI, | ||
DenseMap< BasicBlock *, BinaryOperator * > & | InsertedShifts, | ||
const TargetLowering & | TLI | ||
) | [static] |
SinkShiftAndTruncate - sink both shift and truncate instruction to the use of truncate's BB.
Definition at line 644 of file CodeGenPrepare.cpp.
References llvm::CastInst::Create(), llvm::dyn_cast(), llvm::EVT::getEVT(), llvm::BasicBlock::getFirstInsertionPt(), llvm::Instruction::getOpcode(), llvm::BinaryOperator::getOpcode(), llvm::CastInst::getOpcode(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::Value::getType(), llvm::TargetLoweringBase::InstructionOpcodeToISD(), llvm::TargetLoweringBase::isOperationLegalOrCustom(), llvm::Value::user_begin(), and llvm::Value::user_end().
Referenced by OptimizeExtractBits().
STATISTIC | ( | NumBlocksElim | , |
"Number of blocks eliminated" | |||
) |
STATISTIC | ( | NumPHIsElim | , |
"Number of trivial PHIs eliminated" | |||
) |
STATISTIC | ( | NumGEPsElim | , |
"Number of GEPs converted to casts" | |||
) |
STATISTIC | ( | NumCmpUses | , |
"Number of uses of Cmp expressions replaced with uses of ""sunken Cmps" | |||
) |
STATISTIC | ( | NumCastUses | , |
"Number of uses of Cast expressions replaced with uses ""of sunken Casts" | |||
) |
STATISTIC | ( | NumMemoryInsts | , |
"Number of memory instructions whose address ""computations were sunk" | |||
) |
STATISTIC | ( | NumExtsMoved | , |
"Number of ext instructions combined with loads" | [s|z] | ||
) |
STATISTIC | ( | NumExtUses | , |
"Number of uses of ext instructions optimized" | [s|z] | ||
) |
STATISTIC | ( | NumRetsDup | , |
"Number of return instructions duplicated" | |||
) |
STATISTIC | ( | NumDbgValueMoved | , |
"Number of debug value instructions moved" | |||
) |
STATISTIC | ( | NumSelectsExpanded | , |
"Number of selects turned into branches" | |||
) |
STATISTIC | ( | NumAndCmpsMoved | , |
"Number of and/cmp's pushed into branches" | |||
) |
cl::opt<bool> AddrSinkUsingGEPs("addr-sink-using-gep", cl::Hidden, cl::init(false), cl::desc("Address sinking in CGP using GEPs.")) [static] |
cl::opt<bool> DisableBranchOpts("disable-cgp-branch-opts", cl::Hidden, cl::init(false), cl::desc("Disable branch optimizations in CodeGenPrepare")) [static] |
cl::opt<bool> DisableSelectToBranch("disable-cgp-select2branch", cl::Hidden, cl::init(false), cl::desc("Disable select to branch conversion.")) [static] |