26 if (isa<PHINode>(Inst) ||
27 isa<GetElementPtrInst>(Inst))
30 if (isa<CastInst>(Inst) &&
44 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
47 dbgs() <<
"PHITransAddr: null\n";
50 dbgs() <<
"PHITransAddr: " << *Addr <<
"\n";
51 for (
unsigned i = 0, e = InstInputs.size();
i != e; ++
i)
52 dbgs() <<
" Input #" <<
i <<
" is " << *InstInputs[
i] <<
"\n";
66 if (Entry != InstInputs.
end()) {
67 InstInputs.
erase(Entry);
74 errs() <<
"Instruction in PHITransAddr is not phi-translatable:\n";
77 "CanPHITrans is wrong.");
92 if (!Addr)
return true;
100 errs() <<
"PHITransAddr contains extra instructions:\n";
101 for (
unsigned i = 0, e = InstInputs.size();
i != e; ++
i)
102 errs() <<
" InstInput #" <<
i <<
" is " << *InstInputs[
i] <<
"\n";
129 if (Entry != InstInputs.
end()) {
130 InstInputs.
erase(Entry);
134 assert(!isa<PHINode>(I) &&
"Error, removing something that isn't an input");
165 InstInputs.erase(
find(InstInputs, Inst));
168 if (
PHINode *PN = dyn_cast<PHINode>(Inst))
169 return AddAsInput(PN->getIncomingValueForBlock(PredBB));
180 InstInputs.push_back(
Op);
187 if (
CastInst *Cast = dyn_cast<CastInst>(Inst)) {
189 Value *PHIIn = PHITranslateSubExpr(Cast->getOperand(0), CurBB, PredBB, DT);
190 if (!PHIIn)
return nullptr;
191 if (PHIIn == Cast->getOperand(0))
197 if (
Constant *
C = dyn_cast<Constant>(PHIIn))
199 C, Cast->getType()));
204 if (
CastInst *CastI = dyn_cast<CastInst>(U))
205 if (CastI->getOpcode() == Cast->getOpcode() &&
206 CastI->getType() == Cast->getType() &&
207 (!DT || DT->
dominates(CastI->getParent(), PredBB)))
216 bool AnyChanged =
false;
217 for (
unsigned i = 0, e =
GEP->getNumOperands();
i != e; ++
i) {
218 Value *GEPOp = PHITranslateSubExpr(
GEP->getOperand(
i), CurBB, PredBB, DT);
219 if (!GEPOp)
return nullptr;
221 AnyChanged |= GEPOp !=
GEP->getOperand(
i);
230 GEPOps, DL, TLI, DT, AC)) {
231 for (
unsigned i = 0, e = GEPOps.
size();
i != e; ++
i)
234 return AddAsInput(V);
238 Value *APHIOp = GEPOps[0];
241 if (GEPI->getType() ==
GEP->getType() &&
242 GEPI->getNumOperands() == GEPOps.
size() &&
243 GEPI->getParent()->getParent() == CurBB->
getParent() &&
244 (!DT || DT->dominates(GEPI->getParent(), PredBB))) {
257 bool isNSW = cast<BinaryOperator>(Inst)->hasNoSignedWrap();
258 bool isNUW = cast<BinaryOperator>(Inst)->hasNoUnsignedWrap();
260 Value *LHS = PHITranslateSubExpr(Inst->
getOperand(0), CurBB, PredBB, DT);
261 if (!LHS)
return nullptr;
266 if (
ConstantInt *CI = dyn_cast<ConstantInt>(BOp->getOperand(1))) {
267 LHS = BOp->getOperand(0);
269 isNSW = isNUW =
false;
283 return AddAsInput(Res);
294 BO->getOperand(0) == LHS && BO->getOperand(1) == RHS &&
295 BO->getParent()->getParent() == CurBB->
getParent() &&
296 (!DT || DT->dominates(BO->getParent(), PredBB)))
315 assert(DT || !MustDominate);
319 PHITranslateSubExpr(Addr, CurBB, PredBB, MustDominate ? DT :
nullptr);
326 if (
Instruction *Inst = dyn_cast_or_null<Instruction>(Addr))
327 if (!DT->dominates(Inst->
getParent(), PredBB))
330 return Addr ==
nullptr;
344 unsigned NISize = NewInsts.
size();
347 Addr = InsertPHITranslatedSubExpr(Addr, CurBB, PredBB, DT, NewInsts);
350 if (Addr)
return Addr;
353 while (NewInsts.
size() != NISize)
364 Value *PHITransAddr::
371 if (!Tmp.PHITranslateValue(CurBB, PredBB, &DT,
true))
372 return Tmp.getAddr();
380 if (
CastInst *Cast = dyn_cast<CastInst>(Inst)) {
382 Value *OpVal = InsertPHITranslatedSubExpr(Cast->getOperand(0),
383 CurBB, PredBB, DT, NewInsts);
384 if (!OpVal)
return nullptr;
388 InVal->
getName() +
".phi.trans.insert",
389 PredBB->getTerminator());
399 for (
unsigned i = 0, e =
GEP->getNumOperands();
i != e; ++
i) {
400 Value *OpVal = InsertPHITranslatedSubExpr(
GEP->getOperand(
i),
401 CurBB, PredBB, DT, NewInsts);
402 if (!OpVal)
return nullptr;
408 InVal->
getName() +
".phi.trans.insert", PredBB->getTerminator());
425 CurBB, PredBB, DT, NewInsts);
426 if (OpVal == 0)
return 0;
429 InVal->
getName()+
".phi.trans.insert",
430 PredBB->getTerminator());
SymbolTableList< Instruction >::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
void push_back(const T &Elt)
raw_ostream & errs()
This returns a reference to a raw_ostream for standard error.
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds...
Value * PHITranslateWithInsertion(BasicBlock *CurBB, BasicBlock *PredBB, const DominatorTree &DT, SmallVectorImpl< Instruction * > &NewInsts)
PHITranslateWithInsertion - PHI translate this value into the specified predecessor block...
unsigned getNumOperands() const
const Function * getParent() const
Return the enclosing method, or null if none.
Value * SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for an Add, fold the result or return null.
StringRef getName() const
Return a constant reference to the value's name.
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static bool isInput(const llvm::StringSet<> &Prefixes, StringRef Arg)
This is the base class for all instructions that perform data casts.
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
void setIsInBounds(bool b=true)
Set or clear the inbounds flag on this GEP instruction.
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree...
static BinaryOperator * CreateAdd(Value *S1, Value *S2, const Twine &Name, Instruction *InsertBefore, Value *FlagsOp)
an instruction for type-safe pointer arithmetic to access elements of arrays and structs ...
void setDebugLoc(DebugLoc Loc)
Set the debug location information for this instruction.
LLVM Basic Block Representation.
PHITransAddr - An address value which tracks and handles phi translation.
This is an important base class in LLVM.
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator begin()
This file contains the declarations for the subclasses of Constant, which represent the different fla...
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
Value * getOperand(unsigned i) const
iterator erase(const_iterator CI)
static GetElementPtrInst * Create(Type *PointeeType, Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", Instruction *InsertBefore=nullptr)
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
bool IsPotentiallyPHITranslatable() const
IsPotentiallyPHITranslatable - If this needs PHI translation, return true if we have some hope of doi...
static void RemoveInstInputs(Value *V, SmallVectorImpl< Instruction * > &InstInputs)
bool dominates(const Instruction *Def, const Use &U) const
Return true if Def dominates a use in User.
void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag...
This is the shared class of boolean and integer constants.
auto find(R &&Range, const T &Val) -> decltype(std::begin(Range))
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly...
bool PHITranslateValue(BasicBlock *CurBB, BasicBlock *PredBB, const DominatorTree *DT, bool MustDominate)
PHITranslateValue - PHI translate the current address up the CFG from CurBB to Pred, updating our state to reflect any needed changes.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
Type * getType() const
All values are typed, get the type of this value.
static bool VerifySubExpr(Value *Expr, SmallVectorImpl< Instruction * > &InstInputs)
LLVM_NODISCARD T pop_back_val()
static GCRegistry::Add< ShadowStackGC > C("shadow-stack","Very portable GC for uncooperative code generators")
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
iterator_range< user_iterator > users()
static Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
static bool CanPHITrans(Instruction *Inst)
Value * SimplifyGEPInst(Type *SrcTy, ArrayRef< Value * > Ops, const DataLayout &DL, const TargetLibraryInfo *TLI=nullptr, const DominatorTree *DT=nullptr, AssumptionCache *AC=nullptr, const Instruction *CxtI=nullptr)
Given operands for a GetElementPtrInst, fold the result or return null.
static CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", Instruction *InsertBefore=nullptr)
Provides a way to construct any of the CastInst subclasses using an opcode instead of the subclass's ...
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator end()
LLVM_ATTRIBUTE_ALWAYS_INLINE size_type size() const
LLVM_NODISCARD std::enable_if<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
void setHasNoUnsignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag...
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
bool isSafeToSpeculativelyExecute(const Value *V, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr)
Return true if the instruction does not have any effects besides calculating the result and does not ...
LLVM Value Representation.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
bool Verify() const
Verify - Check internal consistency of this data structure.
const BasicBlock * getParent() const
bool is_contained(R &&Range, const E &Element)
Wrapper function around std::find to detect if an element exists in a container.