From 8699e68fb960dc9c1cf745f1232c7cd6a7f5b18a Mon Sep 17 00:00:00 2001 From: William Chen Date: Thu, 11 Nov 2021 15:08:42 -0800 Subject: [PATCH] Fix multipass spill in RA for index memory opnds. Avoid situations like ldr x10, [x10, #8]! --- .../maple_be/src/cg/aarch64/aarch64_color_ra.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp index 6e55e61111..b2c2ae55ed 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp @@ -3674,6 +3674,7 @@ void GraphColorRegAllocator::GenerateSpillFillRegs(Insn &insn) { } } const AArch64MD *md = &AArch64CG::kMd[static_cast(&insn)->GetMachineOpcode()]; + bool isIndexedMemOp = false; for (uint32 opndIdx = 0; opndIdx < opndNum; ++opndIdx) { Operand *opnd = &insn.GetOperand(static_cast(opndIdx)); if (opnd == nullptr) { @@ -3683,6 +3684,9 @@ void GraphColorRegAllocator::GenerateSpillFillRegs(Insn &insn) { // call parameters } else if (opnd->IsMemoryAccessOperand()) { auto *memopnd = static_cast(opnd); + if (memopnd->GetIndexOpt() == AArch64MemOperand::kPreIndex || memopnd->GetIndexOpt() == AArch64MemOperand::kPostIndex) { + isIndexedMemOp = true; + } auto *base = static_cast(memopnd->GetBaseRegister()); if (base != nullptr && !IsUnconcernedReg(*base)) { if (!memopnd->IsIntactIndexed()) { @@ -3768,6 +3772,12 @@ void GraphColorRegAllocator::GenerateSpillFillRegs(Insn &insn) { } } } + uint spillRegIdx; + if (isIndexedMemOp) { + spillRegIdx = useLrs.size(); + } else { + spillRegIdx = 0; + } ASSERT(defLrs.size() <= 1, "expected single def"); for (auto lr: defLrs) { lr->SetID(insn.GetId()); @@ -3775,8 +3785,8 @@ void GraphColorRegAllocator::GenerateSpillFillRegs(Insn &insn) { break; } RegType rtype = lr->GetRegType(); - for (uint i = 0; i < kSpillMemOpndNum; i++) { - regno_t preg = rtype == kRegTyInt ? intRegs[i] : fpRegs[i]; + for (; spillRegIdx < kSpillMemOpndNum; spillRegIdx++) { + regno_t preg = rtype == kRegTyInt ? intRegs[spillRegIdx] : fpRegs[spillRegIdx]; if (defPregs.find(preg) == defPregs.end()) { lr->SetSpillReg(preg); defPregs.insert(preg); -- Gitee