mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-02-06 06:33:24 +00:00
Two changes, both very significant:
* vreg <-> vreg joining now works, enable it unconditionally when joining is enabled (which is the default). * Fix a serious pessimization of spill code where we were saying that a spilled DEF operand was live into the subsequent instruction. This allows for substantially better code when spilling starts to happen. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@14993 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
57eb15e316
commit
8ea13c6233
@ -60,11 +60,6 @@ namespace {
|
|||||||
EnableJoining("join-liveintervals",
|
EnableJoining("join-liveintervals",
|
||||||
cl::desc("Join compatible live intervals"),
|
cl::desc("Join compatible live intervals"),
|
||||||
cl::init(true));
|
cl::init(true));
|
||||||
|
|
||||||
cl::opt<bool>
|
|
||||||
EnableVirtVirtJoining("join-liveintervals-virtvirtjoining",
|
|
||||||
cl::desc("Join live intervals for virtreg pairs (buggy)"),
|
|
||||||
cl::init(false));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const
|
void LiveIntervals::getAnalysisUsage(AnalysisUsage &AU) const
|
||||||
@ -251,7 +246,7 @@ std::vector<LiveInterval*> LiveIntervals::addIntervalsForSpills(
|
|||||||
// use of the next instruction. Otherwise we end
|
// use of the next instruction. Otherwise we end
|
||||||
// after the use of this instruction.
|
// after the use of this instruction.
|
||||||
unsigned end = 1 + (mop.isDef() ?
|
unsigned end = 1 + (mop.isDef() ?
|
||||||
getUseIndex(index+InstrSlots::NUM) :
|
getStoreIndex(index) :
|
||||||
getUseIndex(index));
|
getUseIndex(index));
|
||||||
|
|
||||||
// create a new register for this spill
|
// create a new register for this spill
|
||||||
@ -545,11 +540,7 @@ void LiveIntervals::joinIntervals()
|
|||||||
Intervals::iterator intB = r2iB->second;
|
Intervals::iterator intB = r2iB->second;
|
||||||
|
|
||||||
// both A and B are virtual registers
|
// both A and B are virtual registers
|
||||||
|
if (MRegisterInfo::isVirtualRegister(intA->reg) &&
|
||||||
// FIXME: coallescing two virtual registers together is
|
|
||||||
// apparently broken.
|
|
||||||
if (EnableVirtVirtJoining &&
|
|
||||||
MRegisterInfo::isVirtualRegister(intA->reg) &&
|
|
||||||
MRegisterInfo::isVirtualRegister(intB->reg)) {
|
MRegisterInfo::isVirtualRegister(intB->reg)) {
|
||||||
|
|
||||||
const TargetRegisterClass *rcA, *rcB;
|
const TargetRegisterClass *rcA, *rcB;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user