[llvm-commits] CVS: llvm/lib/Target/X86/InstSelectSimple.cpp

Chris Lattner lattner at cs.uiuc.edu
Sun Feb 29 01:11:01 PST 2004


Changes in directory llvm/lib/Target/X86:

InstSelectSimple.cpp updated: 1.184 -> 1.185

---
Log message:

Fix a miscompilation of 197.parser that occurs when you have single basic
block loops.


---
Diffs of the changes:  (+14 -8)

Index: llvm/lib/Target/X86/InstSelectSimple.cpp
diff -u llvm/lib/Target/X86/InstSelectSimple.cpp:1.184 llvm/lib/Target/X86/InstSelectSimple.cpp:1.185
--- llvm/lib/Target/X86/InstSelectSimple.cpp:1.184	Sat Feb 28 23:59:33 2004
+++ llvm/lib/Target/X86/InstSelectSimple.cpp	Sun Feb 29 01:10:16 2004
@@ -567,23 +567,22 @@
   const Function &LF = *F->getFunction();  // The LLVM function...
   for (Function::const_iterator I = LF.begin(), E = LF.end(); I != E; ++I) {
     const BasicBlock *BB = I;
-    MachineBasicBlock *MBB = MBBMap[I];
+    MachineBasicBlock &MBB = *MBBMap[I];
 
     // Loop over all of the PHI nodes in the LLVM basic block...
-    MachineBasicBlock::iterator instr = MBB->begin();
+    MachineBasicBlock::iterator PHIInsertPoint = MBB.begin();
     for (BasicBlock::const_iterator I = BB->begin();
          PHINode *PN = const_cast<PHINode*>(dyn_cast<PHINode>(I)); ++I) {
 
       // Create a new machine instr PHI node, and insert it.
       unsigned PHIReg = getReg(*PN);
-      MachineInstr *PhiMI = BuildMI(X86::PHI, PN->getNumOperands(), PHIReg);
-      MBB->insert(instr, PhiMI);
+      MachineInstr *PhiMI = BuildMI(MBB, PHIInsertPoint,
+                                    X86::PHI, PN->getNumOperands(), PHIReg);
 
       MachineInstr *LongPhiMI = 0;
-      if (PN->getType() == Type::LongTy || PN->getType() == Type::ULongTy) {
-        LongPhiMI = BuildMI(X86::PHI, PN->getNumOperands(), PHIReg+1);
-        MBB->insert(instr, LongPhiMI);
-      }
+      if (PN->getType() == Type::LongTy || PN->getType() == Type::ULongTy)
+        LongPhiMI = BuildMI(MBB, PHIInsertPoint,
+                            X86::PHI, PN->getNumOperands(), PHIReg+1);
 
       // PHIValues - Map of blocks to incoming virtual registers.  We use this
       // so that we only initialize one incoming value for a particular block,
@@ -636,6 +635,13 @@
           LongPhiMI->addMachineBasicBlockOperand(PredMBB);
         }
       }
+
+      // Now that we emitted all of the incoming values for the PHI node, make
+      // sure to reposition the InsertPoint after the PHI that we just added.
+      // This is needed because we might have inserted a constant into this
+      // block, right after the PHI's which is before the old insert point!
+      PHIInsertPoint = LongPhiMI ? LongPhiMI : PhiMI;
+      ++PHIInsertPoint;
     }
   }
 }





More information about the llvm-commits mailing list