From dd3465eed17cdf226bdb465e604dfa851d36029d Mon Sep 17 00:00:00 2001 From: Evan Cheng Date: Sat, 23 Feb 2008 01:44:27 +0000 Subject: [PATCH] Recognize loads of arguments as re-materializable first. Therefore if isReallyTriviallyReMaterializable() returns true it doesn't confuse it as a "normal" re-materializable instruction. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@47520 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/CodeGen/LiveIntervalAnalysis.cpp | 50 +++++++++++++++------------- 1 file changed, 26 insertions(+), 24 deletions(-) diff --git a/lib/CodeGen/LiveIntervalAnalysis.cpp b/lib/CodeGen/LiveIntervalAnalysis.cpp index 35f0723b9fc..f1de4d184ef 100644 --- a/lib/CodeGen/LiveIntervalAnalysis.cpp +++ b/lib/CodeGen/LiveIntervalAnalysis.cpp @@ -643,6 +643,31 @@ bool LiveIntervals::isReMaterializable(const LiveInterval &li, const TargetInstrDesc &TID = MI->getDesc(); if (TID.isImplicitDef()) return true; + + int FrameIdx = 0; + if (tii_->isLoadFromStackSlot(MI, FrameIdx) && + mf_->getFrameInfo()->isImmutableObjectIndex(FrameIdx)) { + // This is a load from fixed stack slot. It can be rematerialized unless + // it's re-defined by a two-address instruction. + isLoad = true; + for (LiveInterval::const_vni_iterator i = li.vni_begin(), e = li.vni_end(); + i != e; ++i) { + const VNInfo *VNI = *i; + if (VNI == ValNo) + continue; + unsigned DefIdx = VNI->def; + if (DefIdx == ~1U) + continue; // Dead val#. + MachineInstr *DefMI = (DefIdx == ~0u) + ? NULL : getInstructionFromIndex(DefIdx); + if (DefMI && DefMI->isRegReDefinedByTwoAddr(li.reg)) { + isLoad = false; + return false; + } + } + return true; + } + if (tii_->isTriviallyReMaterializable(MI)) { isLoad = TID.isSimpleLoad(); @@ -663,30 +688,7 @@ bool LiveIntervals::isReMaterializable(const LiveInterval &li, return true; } - int FrameIdx = 0; - if (!tii_->isLoadFromStackSlot(MI, FrameIdx) || - !mf_->getFrameInfo()->isImmutableObjectIndex(FrameIdx)) - return false; - - // This is a load from fixed stack slot. It can be rematerialized unless it's - // re-defined by a two-address instruction. - isLoad = true; - for (LiveInterval::const_vni_iterator i = li.vni_begin(), e = li.vni_end(); - i != e; ++i) { - const VNInfo *VNI = *i; - if (VNI == ValNo) - continue; - unsigned DefIdx = VNI->def; - if (DefIdx == ~1U) - continue; // Dead val#. - MachineInstr *DefMI = (DefIdx == ~0u) - ? NULL : getInstructionFromIndex(DefIdx); - if (DefMI && DefMI->isRegReDefinedByTwoAddr(li.reg)) { - isLoad = false; - return false; - } - } - return true; + return false; } /// isReMaterializable - Returns true if every definition of MI of every -- 2.34.1