|
LLVM
4.0.0
|
#include "llvm/Transforms/Scalar/CorrelatedValuePropagation.h"#include "llvm/Transforms/Scalar.h"#include "llvm/ADT/Statistic.h"#include "llvm/Analysis/GlobalsModRef.h"#include "llvm/Analysis/InstructionSimplify.h"#include "llvm/Analysis/LazyValueInfo.h"#include "llvm/IR/CFG.h"#include "llvm/IR/ConstantRange.h"#include "llvm/IR/Constants.h"#include "llvm/IR/Function.h"#include "llvm/IR/Instructions.h"#include "llvm/IR/Module.h"#include "llvm/Pass.h"#include "llvm/Support/Debug.h"#include "llvm/Support/raw_ostream.h"#include "llvm/Transforms/Utils/Local.h"Go to the source code of this file.
Macros | |
| #define | DEBUG_TYPE "correlated-value-propagation" |
Functions | |
| STATISTIC (NumPhis,"Number of phis propagated") | |
| STATISTIC (NumSelects,"Number of selects propagated") | |
| STATISTIC (NumMemAccess,"Number of memory access targets propagated") | |
| STATISTIC (NumCmps,"Number of comparisons propagated") | |
| STATISTIC (NumReturns,"Number of return values propagated") | |
| STATISTIC (NumDeadCases,"Number of switch cases removed") | |
| STATISTIC (NumSDivs,"Number of sdiv converted to udiv") | |
| STATISTIC (NumAShrs,"Number of ashr converted to lshr") | |
| STATISTIC (NumSRems,"Number of srem converted to urem") | |
| INITIALIZE_PASS_BEGIN (CorrelatedValuePropagation,"correlated-propagation","Value Propagation", false, false) INITIALIZE_PASS_END(CorrelatedValuePropagation | |
| static bool | processSelect (SelectInst *S, LazyValueInfo *LVI) |
| static bool | processPHI (PHINode *P, LazyValueInfo *LVI) |
| static bool | processMemAccess (Instruction *I, LazyValueInfo *LVI) |
| static bool | processCmp (CmpInst *C, LazyValueInfo *LVI) |
| See if LazyValueInfo's ability to exploit edge conditions or range information is sufficient to prove this comparison. More... | |
| static bool | processSwitch (SwitchInst *SI, LazyValueInfo *LVI) |
| Simplify a switch instruction by removing cases which can never fire. More... | |
| static bool | processCallSite (CallSite CS, LazyValueInfo *LVI) |
| Infer nonnull attributes for the arguments at the specified callsite. More... | |
| static bool | hasLocalDefs (BinaryOperator *SDI) |
| static bool | hasPositiveOperands (BinaryOperator *SDI, LazyValueInfo *LVI) |
| static bool | processSRem (BinaryOperator *SDI, LazyValueInfo *LVI) |
| static bool | processSDiv (BinaryOperator *SDI, LazyValueInfo *LVI) |
| See if LazyValueInfo's ability to exploit edge conditions or range information is sufficient to prove the both operands of this SDiv are positive. More... | |
| static bool | processAShr (BinaryOperator *SDI, LazyValueInfo *LVI) |
| static bool | processAdd (BinaryOperator *AddOp, LazyValueInfo *LVI) |
| static Constant * | getConstantAt (Value *V, Instruction *At, LazyValueInfo *LVI) |
| static bool | runImpl (Function &F, LazyValueInfo *LVI) |
Variables | |
| static cl::opt< bool > | DontProcessAdds ("cvp-dont-process-adds", cl::init(true)) |
| correlated | propagation |
| correlated Value | Propagation |
| correlated Value | false |
| #define DEBUG_TYPE "correlated-value-propagation" |
Definition at line 32 of file CorrelatedValuePropagation.cpp.
|
static |
Definition at line 463 of file CorrelatedValuePropagation.cpp.
References C, llvm::dyn_cast(), llvm::LazyValueInfo::getConstant(), llvm::ConstantInt::getFalse(), llvm::Instruction::getParent(), llvm::LazyValueInfo::getPredicateAt(), llvm::ConstantInt::getTrue(), llvm::LazyValueInfo::True, and llvm::LazyValueInfo::Unknown.
Referenced by runImpl().
|
static |
Definition at line 336 of file CorrelatedValuePropagation.cpp.
References llvm::dyn_cast(), llvm::Instruction::getParent(), I, and llvm::User::operands().
Referenced by processAdd(), processAShr(), processSDiv(), and processSRem().
|
static |
Definition at line 345 of file CorrelatedValuePropagation.cpp.
References llvm::ConstantInt::get(), llvm::LazyValueInfo::getPredicateAt(), llvm::Value::getType(), llvm::CmpInst::ICMP_SGE, llvm::User::operands(), llvm::LazyValueInfo::True, and Zero.
Referenced by processSDiv(), and processSRem().
| INITIALIZE_PASS_BEGIN | ( | CorrelatedValuePropagation | , |
| "correlated-propagation" | , | ||
| "Value Propagation" | , | ||
| false | , | ||
| false | |||
| ) |
|
static |
Definition at line 407 of file CorrelatedValuePropagation.cpp.
References llvm::MCID::Add, llvm::ConstantRange::contains(), DontProcessAdds, llvm::LazyValueInfo::getConstantRange(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::Value::getType(), llvm::Optional< T >::getValue(), hasLocalDefs(), llvm::Instruction::hasNoSignedWrap(), llvm::Instruction::hasNoUnsignedWrap(), llvm::ConstantRange::isEmptySet(), llvm::Type::isVectorTy(), llvm::ConstantRange::makeGuaranteedNoWrapRegion(), llvm::Instruction::setHasNoSignedWrap(), and llvm::Instruction::setHasNoUnsignedWrap().
Referenced by runImpl().
|
static |
Definition at line 388 of file CorrelatedValuePropagation.cpp.
References llvm::Instruction::eraseFromParent(), llvm::ConstantInt::get(), llvm::Value::getName(), llvm::User::getOperand(), llvm::LazyValueInfo::getPredicateAt(), llvm::Value::getType(), hasLocalDefs(), llvm::CmpInst::ICMP_SGE, llvm::Instruction::isExact(), llvm::Type::isVectorTy(), llvm::Value::replaceAllUsesWith(), llvm::LazyValueInfo::True, and Zero.
Referenced by runImpl().
|
static |
Infer nonnull attributes for the arguments at the specified callsite.
Definition at line 302 of file CorrelatedValuePropagation.cpp.
References llvm::AttributeSet::addAttribute(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::arg_size(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::args(), assert(), llvm::dyn_cast(), llvm::SmallVectorBase::empty(), llvm::LazyValueInfo::False, llvm::Attribute::get(), llvm::ConstantPointerNull::get(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getAttributes(), llvm::Value::getContext(), llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::getInstruction(), llvm::LazyValueInfo::getPredicateAt(), llvm::CmpInst::ICMP_EQ, llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::paramHasAttr(), llvm::SmallVectorTemplateBase< T, isPodLike >::push_back(), and llvm::CallSiteBase< FunTy, BBTy, ValTy, UserTy, UseTy, InstrTy, CallTy, InvokeTy, IterTy >::setAttributes().
Referenced by runImpl().
|
static |
See if LazyValueInfo's ability to exploit edge conditions or range information is sufficient to prove this comparison.
Even for local conditions, this can sometimes prove conditions instcombine can't by exploiting range information.
Definition at line 187 of file CorrelatedValuePropagation.cpp.
References C, llvm::dyn_cast(), llvm::Instruction::eraseFromParent(), llvm::Value::getContext(), llvm::ConstantInt::getFalse(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::CmpInst::getPredicate(), llvm::LazyValueInfo::getPredicateAt(), llvm::ConstantInt::getTrue(), I, llvm::Value::replaceAllUsesWith(), llvm::LazyValueInfo::True, and llvm::LazyValueInfo::Unknown.
Referenced by runImpl().
|
static |
Definition at line 166 of file CorrelatedValuePropagation.cpp.
References C, llvm::LazyValueInfo::getConstant(), llvm::Instruction::getParent(), getPointerOperand(), I, L, and llvm::User::replaceUsesOfWith().
Referenced by runImpl().
|
static |
Definition at line 98 of file CorrelatedValuePropagation.cpp.
References C, llvm::dbgs(), DEBUG, llvm::dyn_cast(), llvm::Instruction::eraseFromParent(), llvm::LazyValueInfo::False, llvm::SelectInst::getCondition(), llvm::LazyValueInfo::getConstantOnEdge(), llvm::Module::getDataLayout(), llvm::SelectInst::getFalseValue(), llvm::PHINode::getIncomingBlock(), llvm::PHINode::getIncomingValue(), llvm::BasicBlock::getModule(), llvm::PHINode::getNumIncomingValues(), llvm::Instruction::getParent(), llvm::LazyValueInfo::getPredicateOnEdge(), llvm::SelectInst::getTrueValue(), llvm::Value::getType(), i, llvm::CmpInst::ICMP_EQ, llvm::Type::isVectorTy(), P, llvm::Value::replaceAllUsesWith(), llvm::PHINode::setIncomingValue(), SI, and llvm::SimplifyInstruction().
Referenced by runImpl().
|
static |
See if LazyValueInfo's ability to exploit edge conditions or range information is sufficient to prove the both operands of this SDiv are positive.
If this is the case, replace the SDiv with a UDiv. Even for local conditions, this can sometimes prove conditions instcombine can't by exploiting range information.
Definition at line 373 of file CorrelatedValuePropagation.cpp.
References llvm::Instruction::eraseFromParent(), llvm::Value::getName(), llvm::User::getOperand(), llvm::Value::getType(), hasLocalDefs(), hasPositiveOperands(), llvm::Instruction::isExact(), llvm::Type::isVectorTy(), and llvm::Value::replaceAllUsesWith().
Referenced by runImpl().
|
static |
Definition at line 75 of file CorrelatedValuePropagation.cpp.
References C, llvm::dyn_cast(), llvm::Instruction::eraseFromParent(), llvm::UndefValue::get(), llvm::LazyValueInfo::getConstant(), llvm::User::getOperand(), llvm::Instruction::getParent(), llvm::Value::getType(), llvm::ConstantInt::isOne(), llvm::Type::isVectorTy(), Other, llvm::Value::replaceAllUsesWith(), and std::swap().
Referenced by runImpl().
|
static |
Definition at line 355 of file CorrelatedValuePropagation.cpp.
References llvm::Instruction::eraseFromParent(), llvm::Value::getName(), llvm::User::getOperand(), llvm::Value::getType(), hasLocalDefs(), hasPositiveOperands(), llvm::Type::isVectorTy(), and llvm::Value::replaceAllUsesWith().
Referenced by runImpl().
|
static |
Simplify a switch instruction by removing cases which can never fire.
If the uselessness of a case could be determined locally then constant propagation would already have figured it out. Instead, walk the predecessors and statically evaluate cases based on information available on that edge. Cases that cannot fire no matter what the incoming edge can safely be removed. If a case fires on every incoming edge then the entire switch can be removed and replaced with a branch to the case destination.
Definition at line 222 of file CorrelatedValuePropagation.cpp.
References llvm::SwitchInst::case_begin(), llvm::SwitchInst::case_end(), llvm::ConstantFoldTerminator(), llvm::LazyValueInfo::False, llvm::SwitchInst::getCondition(), llvm::SwitchInst::getNumCases(), llvm::Instruction::getParent(), getParent(), llvm::LazyValueInfo::getPredicateOnEdge(), llvm::CmpInst::ICMP_EQ, llvm::pred_begin(), llvm::pred_end(), llvm::SwitchInst::removeCase(), llvm::SwitchInst::setCondition(), llvm::LazyValueInfo::True, and llvm::LazyValueInfo::Unknown.
Referenced by runImpl().
|
static |
Definition at line 486 of file CorrelatedValuePropagation.cpp.
References llvm::MCID::Add, C, llvm::Call, llvm::depth_first(), getConstantAt(), llvm::Function::getEntryBlock(), llvm::Instruction::getOpcode(), llvm::SPII::Load, processAdd(), processAShr(), processCallSite(), processCmp(), processMemAccess(), processPHI(), processSDiv(), processSelect(), processSRem(), processSwitch(), llvm::MipsISD::Ret, llvm::MCID::Select, llvm::SPII::Store, and Switch().
Referenced by llvm::CorrelatedValuePropagationPass::run().
| STATISTIC | ( | NumPhis | , |
| "Number of phis propagated" | |||
| ) |
| STATISTIC | ( | NumSelects | , |
| "Number of selects propagated" | |||
| ) |
| STATISTIC | ( | NumMemAccess | , |
| "Number of memory access targets propagated" | |||
| ) |
| STATISTIC | ( | NumCmps | , |
| "Number of comparisons propagated" | |||
| ) |
| STATISTIC | ( | NumReturns | , |
| "Number of return values propagated" | |||
| ) |
| STATISTIC | ( | NumDeadCases | , |
| "Number of switch cases removed" | |||
| ) |
| STATISTIC | ( | NumSDivs | , |
| "Number of sdiv converted to udiv" | |||
| ) |
| STATISTIC | ( | NumAShrs | , |
| "Number of ashr converted to lshr" | |||
| ) |
| STATISTIC | ( | NumSRems | , |
| "Number of srem converted to urem" | |||
| ) |
Referenced by processAdd().
| correlated Value false |
Definition at line 67 of file CorrelatedValuePropagation.cpp.
| correlated propagation |
Definition at line 67 of file CorrelatedValuePropagation.cpp.
| Interprocedural Sparse Conditional Constant Propagation |
Definition at line 67 of file CorrelatedValuePropagation.cpp.
1.8.6