diff --git a/src/mapleall/maple_be/include/cg/cg_phi_elimination.h b/src/mapleall/maple_be/include/cg/cg_phi_elimination.h index 2a0369afdbd1ec6cf0799ae538d46dc163db0ab3..cda5b5b92b700852a38b91b54c3513ccf83f7583 100644 --- a/src/mapleall/maple_be/include/cg/cg_phi_elimination.h +++ b/src/mapleall/maple_be/include/cg/cg_phi_elimination.h @@ -45,7 +45,7 @@ class PhiEliminate { void UpdateRematInfo(); regno_t GetAndIncreaseTempRegNO(); RegOperand *MakeRoomForNoDefVreg(RegOperand &conflictReg); - void RecordRematInfo(regno_t vRegNO, PregIdx pIdx); + void RecordRematInfo(regno_t vRegNO, PregIdx pIdx, PrimType primType = kPtyInvalid, MIRType *mirType = nullptr); PregIdx FindRematInfo(regno_t vRegNO) { return remateInfoAfterSSA.count(vRegNO) ? remateInfoAfterSSA[vRegNO] : -1; } diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_phi_elimination.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_phi_elimination.cpp index c4724bb74c0d9d96c0a9df3de0ebd8b4af730bba..26452dcbac063d9d13d596744b227f0ab503c2af 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_phi_elimination.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_phi_elimination.cpp @@ -138,7 +138,7 @@ void AArch64PhiEliminate::MaintainRematInfo(RegOperand &destOpnd, RegOperand &fr regno_t rematRegNO = fromSSAVersion->GetOriginalRegNO(); MIRPreg *fPreg = static_cast(cgFunc)->GetPseudoRegFromVirtualRegNO(rematRegNO); if (fPreg != nullptr) { - RecordRematInfo(destOpnd.GetRegisterNumber(), fPreg->GetPregNo()); + RecordRematInfo(destOpnd.GetRegisterNumber(), fPreg->GetPregNo(), fPreg->GetPrimType(), fPreg->GetMIRType()); } } else { regno_t rematRegNO = fromOpnd.GetRegisterNumber(); diff --git a/src/mapleall/maple_be/src/cg/cg_phi_elimination.cpp b/src/mapleall/maple_be/src/cg/cg_phi_elimination.cpp index c3a3676eacb3e23431ae04e0dd93360d089852ca..73d29e42c9c8826f772c53f838fdde23c2622d5b 100644 --- a/src/mapleall/maple_be/src/cg/cg_phi_elimination.cpp +++ b/src/mapleall/maple_be/src/cg/cg_phi_elimination.cpp @@ -94,12 +94,15 @@ RegOperand *PhiEliminate::MakeRoomForNoDefVreg(RegOperand &conflictReg) { } } -void PhiEliminate::RecordRematInfo(regno_t vRegNO, PregIdx pIdx) { +void PhiEliminate::RecordRematInfo(regno_t vRegNO, PregIdx pIdx, PrimType primType, MIRType *mirType) { if (remateInfoAfterSSA.count(vRegNO)) { if (remateInfoAfterSSA[vRegNO] != pIdx) { remateInfoAfterSSA.erase(vRegNO); } } else { + if (cgFunc->GetFunction().GetPregTab()->GetPregIdxFromPregno(vRegNO) == 0) { + cgFunc->GetFunction().GetPregTab()->EnterPregNo(vRegNO, primType, mirType); + } (void)remateInfoAfterSSA.emplace(std::pair(vRegNO, pIdx)); } }