diff --git a/src/mapleall/maple_me/include/me_ir.h b/src/mapleall/maple_me/include/me_ir.h index 3051f62e7b4188b0bed0618ec0635ee7c34ea88a..376ef4c51255fab495ebecab04d6473cd47eb384 100644 --- a/src/mapleall/maple_me/include/me_ir.h +++ b/src/mapleall/maple_me/include/me_ir.h @@ -230,6 +230,10 @@ class ScalarMeExpr : public MeExpr { return ost; } + void SetOst(OriginalSt *o) { + ost = o; + } + OStIdx GetOstIdx() const { return ost->GetIndex(); } @@ -294,7 +298,22 @@ class ScalarMeExpr : public MeExpr { def.defMustDef = &defMustDef; } + PregIdx GetRegIdx() const { + ASSERT(ost->IsPregOst(), "GetPregIdx: not a preg"); + return ost->GetPregIdx(); + } + + bool IsNormalReg() const { + ASSERT(ost->IsPregOst(), "GetPregIdx: not a preg"); + return ost->GetPregIdx() >= 0; + } + BB *GetDefByBBMeStmt(const Dominance&, MeStmtPtr&) const; + void Dump(const IRMap*, int32 indent = 0) const override; + BaseNode &EmitExpr(SSATab&) override; + bool IsSameVariableValue(const VarMeExpr&) const override; + ScalarMeExpr *FindDefByStmt(std::set &visited); + private: OriginalSt *ost; uint32 vstIdx; // the index in MEOptimizer's VersionStTable, 0 if not in VersionStTable @@ -307,6 +326,8 @@ class ScalarMeExpr : public MeExpr { } def; }; +using RegMeExpr = ScalarMeExpr; + // represant dread class VarMeExpr final : public ScalarMeExpr { public: @@ -453,35 +474,6 @@ class MePhiNode { bool isPiAdded = false; }; -class RegMeExpr : public ScalarMeExpr { - public: - RegMeExpr(int32 exprid, OriginalSt *ost, uint32 vidx, PrimType ptyp) - : ScalarMeExpr(exprid, ost, vidx, kMeOpReg, OP_regread, ptyp), - regIdx(ost->GetPregIdx()) {} - - ~RegMeExpr() = default; - - void Dump(const IRMap*, int32 indent = 0) const override; - BaseNode &EmitExpr(SSATab&) override; - bool IsSameVariableValue(const VarMeExpr&) const override; - RegMeExpr *FindDefByStmt(std::set &visited); - - PregIdx16 GetRegIdx() const { - return regIdx; - } - - void SetRegIdx(PregIdx16 regIdxVal) { - regIdx = regIdxVal; - } - - bool IsNormalReg() const { - return regIdx >= 0; - } - - private: - PregIdx16 regIdx; -}; - class ConstMeExpr : public MeExpr { public: ConstMeExpr(int32 exprID, MIRConst *constValParam, PrimType t) diff --git a/src/mapleall/maple_me/src/irmap.cpp b/src/mapleall/maple_me/src/irmap.cpp index f0417e0cd116ea9d18b6d02bb15c05ee97d1023a..61421acfd32e6a7865516bcdcab9a5c18792a841 100644 --- a/src/mapleall/maple_me/src/irmap.cpp +++ b/src/mapleall/maple_me/src/irmap.cpp @@ -105,12 +105,12 @@ VarMeExpr *IRMap::CreateNewLocalRefVarTmp(GStrIdx strIdx, TyIdx tIdx) { } RegMeExpr *IRMap::CreateRegMeExprVersion(OriginalSt &pregOSt) { - auto *regReadExpr = New(exprID++, &pregOSt, 0, pregOSt.GetMIRPreg()->GetPrimType()); + RegMeExpr *regReadExpr = New(exprID++, &pregOSt, 0, kMeOpReg, OP_regread, pregOSt.GetMIRPreg()->GetPrimType()); return regReadExpr; } RegMeExpr *IRMap::CreateRegMeExprVersion(const RegMeExpr &origExpr) { - auto *regReadExpr = New(exprID++, origExpr.GetOst(), 0, origExpr.GetPrimType()); + auto *regReadExpr = New(exprID++, origExpr.GetOst(), 0, kMeOpReg, OP_regread, origExpr.GetPrimType()); return regReadExpr; } @@ -126,7 +126,7 @@ RegMeExpr *IRMap::CreateRefRegMeExpr(const MIRSymbol &mirSt) { preg->SetNeedRC(); } OriginalSt *oSt = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regIdx, mirFunc->GetPuidx()); - auto *regreadexpr = New(exprID++, oSt, 0, pType); + auto *regreadexpr = New(exprID++, oSt, 0, kMeOpReg, OP_regread, pType); return regreadexpr; } @@ -135,7 +135,7 @@ RegMeExpr *IRMap::CreateRegMeExpr(PrimType pType) { PregIdx regIdx = mirFunc->GetPregTab()->CreatePreg(pType); ASSERT(regIdx <= 0xffff, "register oversized"); OriginalSt *ost = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regIdx, mirFunc->GetPuidx()); - auto *regReadExpr = New(exprID++, ost, 0, pType); + auto *regReadExpr = New(exprID++, ost, 0, kMeOpReg, OP_regread, pType); return regReadExpr; } @@ -144,7 +144,7 @@ RegMeExpr *IRMap::CreateRegRefMeExpr(MIRType &mirType) { PregIdx regIdx = mirFunc->GetPregTab()->CreatePreg(PTY_ref, &mirType); ASSERT(regIdx <= 0xffff, "register oversized"); OriginalSt *ost = ssaTab.GetOriginalStTable().CreatePregOriginalSt(regIdx, mirFunc->GetPuidx()); - auto *regReadExpr = New(exprID++, ost, 0, mirType.GetPrimType()); + auto *regReadExpr = New(exprID++, ost, 0, kMeOpReg, OP_regread, mirType.GetPrimType()); return regReadExpr; } diff --git a/src/mapleall/maple_me/src/irmap_build.cpp b/src/mapleall/maple_me/src/irmap_build.cpp index 5633fce7f3d22603ee0731e4f8e76768182d7c33..990e77f31c910756732a0ca649f0acc2bdad0113 100644 --- a/src/mapleall/maple_me/src/irmap_build.cpp +++ b/src/mapleall/maple_me/src/irmap_build.cpp @@ -48,7 +48,8 @@ RegMeExpr *IRMapBuild::GetOrCreateRegFromVerSt(VersionSt &vst) { } OriginalSt *ost = vst.GetOst(); ASSERT(ost->IsPregOst(), "GetOrCreateRegFromVerSt: PregOST expected"); - auto *regx = irMap->New(irMap->exprID++, ost, vindex, ost->GetMIRPreg()->GetPrimType()); + auto *regx = irMap->New(irMap->exprID++, + ost, vindex, kMeOpReg, OP_regread, ost->GetMIRPreg()->GetPrimType()); irMap->vst2MeExprTable[vindex] = regx; return regx; } diff --git a/src/mapleall/maple_me/src/irmap_emit.cpp b/src/mapleall/maple_me/src/irmap_emit.cpp index 9dba09cddee63bf4dd6166e02787fc573d1aaba5..b4dd5d3668cb9589079daeb8e20ef3269d33fbec 100644 --- a/src/mapleall/maple_me/src/irmap_emit.cpp +++ b/src/mapleall/maple_me/src/irmap_emit.cpp @@ -43,9 +43,9 @@ BaseNode &VarMeExpr::EmitExpr(SSATab &ssaTab) { BaseNode &RegMeExpr::EmitExpr(SSATab &ssaTab) { auto *regRead = ssaTab.GetModule().CurFunction()->GetCodeMemPool()->New(); regRead->SetPrimType(GetPrimType()); - regRead->SetRegIdx(regIdx); - ASSERT(regIdx < 0 || - static_cast(static_cast(regIdx)) < ssaTab.GetModule().CurFunction()->GetPregTab()->Size(), + regRead->SetRegIdx(GetRegIdx()); + ASSERT(GetRegIdx() < 0 || + static_cast(static_cast(GetRegIdx())) < ssaTab.GetModule().CurFunction()->GetPregTab()->Size(), "RegMeExpr::EmitExpr: pregIdx exceeds preg table size"); return *regRead; } diff --git a/src/mapleall/maple_me/src/me_ir.cpp b/src/mapleall/maple_me/src/me_ir.cpp index 98b47bea47cf28e17c8eaa21b263af1b67229af4..d3655ab9e191144a87953de2963310e927270845 100644 --- a/src/mapleall/maple_me/src/me_ir.cpp +++ b/src/mapleall/maple_me/src/me_ir.cpp @@ -759,10 +759,10 @@ void VarMeExpr::Dump(const IRMap *irMap, int32) const { void RegMeExpr::Dump(const IRMap *irMap, int32) const { CHECK_NULL_FATAL(irMap); - LogInfo::MapleLogger() << "REGINDX:" << regIdx; + LogInfo::MapleLogger() << "REGINDX:" << GetRegIdx(); LogInfo::MapleLogger() << " %" - << irMap->GetMIRModule().CurFunction()->GetPregTab()->PregFromPregIdx(static_cast(regIdx))->GetPregNo(); + << irMap->GetMIRModule().CurFunction()->GetPregTab()->PregFromPregIdx(static_cast(GetRegIdx()))->GetPregNo(); LogInfo::MapleLogger() << " mx" << GetExprID(); } diff --git a/src/mapleall/maple_me/src/preg_renamer.cpp b/src/mapleall/maple_me/src/preg_renamer.cpp index efae88d8dc4bd9c9a5d6f34dae5046965c1a3d5c..b908f9b33697511c114fecb7547ab0fdcfa739d0 100644 --- a/src/mapleall/maple_me/src/preg_renamer.cpp +++ b/src/mapleall/maple_me/src/preg_renamer.cpp @@ -33,7 +33,7 @@ void PregRenamer::RunSelf() { } MapleMap &mePhiList = bb->GetMePhiList(); for (auto it = mePhiList.begin(); it != mePhiList.end(); ++it) { - OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(it->first); + OriginalSt *ost = func->GetMeSSATab()->GetOriginalStTable().GetOriginalStFromID(it->first); if (!ost->IsPregOst()) { // only handle reg phi continue; } @@ -92,6 +92,7 @@ void PregRenamer::RunSelf() { continue; } newpregidx = pregtab->ClonePreg(*pregtab->PregFromPregIdx(regMeexpr->GetRegIdx())); + OriginalSt *newost = func->GetMeSSATab()->GetOriginalStTable().CreatePregOriginalSt(newpregidx, func->GetMirFunc()->GetPuidx()); renameCount++; if (DEBUGFUNC(func)) { LogInfo::MapleLogger() << "%" << pregtab->PregFromPregIdx(regMeexpr->GetRegIdx())->GetPregNo(); @@ -100,7 +101,7 @@ void PregRenamer::RunSelf() { // reneme all the register for (uint32 i = 0; i < vec.size(); ++i) { RegMeExpr *canregnode = static_cast (regmeexprtable[vec[i]]); - canregnode->SetRegIdx(newpregidx); // rename it to a new register + canregnode->SetOst(newost); // rename it to a new register } } }