From 80879c221171d55762631707a9da0be8161dbece Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 19 Oct 2021 20:21:37 -0700 Subject: [PATCH 1/2] Remove move of same reg in RA if doing move coalesce. The bug only happens when optimizations are turned off before RA. --- src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp | 8 ++++++++ 1 file changed, 8 insertions(+) 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 73dc86e12a..eb1fad0518 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 @@ -1192,6 +1192,14 @@ void GraphColorRegAllocator::ComputeLiveRanges() { } FOR_BB_INSNS_REV_SAFE(insn, bb, ninsn) { +#ifdef MOVE_COALESCE + if ((insn->GetMachineOpcode() == MOP_xmovrr || insn->GetMachineOpcode() == MOP_wmovrr) && + (static_cast(insn->GetOperand(0)).GetRegisterNumber() == + static_cast(insn->GetOperand(1)).GetRegisterNumber())) { + bb->RemoveInsn(*insn); + continue; + } +#endif if (UpdateInsnCntAndSkipUseless(*insn, currPoint)) { if (ninsn != nullptr && ninsn->IsCall()) { UpdateCallInfo(bb->GetId(), currPoint); -- Gitee From ff68f5de13c3b6fdaec366fe7d508b298dcbcdfd Mon Sep 17 00:00:00 2001 From: William Chen Date: Mon, 25 Oct 2021 04:26:16 -0700 Subject: [PATCH 2/2] When removing move to itself, cannot be physical register. --- src/mapleall/maple_be/src/cg/aarch64/aarch64_color_ra.cpp | 1 + 1 file changed, 1 insertion(+) 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 eb1fad0518..77ae60fc34 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 @@ -1194,6 +1194,7 @@ void GraphColorRegAllocator::ComputeLiveRanges() { FOR_BB_INSNS_REV_SAFE(insn, bb, ninsn) { #ifdef MOVE_COALESCE if ((insn->GetMachineOpcode() == MOP_xmovrr || insn->GetMachineOpcode() == MOP_wmovrr) && + (AArch64isa::IsPhysicalRegister(static_cast(insn->GetOperand(0)).GetRegisterNumber()) == false) && (static_cast(insn->GetOperand(0)).GetRegisterNumber() == static_cast(insn->GetOperand(1)).GetRegisterNumber())) { bb->RemoveInsn(*insn); -- Gitee