Author: evancheng Date: Thu Nov 29 17:02:50 2007 New Revision: 44443 URL: http://llvm.org/viewvc/llvm-project?rev=44443&view=rev Log: Do not lose rematerialization info when spilling already split live intervals.
Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Modified: llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp?rev=44443&r1=44442&r2=44443&view=diff ============================================================================== --- llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp (original) +++ llvm/trunk/lib/CodeGen/LiveIntervalAnalysis.cpp Thu Nov 29 17:02:50 2007 @@ -720,7 +720,7 @@ continue; bool TryFold = !DefIsReMat; - bool FoldSS = true; + bool FoldSS = true; // Default behavior unless it's a remat. int FoldSlot = Slot; if (DefIsReMat) { // If this is the rematerializable definition MI itself and @@ -734,8 +734,7 @@ // If def for this use can't be rematerialized, then try folding. // If def is rematerializable and it's a load, also try folding. - TryFold = !ReMatOrigDefMI || - (ReMatOrigDefMI && (MI == ReMatOrigDefMI || isLoad)); + TryFold = !ReMatDefMI || (ReMatDefMI && (MI == ReMatOrigDefMI || isLoad)); if (isLoad) { // Try fold loads (from stack slot, constant pool, etc.) into uses. FoldSS = isLoadSS; @@ -810,6 +809,12 @@ } else { vrm.assignVirt2StackSlot(NewVReg, Slot); } + } else if (HasUse && HasDef && + vrm.getStackSlot(NewVReg) == VirtRegMap::NO_STACK_SLOT) { + // If this interval hasn't been assigned a stack slot (because earlier + // def is a deleted remat def), do it now. + assert(Slot != VirtRegMap::NO_STACK_SLOT); + vrm.assignVirt2StackSlot(NewVReg, Slot); } // create a new register interval for this spill / remat. @@ -984,17 +989,6 @@ SpillMBBs.set(MBBId); } } - - /// FIXME: Move this else where. - if (!IsNew) { - // It this interval hasn't been assigned a stack slot - // (because earlier def is remat), do it now. - int SS = vrm.getStackSlot(NewVReg); - if (SS != (int)Slot) { - assert(SS == VirtRegMap::NO_STACK_SLOT); - vrm.assignVirt2StackSlot(NewVReg, Slot); - } - } } if (HasUse) { @@ -1110,6 +1104,7 @@ // are two-address instructions that re-defined the value. Only the // first def can be rematerialized! if (IsFirstRange) { + // Note ReMatOrigDefMI has already been deleted. rewriteInstructionsForSpills(li, false, I, NULL, ReMatDefMI, Slot, LdSlot, isLoad, isLoadSS, DefIsReMat, false, vrm, RegMap, rc, ReMatIds, loopInfo, _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits