Try fold re-materialized load instructions into its uses.
authorEvan Cheng <evan.cheng@apple.com>
Thu, 30 Aug 2007 05:53:02 +0000 (05:53 +0000)
committerEvan Cheng <evan.cheng@apple.com>
Thu, 30 Aug 2007 05:53:02 +0000 (05:53 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@41598 91177308-0d34-0410-b5e6-96231b3b80d8

lib/CodeGen/LiveIntervalAnalysis.cpp

index 7958ab7b67fa9dbf76e2835bbcf0cb2cb1d7569f..25de7c3ae381ab95d90d8e922e252e0d8f2450ff 100644 (file)
@@ -236,10 +236,17 @@ bool LiveIntervals::isReMaterializable(const LiveInterval &li,
   return true;
 }
 
+/// tryFoldMemoryOperand - Attempts to fold either a spill / restore from
+/// slot / to reg or any rematerialized load into ith operand of specified
+/// MI. If it is successul, MI is updated with the newly created MI and
+/// returns true.
 bool LiveIntervals::tryFoldMemoryOperand(MachineInstr* &MI, VirtRegMap &vrm,
                                          unsigned index, unsigned i,
+                                         bool isSS, MachineInstr *DefMI,
                                          int slot, unsigned reg) {
-  MachineInstr *fmi = mri_->foldMemoryOperand(MI, i, slot);
+  MachineInstr *fmi = isSS
+    ? mri_->foldMemoryOperand(MI, i, slot)
+    : mri_->foldMemoryOperand(MI, i, DefMI);
   if (fmi) {
     // Attempt to fold the memory reference into the instruction. If
     // we can do this, we don't need to insert spill code.
@@ -340,6 +347,8 @@ addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, unsigned reg) {
     bool CanDelete = ReMatDelete[I->valno->id];
     int LdSlot = 0;
     bool isLoadSS = DefIsReMat && tii_->isLoadFromStackSlot(DefMI, LdSlot);
+    bool isLoad = isLoadSS ||
+      (DefIsReMat && (DefMI->getInstrDescriptor()->Flags & M_LOAD_FLAG));
     unsigned index = getBaseIndex(I->start);
     unsigned end = getBaseIndex(I->end-1) + InstrSlots::NUM;
     for (; index != end; index += InstrSlots::NUM) {
@@ -362,20 +371,22 @@ addIntervalsForSpills(const LiveInterval &li, VirtRegMap &vrm, unsigned reg) {
                 RemoveMachineInstrFromMaps(MI);
                 MI->eraseFromParent();
                 break;
-              } else if (tryFoldMemoryOperand(MI, vrm, index, i, slot, li.reg))
+              } else if (tryFoldMemoryOperand(MI, vrm, index, i, true,
+                                              DefMI, slot, li.reg)) {
                 // Folding the load/store can completely change the instruction
                 // in unpredictable ways, rescan it from the beginning.
                 goto RestartInstruction;
-            } else if (isLoadSS &&
-                       tryFoldMemoryOperand(MI, vrm, index, i, LdSlot, li.reg)){
-              // FIXME: Other rematerializable loads can be folded as well.
-              // Folding the load/store can completely change the
-              // instruction in unpredictable ways, rescan it from
-              // the beginning.
-              goto RestartInstruction;
-            }
+              }
+            } else if (isLoad &&
+                       tryFoldMemoryOperand(MI, vrm, index, i, isLoadSS,
+                                            DefMI, LdSlot, li.reg))
+                // Folding the load/store can completely change the
+                // instruction in unpredictable ways, rescan it from
+                // the beginning.
+                goto RestartInstruction;
           } else {
-            if (tryFoldMemoryOperand(MI, vrm, index, i, slot, li.reg))
+            if (tryFoldMemoryOperand(MI,  vrm, index, i, true, DefMI,
+                                     slot, li.reg))
               // Folding the load/store can completely change the instruction in
               // unpredictable ways, rescan it from the beginning.
               goto RestartInstruction;