From c0c8df70b658d0e9cfaab6975e4d0045e5f2c1c1 Mon Sep 17 00:00:00 2001 From: William Chen Date: Thu, 20 Oct 2022 08:23:36 -0700 Subject: [PATCH] fix adjust offset to update memopnd with large offset --- .../src/cg/aarch64/aarch64_offset_adjust.cpp | 27 ++++++++++--------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_offset_adjust.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_offset_adjust.cpp index 01be7f0a07..ef33447b6e 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_offset_adjust.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_offset_adjust.cpp @@ -39,27 +39,28 @@ void AArch64FPLROffsetAdjustment::AdjustmentOffsetForOpnd(Insn &insn, AArch64CGF stackBaseOpnd = true; } } else if (opnd.IsMemoryAccessOperand()) { - auto &memOpnd = static_cast(opnd); - if (((memOpnd.GetAddrMode() == MemOperand::kAddrModeBOi) || - (memOpnd.GetAddrMode() == MemOperand::kAddrModeBOrX)) && - memOpnd.GetBaseRegister() != nullptr) { - if (memOpnd.GetBaseRegister()->IsOfVary()) { - memOpnd.SetBaseRegister(static_cast(aarchCGFunc.GetOrCreateStackBaseRegOperand())); + auto *memOpnd = &static_cast(opnd); + if (((memOpnd->GetAddrMode() == MemOperand::kAddrModeBOi) || + (memOpnd->GetAddrMode() == MemOperand::kAddrModeBOrX)) && + memOpnd->GetBaseRegister() != nullptr) { + if (memOpnd->GetBaseRegister()->IsOfVary()) { + memOpnd->SetBaseRegister(static_cast(aarchCGFunc.GetOrCreateStackBaseRegOperand())); } - RegOperand *memBaseReg = memOpnd.GetBaseRegister(); + RegOperand *memBaseReg = memOpnd->GetBaseRegister(); if (memBaseReg->GetRegisterNumber() == RFP) { RegOperand &newBaseOpnd = aarchCGFunc.GetOrCreatePhysicalRegisterOperand(stackBaseReg, k64BitSize, kRegTyInt); MemOperand &newMemOpnd = aarchCGFunc.GetOrCreateMemOpnd( - memOpnd.GetAddrMode(), memOpnd.GetSize(), &newBaseOpnd, memOpnd.GetIndexRegister(), - memOpnd.GetOffsetImmediate(), memOpnd.GetSymbol()); + memOpnd->GetAddrMode(), memOpnd->GetSize(), &newBaseOpnd, memOpnd->GetIndexRegister(), + memOpnd->GetOffsetImmediate(), memOpnd->GetSymbol()); insn.SetOperand(i, newMemOpnd); + memOpnd = &newMemOpnd; stackBaseOpnd = true; } } - if ((memOpnd.GetAddrMode() != MemOperand::kAddrModeBOi) || !memOpnd.IsIntactIndexed()) { + if ((memOpnd->GetAddrMode() != MemOperand::kAddrModeBOi) || !memOpnd->IsIntactIndexed()) { continue; } - OfstOperand *ofstOpnd = memOpnd.GetOffsetImmediate(); + OfstOperand *ofstOpnd = memOpnd->GetOffsetImmediate(); if (ofstOpnd == nullptr) { continue; } @@ -69,10 +70,10 @@ void AArch64FPLROffsetAdjustment::AdjustmentOffsetForOpnd(Insn &insn, AArch64CGF ofstOpnd->SetVary(kAdjustVary); } if (ofstOpnd->GetVary() == kAdjustVary || ofstOpnd->GetVary() == kNotVary) { - bool condition = aarchCGFunc.IsOperandImmValid(insn.GetMachineOpcode(), &memOpnd, i); + bool condition = aarchCGFunc.IsOperandImmValid(insn.GetMachineOpcode(), memOpnd, i); if (!condition) { MemOperand &newMemOpnd = aarchCGFunc.SplitOffsetWithAddInstruction( - memOpnd, memOpnd.GetSize(), static_cast(R16), false, &insn, insn.IsLoadStorePair()); + *memOpnd, memOpnd->GetSize(), static_cast(R16), false, &insn, insn.IsLoadStorePair()); insn.SetOperand(i, newMemOpnd); } } -- Gitee