diff --git a/src/mapleall/maple_ir/include/mir_preg.h b/src/mapleall/maple_ir/include/mir_preg.h index 0474d5ccca2064a6f2645ecd354ff6823ed7b3f5..95a90fc6ada890ff23589f5bf112976aca16b2bc 100644 --- a/src/mapleall/maple_ir/include/mir_preg.h +++ b/src/mapleall/maple_ir/include/mir_preg.h @@ -64,6 +64,14 @@ class MIRPreg { primType = pty; } + Opcode GetOp() const { + return op; + } + + void SetOp(Opcode o) { + this->op = o; + } + int32 GetPregNo() const { return pregNo; } @@ -83,8 +91,15 @@ class MIRPreg { private: PrimType primType = kPtyInvalid; bool needRC = false; + Opcode op = OP_undef;// OP_constval, OP_addrof or OP_dread if rematerializable int32 pregNo; // the number in maple IR after the % MIRType *mirType = nullptr; + public: + union RematInfo { + MIRConst *mirConst; // used only when op is OP_constval + MIRSymbol *sym; // used only when op is OP_addrof or OP_dread + } rematInfo; + FieldID fieldID = 0; // used only when op is OP_addrof or OP_dread }; class MIRPregTable { diff --git a/src/mapleall/maple_me/src/me_rename2preg.cpp b/src/mapleall/maple_me/src/me_rename2preg.cpp index d7a56ba632de08b3a60701690343e04b2dbb384b..e831b8fcd535b4f64d8c5a40979ebb9e6183ef00 100644 --- a/src/mapleall/maple_me/src/me_rename2preg.cpp +++ b/src/mapleall/maple_me/src/me_rename2preg.cpp @@ -105,6 +105,11 @@ RegMeExpr *SSARename2Preg::RenameVar(const VarMeExpr *varmeexpr) { pregOst->SetIsFormal(ost->IsFormal()); sym2reg_map[ost->GetIndex()] = pregOst; (void)vstidx2reg_map.insert(std::make_pair(varmeexpr->GetExprID(), curtemp)); + // set fields in MIRPreg to support rematerialization + MIRPreg *preg = pregOst->GetMIRPreg(); + preg->SetOp(OP_dread); + preg->rematInfo.sym = ost->GetMIRSymbol(); + preg->fieldID = ost->GetFieldID(); if (ost->IsFormal()) { uint32 parmindex = func->GetMirFunc()->GetFormalIndex(mirst); CHECK_FATAL(parm_used_vec[parmindex], "parm_used_vec not set correctly"); diff --git a/src/mapleall/maple_me/src/me_ssa_lpre.cpp b/src/mapleall/maple_me/src/me_ssa_lpre.cpp index 3be1b4d55be83ab12f7a65493ccf7b97a7e05eda..72c6a7a49b5ad7fd840da185f0606401ac56b810 100644 --- a/src/mapleall/maple_me/src/me_ssa_lpre.cpp +++ b/src/mapleall/maple_me/src/me_ssa_lpre.cpp @@ -364,6 +364,9 @@ void MeSSALPre::BuildWorkListExpr(MeStmt &meStmt, int32 seqStmt, MeExpr &meExpr, break; } case kMeOpConst: { + if (preKind != kAddrPre) { + break; + } if (!MeOption::lpre4LargeInt) { break; } diff --git a/src/mapleall/maple_me/src/preg_renamer.cpp b/src/mapleall/maple_me/src/preg_renamer.cpp index 58f61b5b52002ae53a2ad8146547cc301281e566..193e9539238ea31064e9542d07c5df15f1e2e29e 100644 --- a/src/mapleall/maple_me/src/preg_renamer.cpp +++ b/src/mapleall/maple_me/src/preg_renamer.cpp @@ -102,6 +102,14 @@ void PregRenamer::RunSelf() { OriginalSt *newost = func->GetMeSSATab()->GetOriginalStTable().CreatePregOriginalSt(newpregidx, func->GetMirFunc()->GetPuidx()); renameCount++; + MIRPreg *oldpreg = func->GetMirFunc()->GetPregTab()->PregFromPregIdx(regMeexpr->GetRegIdx()); + if (oldpreg->GetOp() != OP_undef) { + // carry over fields in MIRPreg to support rematerialization + MIRPreg *newpreg = func->GetMirFunc()->GetPregTab()->PregFromPregIdx(newpregidx); + newpreg->SetOp(oldpreg->GetOp()); + newpreg->rematInfo = oldpreg->rematInfo; + newpreg->fieldID = oldpreg->fieldID; + } if (DEBUGFUNC(func)) { LogInfo::MapleLogger() << "%" << pregtab->PregFromPregIdx(regMeexpr->GetRegIdx())->GetPregNo(); LogInfo::MapleLogger() << " renamed to %" << pregtab->PregFromPregIdx(newpregidx)->GetPregNo() << std::endl; diff --git a/src/mapleall/maple_me/src/ssa_pre.cpp b/src/mapleall/maple_me/src/ssa_pre.cpp index 1949399c02184f552cbf37778576f8b71188d1de..e61802203cf5ab99abe95f54685c371a738c1650 100644 --- a/src/mapleall/maple_me/src/ssa_pre.cpp +++ b/src/mapleall/maple_me/src/ssa_pre.cpp @@ -29,6 +29,8 @@ namespace maple { // 3. STMTPRE (PRE for Statements) - me_stmt_pre.cpp // 4. STMTFRE (Full Redundancy Elimination for Statements) - me_stmt_fre.cpp // (called when performing STMTPRE). + + // ================ Step 6: Code Motion ================= ScalarMeExpr *SSAPre::CreateNewCurTemp(const MeExpr &meExpr) { if (workCand->NeedLocalRefVar() && GetPlacementRCOn()) { @@ -52,6 +54,28 @@ ScalarMeExpr *SSAPre::CreateNewCurTemp(const MeExpr &meExpr) { curTemp = regVar; if (preKind == kLoadPre) { irMap->SetLpreTmps(static_cast(&meExpr)->GetOstIdx(), *regVar); + // set fields in MIRPreg to support rematerialization + MIRPreg *preg = regVar->GetOst()->GetMIRPreg(); + VarMeExpr *varMeExpr = static_cast(workCand->GetTheMeExpr()); + CHECK_FATAL(varMeExpr->GetMeOp() == kMeOpVar, "CreateNewCurTemp: unexpected meOp"); + OriginalSt *ost = varMeExpr->GetOst(); + preg->SetOp(OP_dread); + preg->rematInfo.sym = ost->GetMIRSymbol(); + preg->fieldID = ost->GetFieldID(); + } else if (preKind == kAddrPre) { + // set fields in MIRPreg to support rematerialization + MIRPreg *preg = regVar->GetOst()->GetMIRPreg(); + if (workCand->GetTheMeExpr()->GetMeOp() == kMeOpAddrof) { + AddrofMeExpr *addrof = static_cast(workCand->GetTheMeExpr()); + OriginalSt *ost = ssaTab->GetOriginalStFromID(addrof->GetOstIdx()); + preg->SetOp(OP_addrof); + preg->rematInfo.sym = ost->GetMIRSymbol(); + preg->fieldID = addrof->GetFieldID(); + } else if (workCand->GetTheMeExpr()->GetMeOp() == kMeOpConst) { + ConstMeExpr *constMeExpr = static_cast(workCand->GetTheMeExpr()); + preg->SetOp(OP_constval); + preg->rematInfo.mirConst = constMeExpr->GetConstVal(); + } } return regVar; } else {