Go to the documentation of this file.
16 #include "llvm/Config/llvm-config.h"
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.");
81 for (
unsigned i = 0,
e =
I->getNumOperands();
i !=
e; ++
i)
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");
137 for (
unsigned i = 0,
e =
I->getNumOperands();
i !=
e; ++
i) {
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);
222 GEPOps.push_back(GEPOp);
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))) {
245 if (
std::equal(GEPOps.begin(), GEPOps.end(), GEPI->op_begin()))
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();
375 auto *Inst = dyn_cast<Instruction>(InVal);
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",
391 NewInsts.push_back(New);
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;
403 GEPOps.push_back(OpVal);
410 Result->setIsInBounds(
GEP->isInBounds());
411 NewInsts.push_back(Result);
425 CurBB, PredBB, DT, NewInsts);
426 if (OpVal == 0)
return 0;
429 InVal->
getName()+
".phi.trans.insert",
433 NewInsts.push_back(Res);
static void RemoveInstInputs(Value *V, SmallVectorImpl< Instruction * > &InstInputs)
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
iterator erase(const_iterator CI)
bool isSafeToSpeculativelyExecute(const Value *V, const Instruction *CtxI=nullptr, const DominatorTree *DT=nullptr, const TargetLibraryInfo *TLI=nullptr)
Return true if the instruction does not have any effects besides calculating the result and does not ...
PHITransAddr - An address value which tracks and handles phi translation.
const Function * getParent() const
Return the enclosing method, or null if none.
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 ...
Concrete subclass of DominatorTreeBase that is used to compute a normal dominator tree.
Value * PHITranslateWithInsertion(BasicBlock *CurBB, BasicBlock *PredBB, const DominatorTree &DT, SmallVectorImpl< Instruction * > &NewInsts)
PHITranslateWithInsertion - PHI translate this value into the specified predecessor block,...
static bool CanPHITrans(Instruction *Inst)
void setHasNoUnsignedWrap(bool b=true)
Set or clear the nuw flag on this instruction, which must be an operator which supports this flag.
bool IsPotentiallyPHITranslatable() const
IsPotentiallyPHITranslatable - If this needs PHI translation, return true if we have some hope of doi...
raw_fd_ostream & errs()
This returns a reference to a raw_ostream for standard error.
LLVM_NODISCARD T pop_back_val()
LLVM Basic Block Representation.
raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
bool dominates(const BasicBlock *BB, const Use &U) const
Return true if the (end of the) basic block BB dominates the use U.
This is the shared class of boolean and integer constants.
unsigned getOpcode() const
Returns a member of one of the enums like Instruction::Add.
static bool hasNoUnsignedWrap(BinaryOperator &I)
void setHasNoSignedWrap(bool b=true)
Set or clear the nsw flag on this instruction, which must be an operator which supports this flag.
(vector float) vec_cmpeq(*A, *B) C
Value * SimplifyGEPInst(Type *SrcTy, ArrayRef< Value * > Ops, const SimplifyQuery &Q)
Given operands for a GetElementPtrInst, fold the result or return null.
This is an important base class in LLVM.
SymbolTableList< Instruction >::iterator eraseFromParent()
This method unlinks 'this' from the containing basic block and deletes it.
static bool VerifySubExpr(Value *Expr, SmallVectorImpl< Instruction * > &InstInputs)
auto find(R &&Range, const T &Val)
Provide wrappers to std::find which take ranges instead of having to pass begin/end explicitly.
an instruction for type-safe pointer arithmetic to access elements of arrays and structs
bool is_contained(R &&Range, const E &Element)
Wrapper function around std::find to detect if an element exists in a container.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static Constant * getCast(unsigned ops, Constant *C, Type *Ty, bool OnlyIfReduced=false)
Convenience function for getting a Cast operation.
bool isReachableFromEntry(const Use &U) const
Provide an overload for a Use.
bool PHITranslateValue(BasicBlock *CurBB, BasicBlock *PredBB, const DominatorTree *DT, bool MustDominate)
PHITranslateValue - PHI translate the current address up the CFG from CurBB to Pred,...
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.
Type * getType() const
All values are typed, get the type of this value.
bool Verify() const
Verify - Check internal consistency of this data structure.
This is the base class for all instructions that perform data casts.
StringRef getName() const
Return a constant reference to the value's name.
const Instruction * getTerminator() const LLVM_READONLY
Returns the terminator instruction if the block is well formed or null if the block is not well forme...
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static bool isInput(const StringSet<> &Prefixes, StringRef Arg)
static bool hasNoSignedWrap(BinaryOperator &I)
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
unsigned getNumOperands() const
const DebugLoc & getDebugLoc() const
Return the debug location for this node as a DebugLoc.
const BasicBlock * getParent() const
static BinaryOperator * CreateAdd(Value *S1, Value *S2, const Twine &Name, Instruction *InsertBefore, Value *FlagsOp)
Value * getOperand(unsigned i) const
Value * SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, const SimplifyQuery &Q)
Given operands for an Add, fold the result or return null.
LLVM Value Representation.
iterator_range< user_iterator > users()