Fix handling of dead PHI nodes.

llvm-svn: 19349
This commit is contained in:
Chris Lattner 2005-01-07 21:34:19 +00:00
parent d671aa053c
commit 86601673d6

View File

@ -141,13 +141,15 @@ FunctionLoweringInfo::FunctionLoweringInfo(TargetLowering &tli,
// appropriate. // appropriate.
PHINode *PN; PHINode *PN;
for (BasicBlock::iterator I = BB->begin(); for (BasicBlock::iterator I = BB->begin();
(PN = dyn_cast<PHINode>(I)); ++I) { (PN = dyn_cast<PHINode>(I)); ++I)
unsigned NumElements =TLI.getNumElements(TLI.getValueType(PN->getType())); if (!PN->use_empty()) {
unsigned PHIReg = ValueMap[PN]; unsigned NumElements =
assert(PHIReg && "PHI node does not have an assigned virtual register!"); TLI.getNumElements(TLI.getValueType(PN->getType()));
for (unsigned i = 0; i != NumElements; ++i) unsigned PHIReg = ValueMap[PN];
BuildMI(MBB, TargetInstrInfo::PHI, PN->getNumOperands(), PHIReg+i); assert(PHIReg &&"PHI node does not have an assigned virtual register!");
} for (unsigned i = 0; i != NumElements; ++i)
BuildMI(MBB, TargetInstrInfo::PHI, PN->getNumOperands(), PHIReg+i);
}
} }
} }
@ -786,27 +788,29 @@ void SelectionDAGISel::BuildSelectionDAG(SelectionDAG &DAG, BasicBlock *LLVMBB,
// nodes and Machine PHI nodes, but the incoming operands have not been // nodes and Machine PHI nodes, but the incoming operands have not been
// emitted yet. // emitted yet.
for (BasicBlock::iterator I = SuccBB->begin(); for (BasicBlock::iterator I = SuccBB->begin();
(PN = dyn_cast<PHINode>(I)); ++I) { (PN = dyn_cast<PHINode>(I)); ++I)
unsigned Reg; if (!PN->use_empty()) {
Value *PHIOp = PN->getIncomingValueForBlock(LLVMBB); unsigned Reg;
if (Constant *C = dyn_cast<Constant>(PHIOp)) { Value *PHIOp = PN->getIncomingValueForBlock(LLVMBB);
unsigned &RegOut = ConstantsOut[C]; if (Constant *C = dyn_cast<Constant>(PHIOp)) {
if (RegOut == 0) { unsigned &RegOut = ConstantsOut[C];
RegOut = FuncInfo.CreateRegForValue(C); if (RegOut == 0) {
CopyValueToVirtualRegister(SDL, C, RegOut); RegOut = FuncInfo.CreateRegForValue(C);
CopyValueToVirtualRegister(SDL, C, RegOut);
}
Reg = RegOut;
} else {
Reg = FuncInfo.ValueMap[PHIOp];
assert(Reg && "Didn't codegen value into a register!??");
} }
Reg = RegOut;
} else { // Remember that this register needs to added to the machine PHI node as
Reg = FuncInfo.ValueMap[PHIOp]; // the input for this MBB.
assert(Reg && "Didn't codegen value into a register!??"); unsigned NumElements =
TLI.getNumElements(TLI.getValueType(PN->getType()));
for (unsigned i = 0, e = NumElements; i != e; ++i)
PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg+i));
} }
// Remember that this register needs to added to the machine PHI node as
// the input for this MBB.
unsigned NumElements =TLI.getNumElements(TLI.getValueType(PN->getType()));
for (unsigned i = 0, e = NumElements; i != e; ++i)
PHINodesToUpdate.push_back(std::make_pair(MBBI++, Reg+i));
}
} }
ConstantsOut.clear(); ConstantsOut.clear();