diff options
| author | Arnaud A. de Grandmaison <arnaud.degrandmaison@arm.com> | 2014-08-29 09:54:11 +0000 |
|---|---|---|
| committer | Arnaud A. de Grandmaison <arnaud.degrandmaison@arm.com> | 2014-08-29 09:54:11 +0000 |
| commit | 6afbf2aa5ea13e26903b965bb79e43705b71eb26 (patch) | |
| tree | 3fb9165303c58c1d3c6881c5beae9f9a406ebe27 /llvm/lib | |
| parent | 5732301afb985f92a474cddbd00797cb82b419c8 (diff) | |
| download | bcm5719-llvm-6afbf2aa5ea13e26903b965bb79e43705b71eb26.tar.gz bcm5719-llvm-6afbf2aa5ea13e26903b965bb79e43705b71eb26.zip | |
[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.
llvm-svn: 216721
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp | 19 |
1 files changed, 14 insertions, 5 deletions
diff --git a/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp b/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp index caf4ca3e3db..c3047c50e35 100644 --- a/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp +++ b/llvm/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp @@ -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; } |

