OSDN Git Service

Reason #3 from 60595 doesn't hold true. If we can fold a PIC load from constpool...
authorEvan Cheng <evan.cheng@apple.com>
Fri, 5 Dec 2008 17:41:31 +0000 (17:41 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Fri, 5 Dec 2008 17:41:31 +0000 (17:41 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@60596 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalAnalysis.cpp
lib/Target/X86/X86InstrInfo.cpp

index 31b300a..1df6c7d 100644 (file)
@@ -2059,15 +2059,17 @@ addIntervalsForSpills(const LiveInterval &li,
           if (isLoadSS || ReMatDefMI->getDesc().canFoldAsLoad())
             Folded = tryFoldMemoryOperand(MI, vrm, ReMatDefMI, index,
                                           Ops, isLoadSS, LdSlot, VReg);
-          unsigned ImpUse = getReMatImplicitUse(li, ReMatDefMI);
-          if (ImpUse) {
-            // Re-matting an instruction with virtual register use. Add the
-            // register as an implicit use on the use MI and update the register
-            // interval's spill weight to HUGE_VALF to prevent it from being
-            // spilled.
-            LiveInterval &ImpLi = getInterval(ImpUse);
-            ImpLi.weight = HUGE_VALF;
-            MI->addOperand(MachineOperand::CreateReg(ImpUse, false, true));
+          if (!Folded) {
+            unsigned ImpUse = getReMatImplicitUse(li, ReMatDefMI);
+            if (ImpUse) {
+              // Re-matting an instruction with virtual register use. Add the
+              // register as an implicit use on the use MI and update the register
+              // interval's spill weight to HUGE_VALF to prevent it from being
+              // spilled.
+              LiveInterval &ImpLi = getInterval(ImpUse);
+              ImpLi.weight = HUGE_VALF;
+              MI->addOperand(MachineOperand::CreateReg(ImpUse, false, true));
+            }
           }
         }
       }
index 330b4d6..9e60a0f 100644 (file)
@@ -2141,8 +2141,6 @@ MachineInstr* X86InstrInfo::foldMemoryOperandImpl(MachineFunction &MF,
       // This doesn't work for several reasons.
       // 1. GlobalBaseReg may have been spilled.
       // 2. It may not be live at MI.
-      // 3. If this is used during register allocation / spilling, the spiller
-      // must know not to spill GlobalBaseReg (which is a temporary nasty hack).
       return false;
 
     // Create a v4i32 constant-pool entry.