[AArch64] FPLoadBalancing: move ownership of the chain to its current accumulator register

and forget about the previously used accumulator.

Coming up with a simple testcase is not easy, as this highly depends on
what the register allocator is doing: this issue showed up while working
with the PBQP allocator, which produced a different allocation scheme.
A testcase would need to come up with chain starting in D[0-7], then
moving to D[8-15], followed by a call to a function whose regmask
clobbers the starting accumulator in D[0-7], then another use of the chain.

Fixed some formatting, added some invariant checks while there.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@216721 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Arnaud A. de Grandmaison 2014-08-29 09:54:11 +00:00
parent 622de3b2eb
commit 123c92cbe0

View File

@ -193,10 +193,10 @@ public:
/// instruction can be more tricky.
Color LastColor;
Chain(MachineInstr *MI, unsigned Idx, Color C) :
StartInst(MI), LastInst(MI), KillInst(NULL),
StartInstIdx(Idx), LastInstIdx(Idx), KillInstIdx(0),
LastColor(C) {
Chain(MachineInstr *MI, unsigned Idx, Color C)
: StartInst(MI), LastInst(MI), KillInst(nullptr),
StartInstIdx(Idx), LastInstIdx(Idx), KillInstIdx(0),
LastColor(C) {
Insts.insert(MI);
}
@ -206,6 +206,9 @@ public:
LastInst = MI;
LastInstIdx = Idx;
LastColor = C;
assert((KillInstIdx == 0 || LastInstIdx < KillInstIdx) &&
"Chain: broken invariant. A Chain can only be killed after its last "
"def");
Insts.insert(MI);
}
@ -224,6 +227,9 @@ public:
KillInst = MI;
KillInstIdx = Idx;
KillIsImmutable = Immutable;
assert((KillInstIdx == 0 || LastInstIdx < KillInstIdx) &&
"Chain: broken invariant. A Chain can only be killed after its last "
"def");
}
/// Return the first instruction in the chain.
@ -626,7 +632,10 @@ scanInstruction(MachineInstr *MI, unsigned Idx,
DEBUG(dbgs() << "Instruction was successfully added to chain.\n");
ActiveChains[AccumReg]->add(MI, Idx, getColor(DestReg));
// Handle cases where the destination is not the same as the accumulator.
ActiveChains[DestReg] = ActiveChains[AccumReg];
if (DestReg != AccumReg) {
ActiveChains[DestReg] = ActiveChains[AccumReg];
ActiveChains.erase(AccumReg);
}
return;
}