From de87c8a892fa9695b2f2740c4f309a1d513df215 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Sun, 19 Oct 2003 00:26:11 +0000 Subject: [PATCH] Fix bug: Jello/2003-10-18-PHINode-ConstantExpr-CondCode-Failure.llx This also fixes miscompilation of 176.gcc. llvm-svn: 9249 --- lib/Target/X86/InstSelectSimple.cpp | 30 ++++++++++++++++++++--------- 1 file changed, 21 insertions(+), 9 deletions(-) diff --git a/lib/Target/X86/InstSelectSimple.cpp b/lib/Target/X86/InstSelectSimple.cpp index f9b949811b4..ca59109f40d 100644 --- a/lib/Target/X86/InstSelectSimple.cpp +++ b/lib/Target/X86/InstSelectSimple.cpp @@ -490,7 +490,7 @@ void ISel::SelectPHINodes() { // Loop over all of the PHI nodes in the LLVM basic block... unsigned NumPHIs = 0; for (BasicBlock::const_iterator I = BB->begin(); - PHINode *PN = (PHINode*)dyn_cast(I); ++I) { + PHINode *PN = const_cast(dyn_cast(I)); ++I) { // Create a new machine instr PHI node, and insert it. unsigned PHIReg = getReg(*PN); @@ -521,15 +521,27 @@ void ISel::SelectPHINodes() { ValReg = EntryIt->second; } else { - // Get the incoming value into a virtual register. If it is not - // already available in a virtual register, insert the computation - // code into PredMBB + // Get the incoming value into a virtual register. // - MachineBasicBlock::iterator PI = PredMBB->end(); - while (PI != PredMBB->begin() && - TII.isTerminatorInstr((*(PI-1))->getOpcode())) - --PI; - ValReg = getReg(PN->getIncomingValue(i), PredMBB, PI); + Value *Val = PN->getIncomingValue(i); + + // If this is a constant or GlobalValue, we may have to insert code + // into the basic block to compute it into a virtual register. + if (isa(Val) || isa(Val)) { + // Because we don't want to clobber any values which might be in + // physical registers with the computation of this constant (which + // might be arbitrarily complex if it is a constant expression), + // just insert the computation at the top of the basic block. + MachineBasicBlock::iterator PI = PredMBB->begin(); + + // Skip over any PHI nodes though! + while (PI != PredMBB->end() && (*PI)->getOpcode() == X86::PHI) + ++PI; + + ValReg = getReg(Val, PredMBB, PI); + } else { + ValReg = getReg(Val); + } // Remember that we inserted a value for this PHI for this predecessor PHIValues.insert(EntryIt, std::make_pair(PredMBB, ValReg));