mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-25 04:39:51 +00:00
Use phi ranges to simplify code. No functionality change intended.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@321585 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
d771b00e32
commit
66f3fb9fac
@ -6402,9 +6402,8 @@ PushLoopPHIs(const Loop *L, SmallVectorImpl<Instruction *> &Worklist) {
|
||||
BasicBlock *Header = L->getHeader();
|
||||
|
||||
// Push all Loop-header PHIs onto the Worklist stack.
|
||||
for (BasicBlock::iterator I = Header->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I)
|
||||
Worklist.push_back(PN);
|
||||
for (PHINode &PN : Header->phis())
|
||||
Worklist.push_back(&PN);
|
||||
}
|
||||
|
||||
const ScalarEvolution::BackedgeTakenInfo &
|
||||
@ -7638,12 +7637,9 @@ ScalarEvolution::getConstantEvolutionLoopExitValue(PHINode *PN,
|
||||
if (!Latch)
|
||||
return nullptr;
|
||||
|
||||
for (auto &I : *Header) {
|
||||
PHINode *PHI = dyn_cast<PHINode>(&I);
|
||||
if (!PHI) break;
|
||||
auto *StartCST = getOtherIncomingValue(PHI, Latch);
|
||||
if (!StartCST) continue;
|
||||
CurrentIterVals[PHI] = StartCST;
|
||||
for (PHINode &PHI : Header->phis()) {
|
||||
if (auto *StartCST = getOtherIncomingValue(&PHI, Latch))
|
||||
CurrentIterVals[&PHI] = StartCST;
|
||||
}
|
||||
if (!CurrentIterVals.count(PN))
|
||||
return RetVal = nullptr;
|
||||
@ -7720,13 +7716,9 @@ const SCEV *ScalarEvolution::computeExitCountExhaustively(const Loop *L,
|
||||
BasicBlock *Latch = L->getLoopLatch();
|
||||
assert(Latch && "Should follow from NumIncomingValues == 2!");
|
||||
|
||||
for (auto &I : *Header) {
|
||||
PHINode *PHI = dyn_cast<PHINode>(&I);
|
||||
if (!PHI)
|
||||
break;
|
||||
auto *StartCST = getOtherIncomingValue(PHI, Latch);
|
||||
if (!StartCST) continue;
|
||||
CurrentIterVals[PHI] = StartCST;
|
||||
for (PHINode &PHI : Header->phis()) {
|
||||
if (auto *StartCST = getOtherIncomingValue(&PHI, Latch))
|
||||
CurrentIterVals[&PHI] = StartCST;
|
||||
}
|
||||
if (!CurrentIterVals.count(PN))
|
||||
return getCouldNotCompute();
|
||||
|
@ -1154,16 +1154,11 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
|
||||
IVIncInsertLoop &&
|
||||
SE.DT.properlyDominates(LatchBlock, IVIncInsertLoop->getHeader());
|
||||
|
||||
for (auto &I : *L->getHeader()) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
// Found first non-phi, the rest of instructions are also not Phis.
|
||||
if (!PN)
|
||||
break;
|
||||
|
||||
if (!SE.isSCEVable(PN->getType()))
|
||||
for (PHINode &PN : L->getHeader()->phis()) {
|
||||
if (!SE.isSCEVable(PN.getType()))
|
||||
continue;
|
||||
|
||||
const SCEVAddRecExpr *PhiSCEV = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(PN));
|
||||
const SCEVAddRecExpr *PhiSCEV = dyn_cast<SCEVAddRecExpr>(SE.getSCEV(&PN));
|
||||
if (!PhiSCEV)
|
||||
continue;
|
||||
|
||||
@ -1175,16 +1170,16 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
|
||||
continue;
|
||||
|
||||
Instruction *TempIncV =
|
||||
cast<Instruction>(PN->getIncomingValueForBlock(LatchBlock));
|
||||
cast<Instruction>(PN.getIncomingValueForBlock(LatchBlock));
|
||||
|
||||
// Check whether we can reuse this PHI node.
|
||||
if (LSRMode) {
|
||||
if (!isExpandedAddRecExprPHI(PN, TempIncV, L))
|
||||
if (!isExpandedAddRecExprPHI(&PN, TempIncV, L))
|
||||
continue;
|
||||
if (L == IVIncInsertLoop && !hoistIVInc(TempIncV, IVIncInsertPos))
|
||||
continue;
|
||||
} else {
|
||||
if (!isNormalAddRecExprPHI(PN, TempIncV, L))
|
||||
if (!isNormalAddRecExprPHI(&PN, TempIncV, L))
|
||||
continue;
|
||||
}
|
||||
|
||||
@ -1193,7 +1188,7 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
|
||||
IncV = TempIncV;
|
||||
TruncTy = nullptr;
|
||||
InvertStep = false;
|
||||
AddRecPhiMatch = PN;
|
||||
AddRecPhiMatch = &PN;
|
||||
break;
|
||||
}
|
||||
|
||||
@ -1203,7 +1198,7 @@ SCEVExpander::getAddRecExprPHILiterally(const SCEVAddRecExpr *Normalized,
|
||||
canBeCheaplyTransformed(SE, PhiSCEV, Normalized, InvertStep)) {
|
||||
// Record the phi node. But don't stop we might find an exact match
|
||||
// later.
|
||||
AddRecPhiMatch = PN;
|
||||
AddRecPhiMatch = &PN;
|
||||
IncV = TempIncV;
|
||||
TruncTy = SE.getEffectiveSCEVType(Normalized->getType());
|
||||
}
|
||||
@ -1863,12 +1858,8 @@ SCEVExpander::replaceCongruentIVs(Loop *L, const DominatorTree *DT,
|
||||
const TargetTransformInfo *TTI) {
|
||||
// Find integer phis in order of increasing width.
|
||||
SmallVector<PHINode*, 8> Phis;
|
||||
for (auto &I : *L->getHeader()) {
|
||||
if (auto *PN = dyn_cast<PHINode>(&I))
|
||||
Phis.push_back(PN);
|
||||
else
|
||||
break;
|
||||
}
|
||||
for (PHINode &PN : L->getHeader()->phis())
|
||||
Phis.push_back(&PN);
|
||||
|
||||
if (TTI)
|
||||
std::sort(Phis.begin(), Phis.end(), [](Value *LHS, Value *RHS) {
|
||||
|
@ -633,16 +633,10 @@ bool CodeGenPrepare::isMergingEmptyBlockProfitable(BasicBlock *BB,
|
||||
if (DestBBPred == BB)
|
||||
continue;
|
||||
|
||||
bool HasAllSameValue = true;
|
||||
BasicBlock::const_iterator DestBBI = DestBB->begin();
|
||||
while (const PHINode *DestPN = dyn_cast<PHINode>(DestBBI++)) {
|
||||
if (DestPN->getIncomingValueForBlock(BB) !=
|
||||
DestPN->getIncomingValueForBlock(DestBBPred)) {
|
||||
HasAllSameValue = false;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (HasAllSameValue)
|
||||
if (llvm::all_of(DestBB->phis(), [&](const PHINode &DestPN) {
|
||||
return DestPN.getIncomingValueForBlock(BB) ==
|
||||
DestPN.getIncomingValueForBlock(DestBBPred);
|
||||
}))
|
||||
SameIncomingValueBBs.insert(DestBBPred);
|
||||
}
|
||||
|
||||
@ -672,9 +666,8 @@ bool CodeGenPrepare::canMergeBlocks(const BasicBlock *BB,
|
||||
// We only want to eliminate blocks whose phi nodes are used by phi nodes in
|
||||
// the successor. If there are more complex condition (e.g. preheaders),
|
||||
// don't mess around with them.
|
||||
BasicBlock::const_iterator BBI = BB->begin();
|
||||
while (const PHINode *PN = dyn_cast<PHINode>(BBI++)) {
|
||||
for (const User *U : PN->users()) {
|
||||
for (const PHINode &PN : BB->phis()) {
|
||||
for (const User *U : PN.users()) {
|
||||
const Instruction *UI = cast<Instruction>(U);
|
||||
if (UI->getParent() != DestBB || !isa<PHINode>(UI))
|
||||
return false;
|
||||
@ -713,10 +706,9 @@ bool CodeGenPrepare::canMergeBlocks(const BasicBlock *BB,
|
||||
for (unsigned i = 0, e = DestBBPN->getNumIncomingValues(); i != e; ++i) {
|
||||
BasicBlock *Pred = DestBBPN->getIncomingBlock(i);
|
||||
if (BBPreds.count(Pred)) { // Common predecessor?
|
||||
BBI = DestBB->begin();
|
||||
while (const PHINode *PN = dyn_cast<PHINode>(BBI++)) {
|
||||
const Value *V1 = PN->getIncomingValueForBlock(Pred);
|
||||
const Value *V2 = PN->getIncomingValueForBlock(BB);
|
||||
for (const PHINode &PN : DestBB->phis()) {
|
||||
const Value *V1 = PN.getIncomingValueForBlock(Pred);
|
||||
const Value *V2 = PN.getIncomingValueForBlock(BB);
|
||||
|
||||
// If V2 is a phi node in BB, look up what the mapped value will be.
|
||||
if (const PHINode *V2PN = dyn_cast<PHINode>(V2))
|
||||
@ -759,11 +751,9 @@ void CodeGenPrepare::eliminateMostlyEmptyBlock(BasicBlock *BB) {
|
||||
|
||||
// Otherwise, we have multiple predecessors of BB. Update the PHIs in DestBB
|
||||
// to handle the new incoming edges it is about to have.
|
||||
PHINode *PN;
|
||||
for (BasicBlock::iterator BBI = DestBB->begin();
|
||||
(PN = dyn_cast<PHINode>(BBI)); ++BBI) {
|
||||
for (PHINode &PN : DestBB->phis()) {
|
||||
// Remove the incoming value for BB, and remember it.
|
||||
Value *InVal = PN->removeIncomingValue(BB, false);
|
||||
Value *InVal = PN.removeIncomingValue(BB, false);
|
||||
|
||||
// Two options: either the InVal is a phi node defined in BB or it is some
|
||||
// value that dominates BB.
|
||||
@ -771,17 +761,17 @@ void CodeGenPrepare::eliminateMostlyEmptyBlock(BasicBlock *BB) {
|
||||
if (InValPhi && InValPhi->getParent() == BB) {
|
||||
// Add all of the input values of the input PHI as inputs of this phi.
|
||||
for (unsigned i = 0, e = InValPhi->getNumIncomingValues(); i != e; ++i)
|
||||
PN->addIncoming(InValPhi->getIncomingValue(i),
|
||||
PN.addIncoming(InValPhi->getIncomingValue(i),
|
||||
InValPhi->getIncomingBlock(i));
|
||||
} else {
|
||||
// Otherwise, add one instance of the dominating value for each edge that
|
||||
// we will be adding.
|
||||
if (PHINode *BBPN = dyn_cast<PHINode>(BB->begin())) {
|
||||
for (unsigned i = 0, e = BBPN->getNumIncomingValues(); i != e; ++i)
|
||||
PN->addIncoming(InVal, BBPN->getIncomingBlock(i));
|
||||
PN.addIncoming(InVal, BBPN->getIncomingBlock(i));
|
||||
} else {
|
||||
for (pred_iterator PI = pred_begin(BB), E = pred_end(BB); PI != E; ++PI)
|
||||
PN->addIncoming(InVal, *PI);
|
||||
PN.addIncoming(InVal, *PI);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -6497,22 +6487,16 @@ bool CodeGenPrepare::splitBranchCondition(Function &F) {
|
||||
std::swap(TBB, FBB);
|
||||
|
||||
// Replace the old BB with the new BB.
|
||||
for (auto &I : *TBB) {
|
||||
PHINode *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
break;
|
||||
for (PHINode &PN : TBB->phis()) {
|
||||
int i;
|
||||
while ((i = PN->getBasicBlockIndex(&BB)) >= 0)
|
||||
PN->setIncomingBlock(i, TmpBB);
|
||||
while ((i = PN.getBasicBlockIndex(&BB)) >= 0)
|
||||
PN.setIncomingBlock(i, TmpBB);
|
||||
}
|
||||
|
||||
// Add another incoming edge form the new BB.
|
||||
for (auto &I : *FBB) {
|
||||
PHINode *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
break;
|
||||
auto *Val = PN->getIncomingValueForBlock(&BB);
|
||||
PN->addIncoming(Val, TmpBB);
|
||||
for (PHINode &PN : FBB->phis()) {
|
||||
auto *Val = PN.getIncomingValueForBlock(&BB);
|
||||
PN.addIncoming(Val, TmpBB);
|
||||
}
|
||||
|
||||
// Update the branch weights (from SelectionDAGBuilder::
|
||||
|
@ -2051,11 +2051,9 @@ bool FastISel::handlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
// At this point we know that there is a 1-1 correspondence between LLVM PHI
|
||||
// nodes and Machine PHI nodes, but the incoming operands have not been
|
||||
// emitted yet.
|
||||
for (BasicBlock::const_iterator I = SuccBB->begin();
|
||||
const auto *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
|
||||
for (const PHINode &PN : SuccBB->phis()) {
|
||||
// Ignore dead phi's.
|
||||
if (PN->use_empty())
|
||||
if (PN.use_empty())
|
||||
continue;
|
||||
|
||||
// Only handle legal types. Two interesting things to note here. First,
|
||||
@ -2064,7 +2062,7 @@ bool FastISel::handlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
// own moves. Second, this check is necessary because FastISel doesn't
|
||||
// use CreateRegs to create registers, so it always creates
|
||||
// exactly one register for each non-void instruction.
|
||||
EVT VT = TLI.getValueType(DL, PN->getType(), /*AllowUnknown=*/true);
|
||||
EVT VT = TLI.getValueType(DL, PN.getType(), /*AllowUnknown=*/true);
|
||||
if (VT == MVT::Other || !TLI.isTypeLegal(VT)) {
|
||||
// Handle integer promotions, though, because they're common and easy.
|
||||
if (!(VT == MVT::i1 || VT == MVT::i8 || VT == MVT::i16)) {
|
||||
@ -2073,11 +2071,11 @@ bool FastISel::handlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
}
|
||||
}
|
||||
|
||||
const Value *PHIOp = PN->getIncomingValueForBlock(LLVMBB);
|
||||
const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
|
||||
|
||||
// Set the DebugLoc for the copy. Prefer the location of the operand
|
||||
// if there is one; use the location of the PHI otherwise.
|
||||
DbgLoc = PN->getDebugLoc();
|
||||
DbgLoc = PN.getDebugLoc();
|
||||
if (const auto *Inst = dyn_cast<Instruction>(PHIOp))
|
||||
DbgLoc = Inst->getDebugLoc();
|
||||
|
||||
|
@ -257,20 +257,20 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf,
|
||||
|
||||
// Create Machine PHI nodes for LLVM PHI nodes, lowering them as
|
||||
// appropriate.
|
||||
for (BasicBlock::const_iterator I = BB.begin();
|
||||
const PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
if (PN->use_empty()) continue;
|
||||
|
||||
// Skip empty types
|
||||
if (PN->getType()->isEmptyTy())
|
||||
for (const PHINode &PN : BB.phis()) {
|
||||
if (PN.use_empty())
|
||||
continue;
|
||||
|
||||
DebugLoc DL = PN->getDebugLoc();
|
||||
unsigned PHIReg = ValueMap[PN];
|
||||
// Skip empty types
|
||||
if (PN.getType()->isEmptyTy())
|
||||
continue;
|
||||
|
||||
DebugLoc DL = PN.getDebugLoc();
|
||||
unsigned PHIReg = ValueMap[&PN];
|
||||
assert(PHIReg && "PHI node does not have an assigned virtual register!");
|
||||
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
ComputeValueVTs(*TLI, MF->getDataLayout(), PN->getType(), ValueVTs);
|
||||
ComputeValueVTs(*TLI, MF->getDataLayout(), PN.getType(), ValueVTs);
|
||||
for (EVT VT : ValueVTs) {
|
||||
unsigned NumRegisters = TLI->getNumRegisters(Fn->getContext(), VT);
|
||||
const TargetInstrInfo *TII = MF->getSubtarget().getInstrInfo();
|
||||
|
@ -8940,17 +8940,17 @@ SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
// At this point we know that there is a 1-1 correspondence between LLVM PHI
|
||||
// nodes and Machine PHI nodes, but the incoming operands have not been
|
||||
// emitted yet.
|
||||
for (BasicBlock::const_iterator I = SuccBB->begin();
|
||||
const PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
for (const PHINode &PN : SuccBB->phis()) {
|
||||
// Ignore dead phi's.
|
||||
if (PN->use_empty()) continue;
|
||||
if (PN.use_empty())
|
||||
continue;
|
||||
|
||||
// Skip empty types
|
||||
if (PN->getType()->isEmptyTy())
|
||||
if (PN.getType()->isEmptyTy())
|
||||
continue;
|
||||
|
||||
unsigned Reg;
|
||||
const Value *PHIOp = PN->getIncomingValueForBlock(LLVMBB);
|
||||
const Value *PHIOp = PN.getIncomingValueForBlock(LLVMBB);
|
||||
|
||||
if (const Constant *C = dyn_cast<Constant>(PHIOp)) {
|
||||
unsigned &RegOut = ConstantsOut[C];
|
||||
@ -8977,7 +8977,7 @@ SelectionDAGBuilder::HandlePHINodesInSuccessorBlocks(const BasicBlock *LLVMBB) {
|
||||
// the input for this MBB.
|
||||
SmallVector<EVT, 4> ValueVTs;
|
||||
const TargetLowering &TLI = DAG.getTargetLoweringInfo();
|
||||
ComputeValueVTs(TLI, DAG.getDataLayout(), PN->getType(), ValueVTs);
|
||||
ComputeValueVTs(TLI, DAG.getDataLayout(), PN.getType(), ValueVTs);
|
||||
for (unsigned vti = 0, vte = ValueVTs.size(); vti != vte; ++vti) {
|
||||
EVT VT = ValueVTs[vti];
|
||||
unsigned NumRegisters = TLI.getNumRegisters(*DAG.getContext(), VT);
|
||||
|
@ -1445,13 +1445,11 @@ void SelectionDAGISel::SelectAllBasicBlocks(const Function &Fn) {
|
||||
}
|
||||
|
||||
if (AllPredsVisited) {
|
||||
for (BasicBlock::const_iterator I = LLVMBB->begin();
|
||||
const PHINode *PN = dyn_cast<PHINode>(I); ++I)
|
||||
FuncInfo->ComputePHILiveOutRegInfo(PN);
|
||||
for (const PHINode &PN : LLVMBB->phis())
|
||||
FuncInfo->ComputePHILiveOutRegInfo(&PN);
|
||||
} else {
|
||||
for (BasicBlock::const_iterator I = LLVMBB->begin();
|
||||
const PHINode *PN = dyn_cast<PHINode>(I); ++I)
|
||||
FuncInfo->InvalidatePHILiveOutRegInfo(PN);
|
||||
for (const PHINode &PN : LLVMBB->phis())
|
||||
FuncInfo->InvalidatePHILiveOutRegInfo(&PN);
|
||||
}
|
||||
|
||||
FuncInfo->VisitedBBs.insert(LLVMBB);
|
||||
|
@ -838,17 +838,11 @@ void WinEHPrepare::cloneCommonBlocks(Function &F) {
|
||||
for (auto &BBMapping : Orig2Clone) {
|
||||
BasicBlock *OldBlock = BBMapping.first;
|
||||
BasicBlock *NewBlock = BBMapping.second;
|
||||
for (Instruction &OldI : *OldBlock) {
|
||||
auto *OldPN = dyn_cast<PHINode>(&OldI);
|
||||
if (!OldPN)
|
||||
break;
|
||||
UpdatePHIOnClonedBlock(OldPN, /*IsForOldBlock=*/true);
|
||||
for (PHINode &OldPN : OldBlock->phis()) {
|
||||
UpdatePHIOnClonedBlock(&OldPN, /*IsForOldBlock=*/true);
|
||||
}
|
||||
for (Instruction &NewI : *NewBlock) {
|
||||
auto *NewPN = dyn_cast<PHINode>(&NewI);
|
||||
if (!NewPN)
|
||||
break;
|
||||
UpdatePHIOnClonedBlock(NewPN, /*IsForOldBlock=*/false);
|
||||
for (PHINode &NewPN : NewBlock->phis()) {
|
||||
UpdatePHIOnClonedBlock(&NewPN, /*IsForOldBlock=*/false);
|
||||
}
|
||||
}
|
||||
|
||||
@ -858,17 +852,13 @@ void WinEHPrepare::cloneCommonBlocks(Function &F) {
|
||||
BasicBlock *OldBlock = BBMapping.first;
|
||||
BasicBlock *NewBlock = BBMapping.second;
|
||||
for (BasicBlock *SuccBB : successors(NewBlock)) {
|
||||
for (Instruction &SuccI : *SuccBB) {
|
||||
auto *SuccPN = dyn_cast<PHINode>(&SuccI);
|
||||
if (!SuccPN)
|
||||
break;
|
||||
|
||||
for (PHINode &SuccPN : SuccBB->phis()) {
|
||||
// Ok, we have a PHI node. Figure out what the incoming value was for
|
||||
// the OldBlock.
|
||||
int OldBlockIdx = SuccPN->getBasicBlockIndex(OldBlock);
|
||||
int OldBlockIdx = SuccPN.getBasicBlockIndex(OldBlock);
|
||||
if (OldBlockIdx == -1)
|
||||
break;
|
||||
Value *IV = SuccPN->getIncomingValue(OldBlockIdx);
|
||||
Value *IV = SuccPN.getIncomingValue(OldBlockIdx);
|
||||
|
||||
// Remap the value if necessary.
|
||||
if (auto *Inst = dyn_cast<Instruction>(IV)) {
|
||||
@ -877,7 +867,7 @@ void WinEHPrepare::cloneCommonBlocks(Function &F) {
|
||||
IV = I->second;
|
||||
}
|
||||
|
||||
SuccPN->addIncoming(IV, NewBlock);
|
||||
SuccPN.addIncoming(IV, NewBlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -2210,24 +2210,23 @@ void Verifier::visitBasicBlock(BasicBlock &BB) {
|
||||
SmallVector<BasicBlock*, 8> Preds(pred_begin(&BB), pred_end(&BB));
|
||||
SmallVector<std::pair<BasicBlock*, Value*>, 8> Values;
|
||||
std::sort(Preds.begin(), Preds.end());
|
||||
PHINode *PN;
|
||||
for (BasicBlock::iterator I = BB.begin(); (PN = dyn_cast<PHINode>(I));++I) {
|
||||
for (const PHINode &PN : BB.phis()) {
|
||||
// Ensure that PHI nodes have at least one entry!
|
||||
Assert(PN->getNumIncomingValues() != 0,
|
||||
Assert(PN.getNumIncomingValues() != 0,
|
||||
"PHI nodes must have at least one entry. If the block is dead, "
|
||||
"the PHI should be removed!",
|
||||
PN);
|
||||
Assert(PN->getNumIncomingValues() == Preds.size(),
|
||||
&PN);
|
||||
Assert(PN.getNumIncomingValues() == Preds.size(),
|
||||
"PHINode should have one entry for each predecessor of its "
|
||||
"parent basic block!",
|
||||
PN);
|
||||
&PN);
|
||||
|
||||
// Get and sort all incoming values in the PHI node...
|
||||
Values.clear();
|
||||
Values.reserve(PN->getNumIncomingValues());
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i)
|
||||
Values.push_back(std::make_pair(PN->getIncomingBlock(i),
|
||||
PN->getIncomingValue(i)));
|
||||
Values.reserve(PN.getNumIncomingValues());
|
||||
for (unsigned i = 0, e = PN.getNumIncomingValues(); i != e; ++i)
|
||||
Values.push_back(
|
||||
std::make_pair(PN.getIncomingBlock(i), PN.getIncomingValue(i)));
|
||||
std::sort(Values.begin(), Values.end());
|
||||
|
||||
for (unsigned i = 0, e = Values.size(); i != e; ++i) {
|
||||
@ -2239,12 +2238,12 @@ void Verifier::visitBasicBlock(BasicBlock &BB) {
|
||||
Values[i].second == Values[i - 1].second,
|
||||
"PHI node has multiple entries for the same basic block with "
|
||||
"different incoming values!",
|
||||
PN, Values[i].first, Values[i].second, Values[i - 1].second);
|
||||
&PN, Values[i].first, Values[i].second, Values[i - 1].second);
|
||||
|
||||
// Check to make sure that the predecessors and PHI node entries are
|
||||
// matched up.
|
||||
Assert(Values[i].first == Preds[i],
|
||||
"PHI node entries do not match predecessors!", PN,
|
||||
"PHI node entries do not match predecessors!", &PN,
|
||||
Values[i].first, Preds[i]);
|
||||
}
|
||||
}
|
||||
|
@ -1050,14 +1050,11 @@ bool PolynomialMultiplyRecognize::promoteTypes(BasicBlock *LoopB,
|
||||
// Check if the exit values have types that are no wider than the type
|
||||
// that we want to promote to.
|
||||
unsigned DestBW = DestTy->getBitWidth();
|
||||
for (Instruction &In : *ExitB) {
|
||||
PHINode *P = dyn_cast<PHINode>(&In);
|
||||
if (!P)
|
||||
break;
|
||||
if (P->getNumIncomingValues() != 1)
|
||||
for (PHINode &P : ExitB->phis()) {
|
||||
if (P.getNumIncomingValues() != 1)
|
||||
return false;
|
||||
assert(P->getIncomingBlock(0) == LoopB);
|
||||
IntegerType *T = dyn_cast<IntegerType>(P->getType());
|
||||
assert(P.getIncomingBlock(0) == LoopB);
|
||||
IntegerType *T = dyn_cast<IntegerType>(P.getType());
|
||||
if (!T || T->getBitWidth() > DestBW)
|
||||
return false;
|
||||
}
|
||||
|
@ -440,16 +440,14 @@ static void
|
||||
scanPHIsAndUpdateValueMap(Instruction *Prev, BasicBlock *NewBlock,
|
||||
DenseMap<Value *, Value *> &ResolvedValues) {
|
||||
auto *PrevBB = Prev->getParent();
|
||||
auto *I = &*NewBlock->begin();
|
||||
while (auto PN = dyn_cast<PHINode>(I)) {
|
||||
auto V = PN->getIncomingValueForBlock(PrevBB);
|
||||
for (PHINode &PN : NewBlock->phis()) {
|
||||
auto V = PN.getIncomingValueForBlock(PrevBB);
|
||||
// See if we already resolved it.
|
||||
auto VI = ResolvedValues.find(V);
|
||||
if (VI != ResolvedValues.end())
|
||||
V = VI->second;
|
||||
// Remember the value.
|
||||
ResolvedValues[PN] = V;
|
||||
I = I->getNextNode();
|
||||
ResolvedValues[&PN] = V;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -265,15 +265,12 @@ static void splitCallSite(CallSite CS, BasicBlock *PredBB1, BasicBlock *PredBB2,
|
||||
CallSite CS2(CallInst2);
|
||||
|
||||
// Handle PHIs used as arguments in the call-site.
|
||||
for (auto &PI : *TailBB) {
|
||||
PHINode *PN = dyn_cast<PHINode>(&PI);
|
||||
if (!PN)
|
||||
break;
|
||||
for (PHINode &PN : TailBB->phis()) {
|
||||
unsigned ArgNo = 0;
|
||||
for (auto &CI : CS.args()) {
|
||||
if (&*CI == PN) {
|
||||
CS1.setArgument(ArgNo, PN->getIncomingValueForBlock(SplitBlock1));
|
||||
CS2.setArgument(ArgNo, PN->getIncomingValueForBlock(SplitBlock2));
|
||||
if (&*CI == &PN) {
|
||||
CS1.setArgument(ArgNo, PN.getIncomingValueForBlock(SplitBlock1));
|
||||
CS2.setArgument(ArgNo, PN.getIncomingValueForBlock(SplitBlock2));
|
||||
}
|
||||
++ArgNo;
|
||||
}
|
||||
|
@ -592,12 +592,8 @@ private:
|
||||
/// Create a ModelledPHI for each PHI in BB, adding to PHIs.
|
||||
void analyzeInitialPHIs(BasicBlock *BB, ModelledPHISet &PHIs,
|
||||
SmallPtrSetImpl<Value *> &PHIContents) {
|
||||
for (auto &I : *BB) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
return;
|
||||
|
||||
auto MPHI = ModelledPHI(PN);
|
||||
for (PHINode &PN : BB->phis()) {
|
||||
auto MPHI = ModelledPHI(&PN);
|
||||
PHIs.insert(MPHI);
|
||||
for (auto *V : MPHI.getValues())
|
||||
PHIContents.insert(V);
|
||||
|
@ -485,9 +485,8 @@ void IndVarSimplify::rewriteNonIntegerIVs(Loop *L) {
|
||||
BasicBlock *Header = L->getHeader();
|
||||
|
||||
SmallVector<WeakTrackingVH, 8> PHIs;
|
||||
for (BasicBlock::iterator I = Header->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I)
|
||||
PHIs.push_back(PN);
|
||||
for (PHINode &PN : Header->phis())
|
||||
PHIs.push_back(&PN);
|
||||
|
||||
for (unsigned i = 0, e = PHIs.size(); i != e; ++i)
|
||||
if (PHINode *PN = dyn_cast_or_null<PHINode>(&*PHIs[i]))
|
||||
@ -724,13 +723,12 @@ void IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
|
||||
assert(LoopHeader && "Invalid loop");
|
||||
|
||||
for (auto *ExitBB : ExitBlocks) {
|
||||
BasicBlock::iterator BBI = ExitBB->begin();
|
||||
// If there are no more PHI nodes in this exit block, then no more
|
||||
// values defined inside the loop are used on this path.
|
||||
while (auto *PN = dyn_cast<PHINode>(BBI++)) {
|
||||
for (unsigned IncomingValIdx = 0, E = PN->getNumIncomingValues();
|
||||
for (PHINode &PN : ExitBB->phis()) {
|
||||
for (unsigned IncomingValIdx = 0, E = PN.getNumIncomingValues();
|
||||
IncomingValIdx != E; ++IncomingValIdx) {
|
||||
auto *IncomingBB = PN->getIncomingBlock(IncomingValIdx);
|
||||
auto *IncomingBB = PN.getIncomingBlock(IncomingValIdx);
|
||||
|
||||
// We currently only support loop exits from loop header. If the
|
||||
// incoming block is not loop header, we need to recursively check
|
||||
@ -755,8 +753,7 @@ void IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
|
||||
if (!L->isLoopInvariant(Cond))
|
||||
continue;
|
||||
|
||||
auto *ExitVal =
|
||||
dyn_cast<PHINode>(PN->getIncomingValue(IncomingValIdx));
|
||||
auto *ExitVal = dyn_cast<PHINode>(PN.getIncomingValue(IncomingValIdx));
|
||||
|
||||
// Only deal with PHIs.
|
||||
if (!ExitVal)
|
||||
@ -771,7 +768,7 @@ void IndVarSimplify::rewriteFirstIterationLoopExitValues(Loop *L) {
|
||||
if (PreheaderIdx != -1) {
|
||||
assert(ExitVal->getParent() == LoopHeader &&
|
||||
"ExitVal must be in loop header");
|
||||
PN->setIncomingValue(IncomingValIdx,
|
||||
PN.setIncomingValue(IncomingValIdx,
|
||||
ExitVal->getIncomingValue(PreheaderIdx));
|
||||
}
|
||||
}
|
||||
|
@ -1174,13 +1174,9 @@ void LoopConstrainer::cloneLoop(LoopConstrainer::ClonedLoop &Result,
|
||||
if (OriginalLoop.contains(SBB))
|
||||
continue; // not an exit block
|
||||
|
||||
for (Instruction &I : *SBB) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
break;
|
||||
|
||||
Value *OldIncoming = PN->getIncomingValueForBlock(OriginalBB);
|
||||
PN->addIncoming(GetClonedValue(OldIncoming), ClonedBB);
|
||||
for (PHINode &PN : SBB->phis()) {
|
||||
Value *OldIncoming = PN.getIncomingValueForBlock(OriginalBB);
|
||||
PN.addIncoming(GetClonedValue(OldIncoming), ClonedBB);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -1327,16 +1323,12 @@ LoopConstrainer::RewrittenRangeInfo LoopConstrainer::changeIterationSpaceEnd(
|
||||
// We emit PHI nodes into `RRI.PseudoExit' that compute the "latest" value of
|
||||
// each of the PHI nodes in the loop header. This feeds into the initial
|
||||
// value of the same PHI nodes if/when we continue execution.
|
||||
for (Instruction &I : *LS.Header) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
break;
|
||||
|
||||
PHINode *NewPHI = PHINode::Create(PN->getType(), 2, PN->getName() + ".copy",
|
||||
for (PHINode &PN : LS.Header->phis()) {
|
||||
PHINode *NewPHI = PHINode::Create(PN.getType(), 2, PN.getName() + ".copy",
|
||||
BranchToContinuation);
|
||||
|
||||
NewPHI->addIncoming(PN->getIncomingValueForBlock(Preheader), Preheader);
|
||||
NewPHI->addIncoming(PN->getIncomingValueForBlock(LS.Latch),
|
||||
NewPHI->addIncoming(PN.getIncomingValueForBlock(Preheader), Preheader);
|
||||
NewPHI->addIncoming(PN.getIncomingValueForBlock(LS.Latch),
|
||||
RRI.ExitSelector);
|
||||
RRI.PHIValuesAtPseudoExit.push_back(NewPHI);
|
||||
}
|
||||
@ -1348,12 +1340,8 @@ LoopConstrainer::RewrittenRangeInfo LoopConstrainer::changeIterationSpaceEnd(
|
||||
|
||||
// The latch exit now has a branch from `RRI.ExitSelector' instead of
|
||||
// `LS.Latch'. The PHI nodes need to be updated to reflect that.
|
||||
for (Instruction &I : *LS.LatchExit) {
|
||||
if (PHINode *PN = dyn_cast<PHINode>(&I))
|
||||
replacePHIBlock(PN, LS.Latch, RRI.ExitSelector);
|
||||
else
|
||||
break;
|
||||
}
|
||||
for (PHINode &PN : LS.LatchExit->phis())
|
||||
replacePHIBlock(&PN, LS.Latch, RRI.ExitSelector);
|
||||
|
||||
return RRI;
|
||||
}
|
||||
@ -1362,15 +1350,10 @@ void LoopConstrainer::rewriteIncomingValuesForPHIs(
|
||||
LoopStructure &LS, BasicBlock *ContinuationBlock,
|
||||
const LoopConstrainer::RewrittenRangeInfo &RRI) const {
|
||||
unsigned PHIIndex = 0;
|
||||
for (Instruction &I : *LS.Header) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
break;
|
||||
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i < e; ++i)
|
||||
if (PN->getIncomingBlock(i) == ContinuationBlock)
|
||||
PN->setIncomingValue(i, RRI.PHIValuesAtPseudoExit[PHIIndex++]);
|
||||
}
|
||||
for (PHINode &PN : LS.Header->phis())
|
||||
for (unsigned i = 0, e = PN.getNumIncomingValues(); i < e; ++i)
|
||||
if (PN.getIncomingBlock(i) == ContinuationBlock)
|
||||
PN.setIncomingValue(i, RRI.PHIValuesAtPseudoExit[PHIIndex++]);
|
||||
|
||||
LS.IndVarStart = RRI.IndVarEnd;
|
||||
}
|
||||
@ -1381,14 +1364,9 @@ BasicBlock *LoopConstrainer::createPreheader(const LoopStructure &LS,
|
||||
BasicBlock *Preheader = BasicBlock::Create(Ctx, Tag, &F, LS.Header);
|
||||
BranchInst::Create(LS.Header, Preheader);
|
||||
|
||||
for (Instruction &I : *LS.Header) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
break;
|
||||
|
||||
for (unsigned i = 0, e = PN->getNumIncomingValues(); i < e; ++i)
|
||||
replacePHIBlock(PN, OldPreheader, Preheader);
|
||||
}
|
||||
for (PHINode &PN : LS.Header->phis())
|
||||
for (unsigned i = 0, e = PN.getNumIncomingValues(); i < e; ++i)
|
||||
replacePHIBlock(&PN, OldPreheader, Preheader);
|
||||
|
||||
return Preheader;
|
||||
}
|
||||
|
@ -1800,11 +1800,10 @@ static void AddPHINodeEntriesForMappedBlock(BasicBlock *PHIBB,
|
||||
BasicBlock *OldPred,
|
||||
BasicBlock *NewPred,
|
||||
DenseMap<Instruction*, Value*> &ValueMap) {
|
||||
for (BasicBlock::iterator PNI = PHIBB->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(PNI); ++PNI) {
|
||||
for (PHINode &PN : PHIBB->phis()) {
|
||||
// Ok, we have a PHI node. Figure out what the incoming value was for the
|
||||
// DestBlock.
|
||||
Value *IV = PN->getIncomingValueForBlock(OldPred);
|
||||
Value *IV = PN.getIncomingValueForBlock(OldPred);
|
||||
|
||||
// Remap the value if necessary.
|
||||
if (Instruction *Inst = dyn_cast<Instruction>(IV)) {
|
||||
@ -1813,7 +1812,7 @@ static void AddPHINodeEntriesForMappedBlock(BasicBlock *PHIBB,
|
||||
IV = I->second;
|
||||
}
|
||||
|
||||
PN->addIncoming(IV, NewPred);
|
||||
PN.addIncoming(IV, NewPred);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -49,11 +49,10 @@ static bool isLoopDead(Loop *L, ScalarEvolution &SE,
|
||||
// must pass through a PHI in the exit block, meaning that this check is
|
||||
// sufficient to guarantee that no loop-variant values are used outside
|
||||
// of the loop.
|
||||
BasicBlock::iterator BI = ExitBlock->begin();
|
||||
bool AllEntriesInvariant = true;
|
||||
bool AllOutgoingValuesSame = true;
|
||||
while (PHINode *P = dyn_cast<PHINode>(BI)) {
|
||||
Value *incoming = P->getIncomingValueForBlock(ExitingBlocks[0]);
|
||||
for (PHINode &P : ExitBlock->phis()) {
|
||||
Value *incoming = P.getIncomingValueForBlock(ExitingBlocks[0]);
|
||||
|
||||
// Make sure all exiting blocks produce the same incoming value for the exit
|
||||
// block. If there are different incoming values for different exiting
|
||||
@ -61,7 +60,7 @@ static bool isLoopDead(Loop *L, ScalarEvolution &SE,
|
||||
// be used.
|
||||
AllOutgoingValuesSame =
|
||||
all_of(makeArrayRef(ExitingBlocks).slice(1), [&](BasicBlock *BB) {
|
||||
return incoming == P->getIncomingValueForBlock(BB);
|
||||
return incoming == P.getIncomingValueForBlock(BB);
|
||||
});
|
||||
|
||||
if (!AllOutgoingValuesSame)
|
||||
@ -72,8 +71,6 @@ static bool isLoopDead(Loop *L, ScalarEvolution &SE,
|
||||
AllEntriesInvariant = false;
|
||||
break;
|
||||
}
|
||||
|
||||
++BI;
|
||||
}
|
||||
|
||||
if (Changed)
|
||||
@ -162,11 +159,9 @@ static LoopDeletionResult deleteLoopIfDead(Loop *L, DominatorTree &DT,
|
||||
if (ExitBlock && isLoopNeverExecuted(L)) {
|
||||
DEBUG(dbgs() << "Loop is proven to never execute, delete it!");
|
||||
// Set incoming value to undef for phi nodes in the exit block.
|
||||
BasicBlock::iterator BI = ExitBlock->begin();
|
||||
while (PHINode *P = dyn_cast<PHINode>(BI)) {
|
||||
for (unsigned i = 0; i < P->getNumIncomingValues(); i++)
|
||||
P->setIncomingValue(i, UndefValue::get(P->getType()));
|
||||
BI++;
|
||||
for (PHINode &P : ExitBlock->phis()) {
|
||||
std::fill(P.incoming_values().begin(), P.incoming_values().end(),
|
||||
UndefValue::get(P.getType()));
|
||||
}
|
||||
deleteDeadLoop(L, &DT, &SE, &LI);
|
||||
++NumDeleted;
|
||||
|
@ -857,12 +857,11 @@ static MemAccessTy getAccessType(const TargetTransformInfo &TTI,
|
||||
|
||||
/// Return true if this AddRec is already a phi in its loop.
|
||||
static bool isExistingPhi(const SCEVAddRecExpr *AR, ScalarEvolution &SE) {
|
||||
for (BasicBlock::iterator I = AR->getLoop()->getHeader()->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
if (SE.isSCEVable(PN->getType()) &&
|
||||
(SE.getEffectiveSCEVType(PN->getType()) ==
|
||||
for (PHINode &PN : AR->getLoop()->getHeader()->phis()) {
|
||||
if (SE.isSCEVable(PN.getType()) &&
|
||||
(SE.getEffectiveSCEVType(PN.getType()) ==
|
||||
SE.getEffectiveSCEVType(AR->getType())) &&
|
||||
SE.getSCEV(PN) == AR)
|
||||
SE.getSCEV(&PN) == AR)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -3013,15 +3012,14 @@ void LSRInstance::CollectChains() {
|
||||
} // Continue walking down the instructions.
|
||||
} // Continue walking down the domtree.
|
||||
// Visit phi backedges to determine if the chain can generate the IV postinc.
|
||||
for (BasicBlock::iterator I = L->getHeader()->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
if (!SE.isSCEVable(PN->getType()))
|
||||
for (PHINode &PN : L->getHeader()->phis()) {
|
||||
if (!SE.isSCEVable(PN.getType()))
|
||||
continue;
|
||||
|
||||
Instruction *IncV =
|
||||
dyn_cast<Instruction>(PN->getIncomingValueForBlock(L->getLoopLatch()));
|
||||
dyn_cast<Instruction>(PN.getIncomingValueForBlock(L->getLoopLatch()));
|
||||
if (IncV)
|
||||
ChainInstruction(PN, IncV, ChainUsersVec);
|
||||
ChainInstruction(&PN, IncV, ChainUsersVec);
|
||||
}
|
||||
// Remove any unprofitable chains.
|
||||
unsigned ChainIdx = 0;
|
||||
@ -3152,12 +3150,11 @@ void LSRInstance::GenerateIVChain(const IVChain &Chain, SCEVExpander &Rewriter,
|
||||
// If LSR created a new, wider phi, we may also replace its postinc. We only
|
||||
// do this if we also found a wide value for the head of the chain.
|
||||
if (isa<PHINode>(Chain.tailUserInst())) {
|
||||
for (BasicBlock::iterator I = L->getHeader()->begin();
|
||||
PHINode *Phi = dyn_cast<PHINode>(I); ++I) {
|
||||
if (!isCompatibleIVType(Phi, IVSrc))
|
||||
for (PHINode &Phi : L->getHeader()->phis()) {
|
||||
if (!isCompatibleIVType(&Phi, IVSrc))
|
||||
continue;
|
||||
Instruction *PostIncV = dyn_cast<Instruction>(
|
||||
Phi->getIncomingValueForBlock(L->getLoopLatch()));
|
||||
Phi.getIncomingValueForBlock(L->getLoopLatch()));
|
||||
if (!PostIncV || (SE.getSCEV(PostIncV) != SE.getSCEV(IVSrc)))
|
||||
continue;
|
||||
Value *IVOper = IVSrc;
|
||||
@ -3168,7 +3165,7 @@ void LSRInstance::GenerateIVChain(const IVChain &Chain, SCEVExpander &Rewriter,
|
||||
Builder.SetCurrentDebugLocation(PostIncV->getDebugLoc());
|
||||
IVOper = Builder.CreatePointerCast(IVSrc, PostIncTy, "lsr.chain");
|
||||
}
|
||||
Phi->replaceUsesOfWith(PostIncV, IVOper);
|
||||
Phi.replaceUsesOfWith(PostIncV, IVOper);
|
||||
DeadInsts.emplace_back(PostIncV);
|
||||
}
|
||||
}
|
||||
|
@ -1274,12 +1274,11 @@ void LoopUnswitch::UnswitchNontrivialCondition(Value *LIC, Constant *Val,
|
||||
|
||||
// If the successor of the exit block had PHI nodes, add an entry for
|
||||
// NewExit.
|
||||
for (BasicBlock::iterator I = ExitSucc->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
Value *V = PN->getIncomingValueForBlock(ExitBlocks[i]);
|
||||
for (PHINode &PN : ExitSucc->phis()) {
|
||||
Value *V = PN.getIncomingValueForBlock(ExitBlocks[i]);
|
||||
ValueToValueMapTy::iterator It = VMap.find(V);
|
||||
if (It != VMap.end()) V = It->second;
|
||||
PN->addIncoming(V, NewExit);
|
||||
PN.addIncoming(V, NewExit);
|
||||
}
|
||||
|
||||
if (LandingPadInst *LPad = NewExit->getLandingPadInst()) {
|
||||
@ -1496,10 +1495,9 @@ void LoopUnswitch::RewriteLoopBodyWithConditionConstant(Loop *L, Value *LIC,
|
||||
BranchInst::Create(Abort, OldSISucc,
|
||||
ConstantInt::getTrue(Context), NewSISucc);
|
||||
// Release the PHI operands for this edge.
|
||||
for (BasicBlock::iterator II = NewSISucc->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(II); ++II)
|
||||
PN->setIncomingValue(PN->getBasicBlockIndex(Switch),
|
||||
UndefValue::get(PN->getType()));
|
||||
for (PHINode &PN : NewSISucc->phis())
|
||||
PN.setIncomingValue(PN.getBasicBlockIndex(Switch),
|
||||
UndefValue::get(PN.getType()));
|
||||
// Tell the domtree about the new block. We don't fully update the
|
||||
// domtree here -- instead we force it to do a full recomputation
|
||||
// after the pass is complete -- but we do need to inform it of
|
||||
|
@ -523,10 +523,8 @@ private:
|
||||
DEBUG(dbgs() << "Marking Edge Executable: " << Source->getName()
|
||||
<< " -> " << Dest->getName() << '\n');
|
||||
|
||||
PHINode *PN;
|
||||
for (BasicBlock::iterator I = Dest->begin();
|
||||
(PN = dyn_cast<PHINode>(I)); ++I)
|
||||
visitPHINode(*PN);
|
||||
for (PHINode &PN : Dest->phis())
|
||||
visitPHINode(PN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -271,19 +271,14 @@ static bool areLoopExitPHIsLoopInvariant(Loop &L, BasicBlock &ExitingBB,
|
||||
static void rewritePHINodesForUnswitchedExitBlock(BasicBlock &UnswitchedBB,
|
||||
BasicBlock &OldExitingBB,
|
||||
BasicBlock &OldPH) {
|
||||
for (Instruction &I : UnswitchedBB) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
// No more PHIs to check.
|
||||
break;
|
||||
|
||||
for (PHINode &PN : UnswitchedBB.phis()) {
|
||||
// When the loop exit is directly unswitched we just need to update the
|
||||
// incoming basic block. We loop to handle weird cases with repeated
|
||||
// incoming blocks, but expect to typically only have one operand here.
|
||||
for (auto i : seq<int>(0, PN->getNumOperands())) {
|
||||
assert(PN->getIncomingBlock(i) == &OldExitingBB &&
|
||||
for (auto i : seq<int>(0, PN.getNumOperands())) {
|
||||
assert(PN.getIncomingBlock(i) == &OldExitingBB &&
|
||||
"Found incoming block different from unique predecessor!");
|
||||
PN->setIncomingBlock(i, &OldPH);
|
||||
PN.setIncomingBlock(i, &OldPH);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -302,14 +297,9 @@ static void rewritePHINodesForExitAndUnswitchedBlocks(BasicBlock &ExitBB,
|
||||
assert(&ExitBB != &UnswitchedBB &&
|
||||
"Must have different loop exit and unswitched blocks!");
|
||||
Instruction *InsertPt = &*UnswitchedBB.begin();
|
||||
for (Instruction &I : ExitBB) {
|
||||
auto *PN = dyn_cast<PHINode>(&I);
|
||||
if (!PN)
|
||||
// No more PHIs to check.
|
||||
break;
|
||||
|
||||
auto *NewPN = PHINode::Create(PN->getType(), /*NumReservedValues*/ 2,
|
||||
PN->getName() + ".split", InsertPt);
|
||||
for (PHINode &PN : ExitBB.phis()) {
|
||||
auto *NewPN = PHINode::Create(PN.getType(), /*NumReservedValues*/ 2,
|
||||
PN.getName() + ".split", InsertPt);
|
||||
|
||||
// Walk backwards over the old PHI node's inputs to minimize the cost of
|
||||
// removing each one. We have to do this weird loop manually so that we
|
||||
@ -320,18 +310,18 @@ static void rewritePHINodesForExitAndUnswitchedBlocks(BasicBlock &ExitBB,
|
||||
// allowed us to create a single entry for a predecessor block without
|
||||
// having separate entries for each "edge" even though these edges are
|
||||
// required to produce identical results.
|
||||
for (int i = PN->getNumIncomingValues() - 1; i >= 0; --i) {
|
||||
if (PN->getIncomingBlock(i) != &OldExitingBB)
|
||||
for (int i = PN.getNumIncomingValues() - 1; i >= 0; --i) {
|
||||
if (PN.getIncomingBlock(i) != &OldExitingBB)
|
||||
continue;
|
||||
|
||||
Value *Incoming = PN->removeIncomingValue(i);
|
||||
Value *Incoming = PN.removeIncomingValue(i);
|
||||
NewPN->addIncoming(Incoming, &OldPH);
|
||||
}
|
||||
|
||||
// Now replace the old PHI with the new one and wire the old one in as an
|
||||
// input to the new one.
|
||||
PN->replaceAllUsesWith(NewPN);
|
||||
NewPN->addIncoming(PN, &ExitBB);
|
||||
PN.replaceAllUsesWith(NewPN);
|
||||
NewPN->addIncoming(&PN, &ExitBB);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -94,9 +94,8 @@ bool llvm::DeleteDeadPHIs(BasicBlock *BB, const TargetLibraryInfo *TLI) {
|
||||
// Recursively deleting a PHI may cause multiple PHIs to be deleted
|
||||
// or RAUW'd undef, so use an array of WeakTrackingVH for the PHIs to delete.
|
||||
SmallVector<WeakTrackingVH, 8> PHIs;
|
||||
for (BasicBlock::iterator I = BB->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I)
|
||||
PHIs.push_back(PN);
|
||||
for (PHINode &PN : BB->phis())
|
||||
PHIs.push_back(&PN);
|
||||
|
||||
bool Changed = false;
|
||||
for (unsigned i = 0, e = PHIs.size(); i != e; ++i)
|
||||
@ -134,24 +133,17 @@ bool llvm::MergeBlockIntoPredecessor(BasicBlock *BB, DominatorTree *DT,
|
||||
if (!OnlySucc) return false;
|
||||
|
||||
// Can't merge if there is PHI loop.
|
||||
for (BasicBlock::iterator BI = BB->begin(), BE = BB->end(); BI != BE; ++BI) {
|
||||
if (PHINode *PN = dyn_cast<PHINode>(BI)) {
|
||||
for (Value *IncValue : PN->incoming_values())
|
||||
if (IncValue == PN)
|
||||
for (PHINode &PN : BB->phis())
|
||||
for (Value *IncValue : PN.incoming_values())
|
||||
if (IncValue == &PN)
|
||||
return false;
|
||||
} else
|
||||
break;
|
||||
}
|
||||
|
||||
// Begin by getting rid of unneeded PHIs.
|
||||
SmallVector<Value *, 4> IncomingValues;
|
||||
if (isa<PHINode>(BB->front())) {
|
||||
for (auto &I : *BB)
|
||||
if (PHINode *PN = dyn_cast<PHINode>(&I)) {
|
||||
if (PN->getIncomingValue(0) != PN)
|
||||
IncomingValues.push_back(PN->getIncomingValue(0));
|
||||
} else
|
||||
break;
|
||||
for (PHINode &PN : BB->phis())
|
||||
if (PN.getIncomingValue(0) != &PN)
|
||||
IncomingValues.push_back(PN.getIncomingValue(0));
|
||||
FoldSingleEntryPHINodes(BB, MemDep);
|
||||
}
|
||||
|
||||
|
@ -106,10 +106,9 @@ static void createPHIsForSplitLoopExit(ArrayRef<BasicBlock *> Preds,
|
||||
SplitBB->isLandingPad()) && "SplitBB has non-PHI nodes!");
|
||||
|
||||
// For each PHI in the destination block.
|
||||
for (BasicBlock::iterator I = DestBB->begin();
|
||||
PHINode *PN = dyn_cast<PHINode>(I); ++I) {
|
||||
unsigned Idx = PN->getBasicBlockIndex(SplitBB);
|
||||
Value *V = PN->getIncomingValue(Idx);
|
||||
for (PHINode &PN : DestBB->phis()) {
|
||||
unsigned Idx = PN.getBasicBlockIndex(SplitBB);
|
||||
Value *V = PN.getIncomingValue(Idx);
|
||||
|
||||
// If the input is a PHI which already satisfies LCSSA, don't create
|
||||
// a new one.
|
||||
@ -119,13 +118,13 @@ static void createPHIsForSplitLoopExit(ArrayRef<BasicBlock *> Preds,
|
||||
|
||||
// Otherwise a new PHI is needed. Create one and populate it.
|
||||
PHINode *NewPN = PHINode::Create(
|
||||
PN->getType(), Preds.size(), "split",
|
||||
PN.getType(), Preds.size(), "split",
|
||||
SplitBB->isLandingPad() ? &SplitBB->front() : SplitBB->getTerminator());
|
||||
for (unsigned i = 0, e = Preds.size(); i != e; ++i)
|
||||
NewPN->addIncoming(V, Preds[i]);
|
||||
|
||||
// Update the original PHI.
|
||||
PN->setIncomingValue(Idx, NewPN);
|
||||
PN.setIncomingValue(Idx, NewPN);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -47,14 +47,11 @@ using namespace llvm;
|
||||
///
|
||||
static void fixupPHINodeForNormalDest(InvokeInst *Invoke, BasicBlock *OrigBlock,
|
||||
BasicBlock *MergeBlock) {
|
||||
for (auto &I : *Invoke->getNormalDest()) {
|
||||
auto *Phi = dyn_cast<PHINode>(&I);
|
||||
if (!Phi)
|
||||
break;
|
||||
int Idx = Phi->getBasicBlockIndex(OrigBlock);
|
||||
for (PHINode &Phi : Invoke->getNormalDest()->phis()) {
|
||||
int Idx = Phi.getBasicBlockIndex(OrigBlock);
|
||||
if (Idx == -1)
|
||||
continue;
|
||||
Phi->setIncomingBlock(Idx, MergeBlock);
|
||||
Phi.setIncomingBlock(Idx, MergeBlock);
|
||||
}
|
||||
}
|
||||
|
||||
@ -82,16 +79,13 @@ static void fixupPHINodeForNormalDest(InvokeInst *Invoke, BasicBlock *OrigBlock,
|
||||
static void fixupPHINodeForUnwindDest(InvokeInst *Invoke, BasicBlock *OrigBlock,
|
||||
BasicBlock *ThenBlock,
|
||||
BasicBlock *ElseBlock) {
|
||||
for (auto &I : *Invoke->getUnwindDest()) {
|
||||
auto *Phi = dyn_cast<PHINode>(&I);
|
||||
if (!Phi)
|
||||
break;
|
||||
int Idx = Phi->getBasicBlockIndex(OrigBlock);
|
||||
for (PHINode &Phi : Invoke->getUnwindDest()->phis()) {
|
||||
int Idx = Phi.getBasicBlockIndex(OrigBlock);
|
||||
if (Idx == -1)
|
||||
continue;
|
||||
auto *V = Phi->getIncomingValue(Idx);
|
||||
Phi->setIncomingBlock(Idx, ThenBlock);
|
||||
Phi->addIncoming(V, ElseBlock);
|
||||
auto *V = Phi.getIncomingValue(Idx);
|
||||
Phi.setIncomingBlock(Idx, ThenBlock);
|
||||
Phi.addIncoming(V, ElseBlock);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -493,17 +493,13 @@ void llvm::CloneAndPruneIntoFromInst(Function *NewFunc, const Function *OldFunc,
|
||||
|
||||
// Handle PHI nodes specially, as we have to remove references to dead
|
||||
// blocks.
|
||||
for (BasicBlock::const_iterator I = BI.begin(), E = BI.end(); I != E; ++I) {
|
||||
for (const PHINode &PN : BI.phis()) {
|
||||
// PHI nodes may have been remapped to non-PHI nodes by the caller or
|
||||
// during the cloning process.
|
||||
if (const PHINode *PN = dyn_cast<PHINode>(I)) {
|
||||
if (isa<PHINode>(VMap[PN]))
|
||||
PHIToResolve.push_back(PN);
|
||||
if (isa<PHINode>(VMap[&PN]))
|
||||
PHIToResolve.push_back(&PN);
|
||||
else
|
||||
break;
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Finally, remap the terminator instructions, as those can't be remapped
|
||||
|
@ -258,11 +258,8 @@ static bool isEpilogProfitable(Loop *L) {
|
||||
BasicBlock *PreHeader = L->getLoopPreheader();
|
||||
BasicBlock *Header = L->getHeader();
|
||||
assert(PreHeader && Header);
|
||||
for (Instruction &BBI : *Header) {
|
||||
PHINode *PN = dyn_cast<PHINode>(&BBI);
|
||||
if (!PN)
|
||||
break;
|
||||
if (isa<ConstantInt>(PN->getIncomingValueForBlock(PreHeader)))
|
||||
for (const PHINode &PN : Header->phis()) {
|
||||
if (isa<ConstantInt>(PN.getIncomingValueForBlock(PreHeader)))
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
@ -611,13 +608,12 @@ LoopUnrollResult llvm::UnrollLoop(
|
||||
for (BasicBlock *Succ : successors(*BB)) {
|
||||
if (L->contains(Succ))
|
||||
continue;
|
||||
for (BasicBlock::iterator BBI = Succ->begin();
|
||||
PHINode *phi = dyn_cast<PHINode>(BBI); ++BBI) {
|
||||
Value *Incoming = phi->getIncomingValueForBlock(*BB);
|
||||
for (PHINode &PHI : Succ->phis()) {
|
||||
Value *Incoming = PHI.getIncomingValueForBlock(*BB);
|
||||
ValueToValueMapTy::iterator It = LastValueMap.find(Incoming);
|
||||
if (It != LastValueMap.end())
|
||||
Incoming = It->second;
|
||||
phi->addIncoming(Incoming, New);
|
||||
PHI.addIncoming(Incoming, New);
|
||||
}
|
||||
}
|
||||
// Keep track of new headers and latches as we create them, so that
|
||||
@ -721,10 +717,8 @@ LoopUnrollResult llvm::UnrollLoop(
|
||||
for (BasicBlock *Succ: successors(BB)) {
|
||||
if (Succ == Headers[i])
|
||||
continue;
|
||||
for (BasicBlock::iterator BBI = Succ->begin();
|
||||
PHINode *Phi = dyn_cast<PHINode>(BBI); ++BBI) {
|
||||
Phi->removeIncomingValue(BB, false);
|
||||
}
|
||||
for (PHINode &Phi : Succ->phis())
|
||||
Phi.removeIncomingValue(BB, false);
|
||||
}
|
||||
}
|
||||
// Replace the conditional branch with an unconditional one.
|
||||
|
@ -80,25 +80,21 @@ static void ConnectProlog(Loop *L, Value *BECount, unsigned Count,
|
||||
// The new PHI node value is added as an operand of a PHI node in either
|
||||
// the loop header or the loop exit block.
|
||||
for (BasicBlock *Succ : successors(Latch)) {
|
||||
for (Instruction &BBI : *Succ) {
|
||||
PHINode *PN = dyn_cast<PHINode>(&BBI);
|
||||
// Exit when we passed all PHI nodes.
|
||||
if (!PN)
|
||||
break;
|
||||
for (PHINode &PN : Succ->phis()) {
|
||||
// Add a new PHI node to the prolog end block and add the
|
||||
// appropriate incoming values.
|
||||
PHINode *NewPN = PHINode::Create(PN->getType(), 2, PN->getName() + ".unr",
|
||||
PHINode *NewPN = PHINode::Create(PN.getType(), 2, PN.getName() + ".unr",
|
||||
PrologExit->getFirstNonPHI());
|
||||
// Adding a value to the new PHI node from the original loop preheader.
|
||||
// This is the value that skips all the prolog code.
|
||||
if (L->contains(PN)) {
|
||||
NewPN->addIncoming(PN->getIncomingValueForBlock(NewPreHeader),
|
||||
if (L->contains(&PN)) {
|
||||
NewPN->addIncoming(PN.getIncomingValueForBlock(NewPreHeader),
|
||||
PreHeader);
|
||||
} else {
|
||||
NewPN->addIncoming(UndefValue::get(PN->getType()), PreHeader);
|
||||
NewPN->addIncoming(UndefValue::get(PN.getType()), PreHeader);
|
||||
}
|
||||
|
||||
Value *V = PN->getIncomingValueForBlock(Latch);
|
||||
Value *V = PN.getIncomingValueForBlock(Latch);
|
||||
if (Instruction *I = dyn_cast<Instruction>(V)) {
|
||||
if (L->contains(I)) {
|
||||
V = VMap.lookup(I);
|
||||
@ -111,10 +107,10 @@ static void ConnectProlog(Loop *L, Value *BECount, unsigned Count,
|
||||
// Update the existing PHI node operand with the value from the
|
||||
// new PHI node. How this is done depends on if the existing
|
||||
// PHI node is in the original loop block, or the exit block.
|
||||
if (L->contains(PN)) {
|
||||
PN->setIncomingValue(PN->getBasicBlockIndex(NewPreHeader), NewPN);
|
||||
if (L->contains(&PN)) {
|
||||
PN.setIncomingValue(PN.getBasicBlockIndex(NewPreHeader), NewPN);
|
||||
} else {
|
||||
PN->addIncoming(NewPN, PrologExit);
|
||||
PN.addIncoming(NewPN, PrologExit);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -191,11 +187,7 @@ static void ConnectEpilog(Loop *L, Value *ModVal, BasicBlock *NewExit,
|
||||
// Exit (EpilogPN)
|
||||
|
||||
// Update PHI nodes at NewExit and Exit.
|
||||
for (Instruction &BBI : *NewExit) {
|
||||
PHINode *PN = dyn_cast<PHINode>(&BBI);
|
||||
// Exit when we passed all PHI nodes.
|
||||
if (!PN)
|
||||
break;
|
||||
for (PHINode &PN : NewExit->phis()) {
|
||||
// PN should be used in another PHI located in Exit block as
|
||||
// Exit was split by SplitBlockPredecessors into Exit and NewExit
|
||||
// Basicaly it should look like:
|
||||
@ -207,14 +199,14 @@ static void ConnectEpilog(Loop *L, Value *ModVal, BasicBlock *NewExit,
|
||||
//
|
||||
// There is EpilogPreHeader incoming block instead of NewExit as
|
||||
// NewExit was spilt 1 more time to get EpilogPreHeader.
|
||||
assert(PN->hasOneUse() && "The phi should have 1 use");
|
||||
PHINode *EpilogPN = cast<PHINode> (PN->use_begin()->getUser());
|
||||
assert(PN.hasOneUse() && "The phi should have 1 use");
|
||||
PHINode *EpilogPN = cast<PHINode>(PN.use_begin()->getUser());
|
||||
assert(EpilogPN->getParent() == Exit && "EpilogPN should be in Exit block");
|
||||
|
||||
// Add incoming PreHeader from branch around the Loop
|
||||
PN->addIncoming(UndefValue::get(PN->getType()), PreHeader);
|
||||
PN.addIncoming(UndefValue::get(PN.getType()), PreHeader);
|
||||
|
||||
Value *V = PN->getIncomingValueForBlock(Latch);
|
||||
Value *V = PN.getIncomingValueForBlock(Latch);
|
||||
Instruction *I = dyn_cast<Instruction>(V);
|
||||
if (I && L->contains(I))
|
||||
// If value comes from an instruction in the loop add VMap value.
|
||||
@ -242,23 +234,19 @@ static void ConnectEpilog(Loop *L, Value *ModVal, BasicBlock *NewExit,
|
||||
// Skip this as we already updated phis in exit blocks.
|
||||
if (!L->contains(Succ))
|
||||
continue;
|
||||
for (Instruction &BBI : *Succ) {
|
||||
PHINode *PN = dyn_cast<PHINode>(&BBI);
|
||||
// Exit when we passed all PHI nodes.
|
||||
if (!PN)
|
||||
break;
|
||||
for (PHINode &PN : Succ->phis()) {
|
||||
// Add new PHI nodes to the loop exit block and update epilog
|
||||
// PHIs with the new PHI values.
|
||||
PHINode *NewPN = PHINode::Create(PN->getType(), 2, PN->getName() + ".unr",
|
||||
PHINode *NewPN = PHINode::Create(PN.getType(), 2, PN.getName() + ".unr",
|
||||
NewExit->getFirstNonPHI());
|
||||
// Adding a value to the new PHI node from the unrolling loop preheader.
|
||||
NewPN->addIncoming(PN->getIncomingValueForBlock(NewPreHeader), PreHeader);
|
||||
NewPN->addIncoming(PN.getIncomingValueForBlock(NewPreHeader), PreHeader);
|
||||
// Adding a value to the new PHI node from the unrolling loop latch.
|
||||
NewPN->addIncoming(PN->getIncomingValueForBlock(Latch), Latch);
|
||||
NewPN->addIncoming(PN.getIncomingValueForBlock(Latch), Latch);
|
||||
|
||||
// Update the existing PHI node operand with the value from the new PHI
|
||||
// node. Corresponding instruction in epilog loop should be PHI.
|
||||
PHINode *VPN = cast<PHINode>(VMap[&BBI]);
|
||||
PHINode *VPN = cast<PHINode>(VMap[&PN]);
|
||||
VPN->setIncomingValue(VPN->getBasicBlockIndex(EpilogPreHeader), NewPN);
|
||||
}
|
||||
}
|
||||
|
@ -1321,13 +1321,12 @@ void llvm::deleteDeadLoop(Loop *L, DominatorTree *DT = nullptr,
|
||||
|
||||
// Rewrite phis in the exit block to get their inputs from the Preheader
|
||||
// instead of the exiting block.
|
||||
BasicBlock::iterator BI = ExitBlock->begin();
|
||||
while (PHINode *P = dyn_cast<PHINode>(BI)) {
|
||||
for (PHINode &P : ExitBlock->phis()) {
|
||||
// Set the zero'th element of Phi to be from the preheader and remove all
|
||||
// other incoming values. Given the loop has dedicated exits, all other
|
||||
// incoming values must be from the exiting blocks.
|
||||
int PredIndex = 0;
|
||||
P->setIncomingBlock(PredIndex, Preheader);
|
||||
P.setIncomingBlock(PredIndex, Preheader);
|
||||
// Removes all incoming values from all other exiting blocks (including
|
||||
// duplicate values from an exiting block).
|
||||
// Nuke all entries except the zero'th entry which is the preheader entry.
|
||||
@ -1335,13 +1334,12 @@ void llvm::deleteDeadLoop(Loop *L, DominatorTree *DT = nullptr,
|
||||
// below, to keep the indices valid for deletion (removeIncomingValues
|
||||
// updates getNumIncomingValues and shifts all values down into the operand
|
||||
// being deleted).
|
||||
for (unsigned i = 0, e = P->getNumIncomingValues() - 1; i != e; ++i)
|
||||
P->removeIncomingValue(e - i, false);
|
||||
for (unsigned i = 0, e = P.getNumIncomingValues() - 1; i != e; ++i)
|
||||
P.removeIncomingValue(e - i, false);
|
||||
|
||||
assert((P->getNumIncomingValues() == 1 &&
|
||||
P->getIncomingBlock(PredIndex) == Preheader) &&
|
||||
assert((P.getNumIncomingValues() == 1 &&
|
||||
P.getIncomingBlock(PredIndex) == Preheader) &&
|
||||
"Should have exactly one value and that's from the preheader!");
|
||||
++BI;
|
||||
}
|
||||
|
||||
// Disconnect the loop body by branching directly to its exit.
|
||||
|
@ -147,11 +147,9 @@ Value *SSAUpdater::GetValueInMiddleOfBlock(BasicBlock *BB) {
|
||||
if (isa<PHINode>(BB->begin())) {
|
||||
SmallDenseMap<BasicBlock *, Value *, 8> ValueMapping(PredValues.begin(),
|
||||
PredValues.end());
|
||||
PHINode *SomePHI;
|
||||
for (BasicBlock::iterator It = BB->begin();
|
||||
(SomePHI = dyn_cast<PHINode>(It)); ++It) {
|
||||
if (IsEquivalentPHI(SomePHI, ValueMapping))
|
||||
return SomePHI;
|
||||
for (PHINode &SomePHI : BB->phis()) {
|
||||
if (IsEquivalentPHI(&SomePHI, ValueMapping))
|
||||
return &SomePHI;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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())
|
||||
|
@ -4164,15 +4164,12 @@ void InnerLoopVectorizer::fixCrossIterationPHIs() {
|
||||
// the currently empty PHI nodes. At this point every instruction in the
|
||||
// original loop is widened to a vector form so we can use them to construct
|
||||
// the incoming edges.
|
||||
for (Instruction &I : *OrigLoop->getHeader()) {
|
||||
PHINode *Phi = dyn_cast<PHINode>(&I);
|
||||
if (!Phi)
|
||||
break;
|
||||
for (PHINode &Phi : OrigLoop->getHeader()->phis()) {
|
||||
// Handle first-order recurrences and reductions that need to be fixed.
|
||||
if (Legal->isFirstOrderRecurrence(Phi))
|
||||
fixFirstOrderRecurrence(Phi);
|
||||
else if (Legal->isReductionVariable(Phi))
|
||||
fixReduction(Phi);
|
||||
if (Legal->isFirstOrderRecurrence(&Phi))
|
||||
fixFirstOrderRecurrence(&Phi);
|
||||
else if (Legal->isReductionVariable(&Phi))
|
||||
fixReduction(&Phi);
|
||||
}
|
||||
}
|
||||
|
||||
@ -4337,12 +4334,9 @@ void InnerLoopVectorizer::fixFirstOrderRecurrence(PHINode *Phi) {
|
||||
// vector recurrence we extracted in the middle block. Since the loop is in
|
||||
// LCSSA form, we just need to find the phi node for the original scalar
|
||||
// recurrence in the exit block, and then add an edge for the middle block.
|
||||
for (auto &I : *LoopExitBlock) {
|
||||
auto *LCSSAPhi = dyn_cast<PHINode>(&I);
|
||||
if (!LCSSAPhi)
|
||||
break;
|
||||
if (LCSSAPhi->getIncomingValue(0) == Phi) {
|
||||
LCSSAPhi->addIncoming(ExtractForPhiUsedOutsideLoop, LoopMiddleBlock);
|
||||
for (PHINode &LCSSAPhi : LoopExitBlock->phis()) {
|
||||
if (LCSSAPhi.getIncomingValue(0) == Phi) {
|
||||
LCSSAPhi.addIncoming(ExtractForPhiUsedOutsideLoop, LoopMiddleBlock);
|
||||
break;
|
||||
}
|
||||
}
|
||||
@ -4499,21 +4493,15 @@ void InnerLoopVectorizer::fixReduction(PHINode *Phi) {
|
||||
// inside and outside of the scalar remainder loop.
|
||||
// We know that the loop is in LCSSA form. We need to update the
|
||||
// PHI nodes in the exit blocks.
|
||||
for (BasicBlock::iterator LEI = LoopExitBlock->begin(),
|
||||
LEE = LoopExitBlock->end();
|
||||
LEI != LEE; ++LEI) {
|
||||
PHINode *LCSSAPhi = dyn_cast<PHINode>(LEI);
|
||||
if (!LCSSAPhi)
|
||||
break;
|
||||
|
||||
for (PHINode &LCSSAPhi : LoopExitBlock->phis()) {
|
||||
// All PHINodes need to have a single entry edge, or two if
|
||||
// we already fixed them.
|
||||
assert(LCSSAPhi->getNumIncomingValues() < 3 && "Invalid LCSSA PHI");
|
||||
assert(LCSSAPhi.getNumIncomingValues() < 3 && "Invalid LCSSA PHI");
|
||||
|
||||
// We found a reduction value exit-PHI. Update it with the
|
||||
// incoming bypass edge.
|
||||
if (LCSSAPhi->getIncomingValue(0) == LoopExitInst)
|
||||
LCSSAPhi->addIncoming(ReducedPartRdx, LoopMiddleBlock);
|
||||
if (LCSSAPhi.getIncomingValue(0) == LoopExitInst)
|
||||
LCSSAPhi.addIncoming(ReducedPartRdx, LoopMiddleBlock);
|
||||
} // end of the LCSSA phi scan.
|
||||
|
||||
// Fix the scalar loop reduction variable with the incoming reduction sum
|
||||
@ -4528,14 +4516,11 @@ void InnerLoopVectorizer::fixReduction(PHINode *Phi) {
|
||||
}
|
||||
|
||||
void InnerLoopVectorizer::fixLCSSAPHIs() {
|
||||
for (Instruction &LEI : *LoopExitBlock) {
|
||||
auto *LCSSAPhi = dyn_cast<PHINode>(&LEI);
|
||||
if (!LCSSAPhi)
|
||||
break;
|
||||
if (LCSSAPhi->getNumIncomingValues() == 1) {
|
||||
assert(OrigLoop->isLoopInvariant(LCSSAPhi->getIncomingValue(0)) &&
|
||||
for (PHINode &LCSSAPhi : LoopExitBlock->phis()) {
|
||||
if (LCSSAPhi.getNumIncomingValues() == 1) {
|
||||
assert(OrigLoop->isLoopInvariant(LCSSAPhi.getIncomingValue(0)) &&
|
||||
"Incoming value isn't loop invariant");
|
||||
LCSSAPhi->addIncoming(LCSSAPhi->getIncomingValue(0), LoopMiddleBlock);
|
||||
LCSSAPhi.addIncoming(LCSSAPhi.getIncomingValue(0), LoopMiddleBlock);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -4981,11 +4966,8 @@ void InnerLoopVectorizer::updateAnalysis() {
|
||||
/// Phi nodes with constant expressions that can trap are not safe to if
|
||||
/// convert.
|
||||
static bool canIfConvertPHINodes(BasicBlock *BB) {
|
||||
for (Instruction &I : *BB) {
|
||||
auto *Phi = dyn_cast<PHINode>(&I);
|
||||
if (!Phi)
|
||||
return true;
|
||||
for (Value *V : Phi->incoming_values())
|
||||
for (PHINode &Phi : BB->phis()) {
|
||||
for (Value *V : Phi.incoming_values())
|
||||
if (auto *C = dyn_cast<Constant>(V))
|
||||
if (C->canTrap())
|
||||
return false;
|
||||
|
Loading…
Reference in New Issue
Block a user