|
@@ -283,12 +283,8 @@ isProfitableToFoldUnconditional(BranchInst *SI1, BranchInst *SI2,
|
|
|
/// of Succ.
|
|
|
static void AddPredecessorToBlock(BasicBlock *Succ, BasicBlock *NewPred,
|
|
|
BasicBlock *ExistPred) {
|
|
|
- if (!isa<PHINode>(Succ->begin()))
|
|
|
- return; // Quick exit if nothing to do
|
|
|
-
|
|
|
- PHINode *PN;
|
|
|
- for (BasicBlock::iterator I = Succ->begin(); (PN = dyn_cast<PHINode>(I)); ++I)
|
|
|
- PN->addIncoming(PN->getIncomingValueForBlock(ExistPred), NewPred);
|
|
|
+ for (PHINode &PN : Succ->phis())
|
|
|
+ PN.addIncoming(PN.getIncomingValueForBlock(ExistPred), NewPred);
|
|
|
}
|
|
|
|
|
|
/// Compute an abstract "cost" of speculating the given instruction,
|
|
@@ -1228,11 +1224,9 @@ bool SimplifyCFGOpt::FoldValueComparisonIntoPredecessors(TerminatorInst *TI,
|
|
|
static bool isSafeToHoistInvoke(BasicBlock *BB1, BasicBlock *BB2,
|
|
|
Instruction *I1, Instruction *I2) {
|
|
|
for (BasicBlock *Succ : successors(BB1)) {
|
|
|
- PHINode *PN;
|
|
|
- for (BasicBlock::iterator BBI = Succ->begin();
|
|
|
- (PN = dyn_cast<PHINode>(BBI)); ++BBI) {
|
|
|
- Value *BB1V = PN->getIncomingValueForBlock(BB1);
|
|
|
- Value *BB2V = PN->getIncomingValueForBlock(BB2);
|
|
|
+ for (const PHINode &PN : Succ->phis()) {
|
|
|
+ Value *BB1V = PN.getIncomingValueForBlock(BB1);
|
|
|
+ Value *BB2V = PN.getIncomingValueForBlock(BB2);
|
|
|
if (BB1V != BB2V && (BB1V == I1 || BB2V == I2)) {
|
|
|
return false;
|
|
|
}
|
|
@@ -1332,18 +1326,16 @@ HoistTerminator:
|
|
|
return Changed;
|
|
|
|
|
|
for (BasicBlock *Succ : successors(BB1)) {
|
|
|
- PHINode *PN;
|
|
|
- for (BasicBlock::iterator BBI = Succ->begin();
|
|
|
- (PN = dyn_cast<PHINode>(BBI)); ++BBI) {
|
|
|
- Value *BB1V = PN->getIncomingValueForBlock(BB1);
|
|
|
- Value *BB2V = PN->getIncomingValueForBlock(BB2);
|
|
|
+ for (PHINode &PN : Succ->phis()) {
|
|
|
+ Value *BB1V = PN.getIncomingValueForBlock(BB1);
|
|
|
+ Value *BB2V = PN.getIncomingValueForBlock(BB2);
|
|
|
if (BB1V == BB2V)
|
|
|
continue;
|
|
|
|
|
|
// Check for passingValueIsAlwaysUndefined here because we would rather
|
|
|
// eliminate undefined control flow then converting it to a select.
|
|
|
- if (passingValueIsAlwaysUndefined(BB1V, PN) ||
|
|
|
- passingValueIsAlwaysUndefined(BB2V, PN))
|
|
|
+ if (passingValueIsAlwaysUndefined(BB1V, &PN) ||
|
|
|
+ passingValueIsAlwaysUndefined(BB2V, &PN))
|
|
|
return Changed;
|
|
|
|
|
|
if (isa<ConstantExpr>(BB1V) && !isSafeToSpeculativelyExecute(BB1V))
|
|
@@ -1369,11 +1361,9 @@ HoistTerminator:
|
|
|
// nodes, so we insert select instruction to compute the final result.
|
|
|
std::map<std::pair<Value *, Value *>, SelectInst *> InsertedSelects;
|
|
|
for (BasicBlock *Succ : successors(BB1)) {
|
|
|
- PHINode *PN;
|
|
|
- for (BasicBlock::iterator BBI = Succ->begin();
|
|
|
- (PN = dyn_cast<PHINode>(BBI)); ++BBI) {
|
|
|
- Value *BB1V = PN->getIncomingValueForBlock(BB1);
|
|
|
- Value *BB2V = PN->getIncomingValueForBlock(BB2);
|
|
|
+ for (PHINode &PN : Succ->phis()) {
|
|
|
+ Value *BB1V = PN.getIncomingValueForBlock(BB1);
|
|
|
+ Value *BB2V = PN.getIncomingValueForBlock(BB2);
|
|
|
if (BB1V == BB2V)
|
|
|
continue;
|
|
|
|
|
@@ -1386,9 +1376,9 @@ HoistTerminator:
|
|
|
BB1V->getName() + "." + BB2V->getName(), BI));
|
|
|
|
|
|
// Make the PHI node use the select for all incoming values for BB1/BB2
|
|
|
- for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
|
|
|
- if (PN->getIncomingBlock(i) == BB1 || PN->getIncomingBlock(i) == BB2)
|
|
|
- PN->setIncomingValue(i, SI);
|
|
|
+ for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
|
|
|
+ if (PN.getIncomingBlock(i) == BB1 || PN.getIncomingBlock(i) == BB2)
|
|
|
+ PN.setIncomingValue(i, SI);
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -1999,10 +1989,9 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
|
|
|
|
|
// Check that the PHI nodes can be converted to selects.
|
|
|
bool HaveRewritablePHIs = false;
|
|
|
- for (BasicBlock::iterator I = EndBB->begin();
|
|
|
- PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
|
|
- Value *OrigV = PN->getIncomingValueForBlock(BB);
|
|
|
- Value *ThenV = PN->getIncomingValueForBlock(ThenBB);
|
|
|
+ for (PHINode &PN : EndBB->phis()) {
|
|
|
+ Value *OrigV = PN.getIncomingValueForBlock(BB);
|
|
|
+ Value *ThenV = PN.getIncomingValueForBlock(ThenBB);
|
|
|
|
|
|
// FIXME: Try to remove some of the duplication with HoistThenElseCodeToIf.
|
|
|
// Skip PHIs which are trivial.
|
|
@@ -2010,8 +1999,8 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
|
|
continue;
|
|
|
|
|
|
// Don't convert to selects if we could remove undefined behavior instead.
|
|
|
- if (passingValueIsAlwaysUndefined(OrigV, PN) ||
|
|
|
- passingValueIsAlwaysUndefined(ThenV, PN))
|
|
|
+ if (passingValueIsAlwaysUndefined(OrigV, &PN) ||
|
|
|
+ passingValueIsAlwaysUndefined(ThenV, &PN))
|
|
|
return false;
|
|
|
|
|
|
HaveRewritablePHIs = true;
|
|
@@ -2072,12 +2061,11 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
|
|
|
|
|
// Insert selects and rewrite the PHI operands.
|
|
|
IRBuilder<NoFolder> Builder(BI);
|
|
|
- for (BasicBlock::iterator I = EndBB->begin();
|
|
|
- PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
|
|
- unsigned OrigI = PN->getBasicBlockIndex(BB);
|
|
|
- unsigned ThenI = PN->getBasicBlockIndex(ThenBB);
|
|
|
- Value *OrigV = PN->getIncomingValue(OrigI);
|
|
|
- Value *ThenV = PN->getIncomingValue(ThenI);
|
|
|
+ for (PHINode &PN : EndBB->phis()) {
|
|
|
+ unsigned OrigI = PN.getBasicBlockIndex(BB);
|
|
|
+ unsigned ThenI = PN.getBasicBlockIndex(ThenBB);
|
|
|
+ Value *OrigV = PN.getIncomingValue(OrigI);
|
|
|
+ Value *ThenV = PN.getIncomingValue(ThenI);
|
|
|
|
|
|
// Skip PHIs which are trivial.
|
|
|
if (OrigV == ThenV)
|
|
@@ -2091,8 +2079,8 @@ static bool SpeculativelyExecuteBB(BranchInst *BI, BasicBlock *ThenBB,
|
|
|
std::swap(TrueV, FalseV);
|
|
|
Value *V = Builder.CreateSelect(
|
|
|
BrCond, TrueV, FalseV, "spec.select", BI);
|
|
|
- PN->setIncomingValue(OrigI, V);
|
|
|
- PN->setIncomingValue(ThenI, V);
|
|
|
+ PN.setIncomingValue(OrigI, V);
|
|
|
+ PN.setIncomingValue(ThenI, V);
|
|
|
}
|
|
|
|
|
|
// Remove speculated dbg intrinsics.
|
|
@@ -3335,17 +3323,15 @@ static bool SimplifyCondBranchToCondBranch(BranchInst *PBI, BranchInst *BI,
|
|
|
// it. If it has PHIs though, the PHIs may have different
|
|
|
// entries for BB and PBI's BB. If so, insert a select to make
|
|
|
// them agree.
|
|
|
- PHINode *PN;
|
|
|
- for (BasicBlock::iterator II = CommonDest->begin();
|
|
|
- (PN = dyn_cast<PHINode>(II)); ++II) {
|
|
|
- Value *BIV = PN->getIncomingValueForBlock(BB);
|
|
|
- unsigned PBBIdx = PN->getBasicBlockIndex(PBI->getParent());
|
|
|
- Value *PBIV = PN->getIncomingValue(PBBIdx);
|
|
|
+ for (PHINode &PN : CommonDest->phis()) {
|
|
|
+ Value *BIV = PN.getIncomingValueForBlock(BB);
|
|
|
+ unsigned PBBIdx = PN.getBasicBlockIndex(PBI->getParent());
|
|
|
+ Value *PBIV = PN.getIncomingValue(PBBIdx);
|
|
|
if (BIV != PBIV) {
|
|
|
// Insert a select in PBI to pick the right value.
|
|
|
SelectInst *NV = cast<SelectInst>(
|
|
|
Builder.CreateSelect(PBICond, PBIV, BIV, PBIV->getName() + ".mux"));
|
|
|
- PN->setIncomingValue(PBBIdx, NV);
|
|
|
+ PN.setIncomingValue(PBBIdx, NV);
|
|
|
// Although the select has the same condition as PBI, the original branch
|
|
|
// weights for PBI do not apply to the new select because the select's
|
|
|
// 'logical' edges are incoming edges of the phi that is eliminated, not
|
|
@@ -4451,17 +4437,16 @@ static PHINode *FindPHIForConditionForwarding(ConstantInt *CaseValue,
|
|
|
|
|
|
BasicBlock *Succ = Branch->getSuccessor(0);
|
|
|
|
|
|
- BasicBlock::iterator I = Succ->begin();
|
|
|
- while (PHINode *PHI = dyn_cast<PHINode>(I++)) {
|
|
|
- int Idx = PHI->getBasicBlockIndex(BB);
|
|
|
+ for (PHINode &PHI : Succ->phis()) {
|
|
|
+ int Idx = PHI.getBasicBlockIndex(BB);
|
|
|
assert(Idx >= 0 && "PHI has no entry for predecessor?");
|
|
|
|
|
|
- Value *InValue = PHI->getIncomingValue(Idx);
|
|
|
+ Value *InValue = PHI.getIncomingValue(Idx);
|
|
|
if (InValue != CaseValue)
|
|
|
continue;
|
|
|
|
|
|
*PhiIndex = Idx;
|
|
|
- return PHI;
|
|
|
+ return &PHI;
|
|
|
}
|
|
|
|
|
|
return nullptr;
|
|
@@ -4491,19 +4476,16 @@ static bool ForwardSwitchConditionToPHI(SwitchInst *SI) {
|
|
|
// -->
|
|
|
// %r = phi i32 ... [ %x, %switchbb ] ...
|
|
|
|
|
|
- for (Instruction &InstInCaseDest : *CaseDest) {
|
|
|
- auto *Phi = dyn_cast<PHINode>(&InstInCaseDest);
|
|
|
- if (!Phi) break;
|
|
|
-
|
|
|
+ for (PHINode &Phi : CaseDest->phis()) {
|
|
|
// This only works if there is exactly 1 incoming edge from the switch to
|
|
|
// a phi. If there is >1, that means multiple cases of the switch map to 1
|
|
|
// value in the phi, and that phi value is not the switch condition. Thus,
|
|
|
// this transform would not make sense (the phi would be invalid because
|
|
|
// a phi can't have different incoming values from the same block).
|
|
|
- int SwitchBBIdx = Phi->getBasicBlockIndex(SwitchBlock);
|
|
|
- if (Phi->getIncomingValue(SwitchBBIdx) == CaseValue &&
|
|
|
- count(Phi->blocks(), SwitchBlock) == 1) {
|
|
|
- Phi->setIncomingValue(SwitchBBIdx, SI->getCondition());
|
|
|
+ int SwitchBBIdx = Phi.getBasicBlockIndex(SwitchBlock);
|
|
|
+ if (Phi.getIncomingValue(SwitchBBIdx) == CaseValue &&
|
|
|
+ count(Phi.blocks(), SwitchBlock) == 1) {
|
|
|
+ Phi.setIncomingValue(SwitchBBIdx, SI->getCondition());
|
|
|
Changed = true;
|
|
|
}
|
|
|
}
|
|
@@ -4656,14 +4638,13 @@ GetCaseResults(SwitchInst *SI, ConstantInt *CaseVal, BasicBlock *CaseDest,
|
|
|
return false;
|
|
|
|
|
|
// Get the values for this case from phi nodes in the destination block.
|
|
|
- BasicBlock::iterator I = (*CommonDest)->begin();
|
|
|
- while (PHINode *PHI = dyn_cast<PHINode>(I++)) {
|
|
|
- int Idx = PHI->getBasicBlockIndex(Pred);
|
|
|
+ for (PHINode &PHI : (*CommonDest)->phis()) {
|
|
|
+ int Idx = PHI.getBasicBlockIndex(Pred);
|
|
|
if (Idx == -1)
|
|
|
continue;
|
|
|
|
|
|
Constant *ConstVal =
|
|
|
- LookupConstant(PHI->getIncomingValue(Idx), ConstantPool);
|
|
|
+ LookupConstant(PHI.getIncomingValue(Idx), ConstantPool);
|
|
|
if (!ConstVal)
|
|
|
return false;
|
|
|
|
|
@@ -4671,7 +4652,7 @@ GetCaseResults(SwitchInst *SI, ConstantInt *CaseVal, BasicBlock *CaseDest,
|
|
|
if (!ValidLookupTableConstant(ConstVal, TTI))
|
|
|
return false;
|
|
|
|
|
|
- Res.push_back(std::make_pair(PHI, ConstVal));
|
|
|
+ Res.push_back(std::make_pair(&PHI, ConstVal));
|
|
|
}
|
|
|
|
|
|
return Res.size() > 0;
|
|
@@ -5946,14 +5927,13 @@ static bool passingValueIsAlwaysUndefined(Value *V, Instruction *I) {
|
|
|
/// If BB has an incoming value that will always trigger undefined behavior
|
|
|
/// (eg. null pointer dereference), remove the branch leading here.
|
|
|
static bool removeUndefIntroducingPredecessor(BasicBlock *BB) {
|
|
|
- for (BasicBlock::iterator i = BB->begin();
|
|
|
- PHINode *PHI = dyn_cast<PHINode>(i); ++i)
|
|
|
- for (unsigned i = 0, e = PHI->getNumIncomingValues(); i != e; ++i)
|
|
|
- if (passingValueIsAlwaysUndefined(PHI->getIncomingValue(i), PHI)) {
|
|
|
- TerminatorInst *T = PHI->getIncomingBlock(i)->getTerminator();
|
|
|
+ for (PHINode &PHI : BB->phis())
|
|
|
+ for (unsigned i = 0, e = PHI.getNumIncomingValues(); i != e; ++i)
|
|
|
+ if (passingValueIsAlwaysUndefined(PHI.getIncomingValue(i), &PHI)) {
|
|
|
+ TerminatorInst *T = PHI.getIncomingBlock(i)->getTerminator();
|
|
|
IRBuilder<> Builder(T);
|
|
|
if (BranchInst *BI = dyn_cast<BranchInst>(T)) {
|
|
|
- BB->removePredecessor(PHI->getIncomingBlock(i));
|
|
|
+ BB->removePredecessor(PHI.getIncomingBlock(i));
|
|
|
// Turn uncoditional branches into unreachables and remove the dead
|
|
|
// destination from conditional branches.
|
|
|
if (BI->isUnconditional())
|