diff --git a/src/mapleall/maple_be/include/cg/reaching.h b/src/mapleall/maple_be/include/cg/reaching.h index 55b4b666fe45fb5bd7fc6c452a788a905e6236b9..13872a91226088af7949555b95e0aeb26e0b87bb 100644 --- a/src/mapleall/maple_be/include/cg/reaching.h +++ b/src/mapleall/maple_be/include/cg/reaching.h @@ -146,6 +146,7 @@ class ReachingDefinition : public AnalysisResult { std::vector memIn; std::vector memOut; const uint32 kMaxBBNum; + uint32 stackSize = 0; private: void Initialize(); void InitDataSize(); diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_prop.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_prop.cpp index d2294c36bcaaa4492b2409ef75107d247f384af3..f62f180dc53713c190828e8145ef39fa0bf96856 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_prop.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_prop.cpp @@ -1492,6 +1492,9 @@ bool ExtendMovPattern::CheckSrcReg(regno_t srcRegNo, uint32 validNum) { bool ExtendMovPattern::BitNotAffected(const Insn &insn, uint32 validNum) { RegOperand &firstOpnd = static_cast(insn.GetOperand(kInsnFirstOpnd)); + if (firstOpnd.IsPhysicalRegister()) { + return false; + } RegOperand &secondOpnd = static_cast(insn.GetOperand(kInsnSecondOpnd)); regno_t desRegNo = firstOpnd.GetRegisterNumber(); regno_t srcRegNo = secondOpnd.GetRegisterNumber(); diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_reaching.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_reaching.cpp index d3cdffa29856b121accf8b929c3def17176255ee..66cf39e832d1b52045583af411684f08e7ee9821 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_reaching.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_reaching.cpp @@ -464,6 +464,9 @@ std::vector AArch64ReachingDefinition::FindMemDefBetweenInsn( ASSERT(memOpnd.GetOffsetImmediate() != nullptr, "offset must be a immediate value"); int64 memOffset = memOpnd.GetOffsetImmediate()->GetOffsetValue(); + if (memOffset < 0) { + memOffset = stackSize + memOffset; + } if ((offset == memOffset) || (insn->IsStorePair() && offset == memOffset + GetEachMemSizeOfPair(insn->GetMachineOpcode()))) { defInsnVec.emplace_back(insn); @@ -516,6 +519,9 @@ void AArch64ReachingDefinition::FindMemDefInBB(uint32 offset, BB &bb, InsnSet &d ASSERT(memOpnd.GetOffsetImmediate() != nullptr, "offset must be a immediate value"); int64 memOffset = memOpnd.GetOffsetImmediate()->GetOffsetValue(); + if (memOffset < 0) { + memOffset = stackSize + memOffset; + } if (offset == memOffset) { (void)defInsnSet.insert(insn); break; @@ -1001,6 +1007,9 @@ bool AArch64ReachingDefinition::FindMemUseBetweenInsn(uint32 offset, Insn *start ASSERT(memOpnd.GetIndexRegister() == nullptr, "offset must not be Register for frame MemOperand"); ASSERT(memOpnd.GetOffsetImmediate() != nullptr, "offset must be a immediate value"); int64 memOffset = memOpnd.GetOffsetImmediate()->GetValue(); + if (memOffset < 0) { + memOffset = stackSize + memOffset; + } if (insn->IsStore() || insn->IsPseudoInstruction()) { if (memOffset == offset) { @@ -1050,6 +1059,9 @@ InsnSet AArch64ReachingDefinition::FindDefForMemOpnd(Insn &insn, uint32 indexOrO } ASSERT(memOpnd.GetOffsetImmediate() != nullptr, "offset must be a immediate value"); memOffSet = memOpnd.GetOffsetImmediate()->GetOffsetValue(); + if (memOffSet < 0) { + memOffSet = stackSize + memOffSet; + } } else { memOffSet = indexOrOffset; } @@ -1101,6 +1113,9 @@ InsnSet AArch64ReachingDefinition::FindUseForMemOpnd(Insn &insn, uint8 index, bo ASSERT(memOpnd.GetIndexRegister() == nullptr, "IndexRegister no nullptr"); ASSERT(memOpnd.GetOffsetImmediate() != nullptr, "offset must be a immediate value"); int64 memOffSet = memOpnd.GetOffsetImmediate()->GetOffsetValue(); + if (memOffSet < 0) { + memOffSet = stackSize + memOffSet; + } if (secondMem) { ASSERT(insn.IsStorePair(), "second MemOperand can only be defined in stp insn"); memOffSet += GetEachMemSizeOfPair(insn.GetMachineOpcode()); @@ -1214,6 +1229,9 @@ void AArch64ReachingDefinition::InitInfoForMemOperand(Insn &insn, Operand &opnd, CHECK_FATAL(index == nullptr, "Existing [x29 + index] Memory Address"); ASSERT(memOpnd.GetOffsetImmediate(), "offset must be a immediate value"); int64 offsetVal = memOpnd.GetOffsetImmediate()->GetOffsetValue(); + if (offsetVal < 0) { + offsetVal = stackSize + offsetVal; + } if ((offsetVal % kMemZoomSize) != 0) { SetAnalysisMode(kRDRegAnalysis); } diff --git a/src/mapleall/maple_be/src/cg/reaching.cpp b/src/mapleall/maple_be/src/cg/reaching.cpp index 77fa1568452e7b7366b21fe7b95ff5aa4dc2b44a..960d820e34d5d03ffc67e23dd0f8805bb5b02ec3 100644 --- a/src/mapleall/maple_be/src/cg/reaching.cpp +++ b/src/mapleall/maple_be/src/cg/reaching.cpp @@ -778,6 +778,7 @@ void ReachingDefinition::AnalysisStart() { if (!cgFunc->GetFirstBB()) { return; } + stackSize = GetStackSize(); Initialize(); /* Build in/out for function body first. (Except cleanup bb) */ BuildInOutForFuncBody();