LLVM  3.7.0
Macros | Functions | Variables
CodeGenPrepare.cpp File Reference
#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/Analysis/TargetLibraryInfo.h"
#include "llvm/Analysis/TargetTransformInfo.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/MDBuilder.h"
#include "llvm/IR/PatternMatch.h"
#include "llvm/IR/Statepoint.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/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"
#include "llvm/Transforms/Utils/SimplifyLibCalls.h"
Include dependency graph for CodeGenPrepare.cpp:

Go to the source code of this file.

Macros

#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")
 
 STATISTIC (NumStoreExtractExposed,"Number of store(extractelement) exposed")
 
 INITIALIZE_TM_PASS (CodeGenPrepare,"codegenprepare","Optimize for code generation", false, false) FunctionPass *llvm
 
static void computeBaseDerivedRelocateMap (const SmallVectorImpl< User * > &AllRelocateCalls, DenseMap< IntrinsicInst *, SmallVector< IntrinsicInst *, 2 >> &RelocateInstMap)
 
static bool getGEPSmallConstantIntOffsetV (GetElementPtrInst *GEP, SmallVectorImpl< Value * > &OffsetV)
 
static bool simplifyRelocatesOffABase (IntrinsicInst *RelocatedBase, const SmallVectorImpl< IntrinsicInst * > &Targets)
 
static bool SinkCast (CastInst *CI)
 SinkCast - Sink the specified cast instruction into its user blocks. More...
 
static bool OptimizeNoopCopyExpression (CastInst *CI, const TargetLowering &TLI, const DataLayout &DL)
 OptimizeNoopCopyExpression - If the specified cast instruction is a noop copy (e.g. More...
 
static bool CombineUAddWithOverflow (CmpInst *CI)
 CombineUAddWithOverflow - try to combine CI into a call to the llvm.uadd.with.overflow intrinsic if possible. More...
 
static bool SinkCmpExpression (CmpInst *CI)
 SinkCmpExpression - Sink the given CmpInst into user blocks to reduce the number of virtual registers that must be created and coalesced. More...
 
static bool OptimizeCmpExpression (CmpInst *CI)
 
static bool isExtractBitsCandidateUse (Instruction *User)
 isExtractBitsCandidateUse - Check if the candidates could be combined with shift instruction, which includes: More...
 
static bool SinkShiftAndTruncate (BinaryOperator *ShiftI, Instruction *User, ConstantInt *CI, DenseMap< BasicBlock *, BinaryOperator * > &InsertedShifts, const TargetLowering &TLI, const DataLayout &DL)
 SinkShiftAndTruncate - sink both shift and truncate instruction to the use of truncate's BB. More...
 
static bool OptimizeExtractBits (BinaryOperator *ShiftI, ConstantInt *CI, const TargetLowering &TLI, const DataLayout &DL)
 OptimizeExtractBits - sink the shift right instruction into user blocks if the uses could potentially be combined with this shift instruction and generate BitExtract instruction. More...
 
static void ScalarizeMaskedLoad (CallInst *CI)
 
static void ScalarizeMaskedStore (CallInst *CI)
 
static bool IsNonLocalValue (Value *V, BasicBlock *BB)
 IsNonLocalValue - Return true if the specified values are defined in a different basic block than BB. More...
 
static bool hasSameExtUse (Instruction *Inst, const TargetLowering &TLI)
 Check if all the uses of Inst are equivalent (or free) zero or sign extensions. More...
 

Variables

static cl::opt< boolDisableBranchOpts ("disable-cgp-branch-opts", cl::Hidden, cl::init(false), cl::desc("Disable branch optimizations in CodeGenPrepare"))
 
static cl::opt< boolDisableGCOpts ("disable-cgp-gc-opts", cl::Hidden, cl::init(false), cl::desc("Disable GC optimizations in CodeGenPrepare"))
 
static cl::opt< boolDisableSelectToBranch ("disable-cgp-select2branch", cl::Hidden, cl::init(false), cl::desc("Disable select to branch conversion."))
 
static cl::opt< boolAddrSinkUsingGEPs ("addr-sink-using-gep", cl::Hidden, cl::init(false), cl::desc("Address sinking in CGP using GEPs."))
 
static cl::opt< boolEnableAndCmpSinking ("enable-andcmp-sinking", cl::Hidden, cl::init(true), cl::desc("Enable sinkinig and/cmp into branches."))
 
static cl::opt< boolDisableStoreExtract ("disable-cgp-store-extract", cl::Hidden, cl::init(false), cl::desc("Disable store(extract) optimizations in CodeGenPrepare"))
 
static cl::opt< boolStressStoreExtract ("stress-cgp-store-extract", cl::Hidden, cl::init(false), cl::desc("Stress test store(extract) optimizations in CodeGenPrepare"))
 
static cl::opt< boolDisableExtLdPromotion ("disable-cgp-ext-ld-promotion", cl::Hidden, cl::init(false), cl::desc("Disable ext(promotable(ld)) -> promoted(ext(ld)) optimization in ""CodeGenPrepare"))
 
static cl::opt< boolStressExtLdPromotion ("stress-cgp-ext-ld-promotion", cl::Hidden, cl::init(false), cl::desc("Stress test ext(promotable(ld)) -> promoted(ext(ld)) ""optimization in CodeGenPrepare"))
 

Macro Definition Documentation

#define DEBUG_TYPE   "codegenprepare"

Definition at line 53 of file CodeGenPrepare.cpp.

Function Documentation

static bool CombineUAddWithOverflow ( CmpInst CI)
static
static void computeBaseDerivedRelocateMap ( const SmallVectorImpl< User * > &  AllRelocateCalls,
DenseMap< IntrinsicInst *, SmallVector< IntrinsicInst *, 2 >> &  RelocateInstMap 
)
static
static bool getGEPSmallConstantIntOffsetV ( GetElementPtrInst GEP,
SmallVectorImpl< Value * > &  OffsetV 
)
static
static bool hasSameExtUse ( Instruction Inst,
const TargetLowering TLI 
)
static

Check if all the uses of Inst are equivalent (or free) zero or sign extensions.

Definition at line 3579 of file CodeGenPrepare.cpp.

References llvm::Type::getIntegerBitWidth(), llvm::Type::getScalarType(), llvm::Value::getType(), llvm::TargetLoweringBase::isZExtFree(), llvm::Value::use_empty(), llvm::Value::user_begin(), and llvm::Value::users().

INITIALIZE_TM_PASS ( CodeGenPrepare  ,
"codegenprepare"  ,
"Optimize for code generation"  ,
false  ,
false   
)

Definition at line 198 of file CodeGenPrepare.cpp.

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 911 of file CodeGenPrepare.cpp.

References llvm::APIntOps::And(), llvm::Instruction::getOpcode(), and llvm::User::getOperand().

Referenced by OptimizeExtractBits().

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 3197 of file CodeGenPrepare.cpp.

References llvm::Instruction::getParent().

static bool OptimizeCmpExpression ( CmpInst CI)
static

Definition at line 896 of file CodeGenPrepare.cpp.

References CombineUAddWithOverflow(), and SinkCmpExpression().

static bool OptimizeExtractBits ( BinaryOperator ShiftI,
ConstantInt CI,
const TargetLowering TLI,
const DataLayout DL 
)
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 1013 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,
const DataLayout DL 
)
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 761 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.

static void ScalarizeMaskedLoad ( CallInst CI)
static
static void ScalarizeMaskedStore ( CallInst CI)
static
static bool simplifyRelocatesOffABase ( IntrinsicInst RelocatedBase,
const SmallVectorImpl< IntrinsicInst * > &  Targets 
)
static
static bool SinkCast ( CastInst CI)
static
static bool SinkCmpExpression ( CmpInst CI)
static

SinkCmpExpression - 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 845 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().

Referenced by OptimizeCmpExpression().

static bool SinkShiftAndTruncate ( BinaryOperator ShiftI,
Instruction User,
ConstantInt CI,
DenseMap< BasicBlock *, BinaryOperator * > &  InsertedShifts,
const TargetLowering TLI,
const DataLayout DL 
)
static
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"   
)
STATISTIC ( NumStoreExtractExposed  ,
"Number of store(extractelement) exposed"   
)

Variable Documentation

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> DisableExtLdPromotion("disable-cgp-ext-ld-promotion", cl::Hidden, cl::init(false), cl::desc("Disable ext(promotable(ld)) -> promoted(ext(ld)) optimization in ""CodeGenPrepare"))
static
cl::opt<bool> DisableGCOpts("disable-cgp-gc-opts", cl::Hidden, cl::init(false), cl::desc("Disable GC 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> DisableStoreExtract("disable-cgp-store-extract", cl::Hidden, cl::init(false), cl::desc("Disable store(extract) optimizations in CodeGenPrepare"))
static
cl::opt<bool> EnableAndCmpSinking("enable-andcmp-sinking", cl::Hidden, cl::init(true), cl::desc("Enable sinkinig and/cmp into branches."))
static
cl::opt<bool> StressExtLdPromotion("stress-cgp-ext-ld-promotion", cl::Hidden, cl::init(false), cl::desc("Stress test ext(promotable(ld)) -> promoted(ext(ld)) ""optimization in CodeGenPrepare"))
static
cl::opt<bool> StressStoreExtract("stress-cgp-store-extract", cl::Hidden, cl::init(false), cl::desc("Stress test store(extract) optimizations in CodeGenPrepare"))
static