From 123c92cbe07970f370def6039426e779536e0cfe Mon Sep 17 00:00:00 2001 From: "Arnaud A. de Grandmaison" Date: Fri, 29 Aug 2014 09:54:11 +0000 Subject: [PATCH] [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 --- lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp b/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp index caf4ca3e3db..c3047c50e35 100644 --- a/lib/Target/AArch64/AArch64A57FPLoadBalancing.cpp +++ b/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; } -- 2.11.0