Lines Matching refs:Inst
58 bool AllUsesDominatedByBlock(Instruction *Inst, BasicBlock *BB) const;
59 bool IsAcceptableTarget(Instruction *Inst, BasicBlock *SuccToSinkTo) const;
74 bool Sinking::AllUsesDominatedByBlock(Instruction *Inst, in AllUsesDominatedByBlock() argument
80 for (Value::use_iterator I = Inst->use_begin(), in AllUsesDominatedByBlock()
81 E = Inst->use_end(); I != E; ++I) { in AllUsesDominatedByBlock()
136 Instruction *Inst = I; // The instruction to sink. in ProcessBlock() local
144 if (isa<DbgInfoIntrinsic>(Inst)) in ProcessBlock()
147 if (SinkInstruction(Inst, Stores)) in ProcessBlock()
156 static bool isSafeToMove(Instruction *Inst, AliasAnalysis *AA, in isSafeToMove() argument
159 if (Inst->mayWriteToMemory()) { in isSafeToMove()
160 Stores.insert(Inst); in isSafeToMove()
164 if (LoadInst *L = dyn_cast<LoadInst>(Inst)) { in isSafeToMove()
172 if (isa<TerminatorInst>(Inst) || isa<PHINode>(Inst)) in isSafeToMove()
180 bool Sinking::IsAcceptableTarget(Instruction *Inst, in IsAcceptableTarget() argument
182 assert(Inst && "Instruction to be sunk is null"); in IsAcceptableTarget()
187 if (Inst->getParent() == SuccToSinkTo) in IsAcceptableTarget()
194 if (SuccToSinkTo->getUniquePredecessor() != Inst->getParent()) { in IsAcceptableTarget()
197 if (!isSafeToSpeculativelyExecute(Inst)) in IsAcceptableTarget()
202 if (!DT->dominates(Inst->getParent(), SuccToSinkTo)) in IsAcceptableTarget()
207 Loop *cur = LI->getLoopFor(Inst->getParent()); in IsAcceptableTarget()
214 return AllUsesDominatedByBlock(Inst, SuccToSinkTo); in IsAcceptableTarget()
219 bool Sinking::SinkInstruction(Instruction *Inst, in SinkInstruction() argument
222 if (!isSafeToMove(Inst, AA, Stores)) in SinkInstruction()
240 DomTreeNode *DTN = DT->getNode(Inst->getParent()); in SinkInstruction()
244 if ((*I)->getIDom()->getBlock() == Inst->getParent() && in SinkInstruction()
245 IsAcceptableTarget(Inst, Candidate)) in SinkInstruction()
251 for (succ_iterator I = succ_begin(Inst->getParent()), in SinkInstruction()
252 E = succ_end(Inst->getParent()); I != E && SuccToSinkTo == 0; ++I) { in SinkInstruction()
253 if (IsAcceptableTarget(Inst, *I)) in SinkInstruction()
261 DEBUG(dbgs() << "Sink" << *Inst << " ("; in SinkInstruction()
262 WriteAsOperand(dbgs(), Inst->getParent(), false); in SinkInstruction()
268 Inst->moveBefore(SuccToSinkTo->getFirstInsertionPt()); in SinkInstruction()