Fix CodeGen/Generic/2005-05-09-GlobalInPHI.ll, which was reduced from 254.gap.
authorChris Lattner <sabre@nondot.org>
Sat, 9 Apr 2005 22:05:17 +0000 (22:05 +0000)
committerChris Lattner <sabre@nondot.org>
Sat, 9 Apr 2005 22:05:17 +0000 (22:05 +0000)
This caused the "use before a def" assertion on some programs.

With this patch, 254.gap now passes with the PPC backend.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@21191 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/PowerPC/PPC32ISelSimple.cpp

index 3d84865b8260194a98cd08cb6230538638f11dc0..d7e131daea3cf15d6d849a8a3dea811f994a1fee 100644 (file)
@@ -871,6 +871,16 @@ void PPC32ISel::LoadArgumentsToVirtualRegs(Function &Fn) {
 void PPC32ISel::SelectPHINodes() {
   const TargetInstrInfo &TII = *TM.getInstrInfo();
   const Function &LF = *F->getFunction();  // The LLVM function...
+
+  MachineBasicBlock::iterator MFLRIt = F->begin()->begin();
+  if (GlobalBaseInitialized) {
+    // If we emitted a MFLR for the global base reg, get an iterator to an
+    // instruction after it.
+    while (MFLRIt->getOpcode() != PPC::MFLR)
+      ++MFLRIt;
+    ++MFLRIt;  // step one MI past it.
+  }
+
   for (Function::const_iterator I = LF.begin(), E = LF.end(); I != E; ++I) {
     const BasicBlock *BB = I;
     MachineBasicBlock &MBB = *MBBMap[I];
@@ -938,6 +948,12 @@ void PPC32ISel::SelectPHINodes() {
             while (PI != PredMBB->end() && PI->getOpcode() == PPC::PHI)
               ++PI;
 
+            // If this is the entry block, and if the entry block contains a
+            // MFLR instruction, emit this operation after it.  This is needed
+            // because global addresses use it.
+            if (PredMBB == F->begin())
+              PI = MFLRIt;
+
             ValReg = getReg(Val, PredMBB, PI);
           }