26 if (isa<PHINode>(Inst) ||
27 isa<GetElementPtrInst>(Inst))
30 if (isa<CastInst>(Inst) &&
34 if (Inst->
getOpcode() == Instruction::Add &&
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";
61 if (I == 0)
return true;
66 std::find(InstInputs.
begin(), InstInputs.
end(),
I);
67 if (Entry != InstInputs.
end()) {
68 InstInputs.
erase(Entry);
75 errs() <<
"Non phi translatable instruction found in PHITransAddr:\n";
78 "CanPHITrans is wrong.");
93 if (Addr == 0)
return true;
101 errs() <<
"PHITransAddr contains extra instructions:\n";
102 for (
unsigned i = 0, e = InstInputs.size(); i != e; ++i)
103 errs() <<
" InstInput #" << i <<
" is " << *InstInputs[i] <<
"\n";
130 std::find(InstInputs.
begin(), InstInputs.
end(),
I);
131 if (Entry != InstInputs.
end()) {
132 InstInputs.
erase(Entry);
136 assert(!isa<PHINode>(I) &&
"Error, removing something that isn't an input");
150 if (Inst == 0)
return V;
153 bool isInput = std::count(InstInputs.begin(), InstInputs.end(), Inst);
167 InstInputs.erase(std::find(InstInputs.begin(), InstInputs.end(), Inst));
170 if (
PHINode *PN = dyn_cast<PHINode>(Inst))
171 return AddAsInput(PN->getIncomingValueForBlock(PredBB));
182 InstInputs.push_back(Op);
189 if (
CastInst *Cast = dyn_cast<CastInst>(Inst)) {
191 Value *PHIIn = PHITranslateSubExpr(Cast->getOperand(0), CurBB, PredBB, DT);
192 if (PHIIn == 0)
return 0;
193 if (PHIIn == Cast->getOperand(0))
199 if (
Constant *
C = dyn_cast<Constant>(PHIIn))
201 C, Cast->getType()));
207 if (
CastInst *CastI = dyn_cast<CastInst>(*UI))
208 if (CastI->getOpcode() == Cast->getOpcode() &&
209 CastI->getType() == Cast->getType() &&
210 (!DT || DT->
dominates(CastI->getParent(), PredBB)))
219 bool AnyChanged =
false;
220 for (
unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) {
221 Value *GEPOp = PHITranslateSubExpr(GEP->getOperand(i), CurBB, PredBB, DT);
222 if (GEPOp == 0)
return 0;
224 AnyChanged |= GEPOp != GEP->getOperand(i);
233 for (
unsigned i = 0, e = GEPOps.
size(); i != e; ++i)
236 return AddAsInput(V);
240 Value *APHIOp = GEPOps[0];
244 if (GEPI->getType() == GEP->getType() &&
245 GEPI->getNumOperands() == GEPOps.
size() &&
246 GEPI->getParent()->getParent() == CurBB->
getParent() &&
247 (!DT || DT->
dominates(GEPI->getParent(), PredBB))) {
248 bool Mismatch =
false;
249 for (
unsigned i = 0, e = GEPOps.
size(); i != e; ++i)
250 if (GEPI->getOperand(i) != GEPOps[i]) {
262 if (Inst->
getOpcode() == Instruction::Add &&
266 bool isNSW = cast<BinaryOperator>(Inst)->hasNoSignedWrap();
267 bool isNUW = cast<BinaryOperator>(Inst)->hasNoUnsignedWrap();
269 Value *LHS = PHITranslateSubExpr(Inst->
getOperand(0), CurBB, PredBB, DT);
270 if (LHS == 0)
return 0;
274 if (BOp->getOpcode() == Instruction::Add)
275 if (
ConstantInt *CI = dyn_cast<ConstantInt>(BOp->getOperand(1))) {
276 LHS = BOp->getOperand(0);
278 isNSW = isNUW =
false;
281 if (std::count(InstInputs.begin(), InstInputs.end(), BOp)) {
292 return AddAsInput(Res);
303 if (BO->getOpcode() == Instruction::Add &&
304 BO->getOperand(0) == LHS && BO->getOperand(1) == RHS &&
305 BO->getParent()->getParent() == CurBB->
getParent() &&
306 (!DT || DT->
dominates(BO->getParent(), PredBB)))
324 assert(
Verify() &&
"Invalid PHITransAddr!");
325 Addr = PHITranslateSubExpr(Addr, CurBB, PredBB, DT);
326 assert(
Verify() &&
"Invalid PHITransAddr!");
330 if (
Instruction *Inst = dyn_cast_or_null<Instruction>(Addr))
349 unsigned NISize = NewInsts.
size();
352 Addr = InsertPHITranslatedSubExpr(Addr, CurBB, PredBB, DT, NewInsts);
355 if (Addr)
return Addr;
358 while (NewInsts.
size() != NISize)
369 Value *PHITransAddr::
376 if (!Tmp.PHITranslateValue(CurBB, PredBB, &DT))
377 return Tmp.getAddr();
384 if (
CastInst *Cast = dyn_cast<CastInst>(Inst)) {
386 Value *OpVal = InsertPHITranslatedSubExpr(Cast->getOperand(0),
387 CurBB, PredBB, DT, NewInsts);
388 if (OpVal == 0)
return 0;
393 InVal->
getName()+
".phi.trans.insert",
394 PredBB->getTerminator());
403 for (
unsigned i = 0, e = GEP->getNumOperands(); i != e; ++i) {
404 Value *OpVal = InsertPHITranslatedSubExpr(GEP->getOperand(i),
405 CurBB, PredBB, DT, NewInsts);
406 if (OpVal == 0)
return 0;
412 InVal->
getName()+
".phi.trans.insert",
413 PredBB->getTerminator());
425 if (Inst->
getOpcode() == Instruction::Add &&
429 CurBB, PredBB, DT, NewInsts);
430 if (OpVal == 0)
return 0;
433 InVal->
getName()+
".phi.trans.insert",
434 PredBB->getTerminator());
void push_back(const T &Elt)
void setHasNoSignedWrap(bool b=true)
Value * PHITranslateWithInsertion(BasicBlock *CurBB, BasicBlock *PredBB, const DominatorTree &DT, SmallVectorImpl< Instruction * > &NewInsts)
enable_if_c<!is_simple_type< Y >::value, typename cast_retty< X, const Y >::ret_type >::type dyn_cast(const Y &Val)
unsigned getNumOperands() const
Value * SimplifyAddInst(Value *LHS, Value *RHS, bool isNSW, bool isNUW, const DataLayout *TD=0, const TargetLibraryInfo *TLI=0, const DominatorTree *DT=0)
const Function * getParent() const
Return the enclosing method, or null if none.
StringRef getName() const
static Constant * getAdd(Constant *C1, Constant *C2, bool HasNUW=false, bool HasNSW=false)
static bool isInput(const llvm::StringSet<> &Prefixes, StringRef Arg)
Base class of casting instructions.
ArrayRef< T > makeArrayRef(const T &OneElt)
Construct an ArrayRef from a single element.
T LLVM_ATTRIBUTE_UNUSED_RESULT pop_back_val()
#define llvm_unreachable(msg)
void setHasNoUnsignedWrap(bool b=true)
void setIsInBounds(bool b=true)
Value * SimplifyGEPInst(ArrayRef< Value * > Ops, const DataLayout *TD=0, const TargetLibraryInfo *TLI=0, const DominatorTree *DT=0)
static CastInst * Create(Instruction::CastOps, Value *S, Type *Ty, const Twine &Name="", Instruction *InsertBefore=0)
Construct any of the CastInst subclasses.
LLVM Basic Block Representation.
bool PHITranslateValue(BasicBlock *CurBB, BasicBlock *PredBB, const DominatorTree *DT)
LLVM Constant Representation.
Value * getOperand(unsigned i) const
bool dominates(const DomTreeNode *A, const DomTreeNode *B) const
iterator erase(iterator I)
bool IsPotentiallyPHITranslatable() const
static void RemoveInstInputs(Value *V, SmallVectorImpl< Instruction * > &InstInputs)
bool isSafeToSpeculativelyExecute(const Value *V, const DataLayout *TD=0)
Class for constant integers.
static bool VerifySubExpr(Value *Expr, SmallVectorImpl< Instruction * > &InstInputs)
static GetElementPtrInst * Create(Value *Ptr, ArrayRef< Value * > IdxList, const Twine &NameStr="", Instruction *InsertBefore=0)
raw_ostream & dbgs()
dbgs - Return a circular-buffered debug stream.
static bool CanPHITrans(Instruction *Inst)
LLVM Value Representation.
unsigned getOpcode() const
getOpcode() returns a member of one of the enums like Instruction::Add.
static Constant * getCast(unsigned ops, Constant *C, Type *Ty)
const BasicBlock * getParent() const