From bf946c239b499ba7631b41f2efd2fba81285f2bd Mon Sep 17 00:00:00 2001 From: Yang Ding Date: Tue, 15 Oct 2019 15:30:13 -0700 Subject: [PATCH 1/2] Fixed typo in MePhaseManager genMempool should be genMeMpl --- src/maple_ipa/src/interleaved_manager.cpp | 4 ++-- src/maple_me/include/me_phase_manager.h | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/maple_ipa/src/interleaved_manager.cpp b/src/maple_ipa/src/interleaved_manager.cpp index 414da76ea7..8d830ea69a 100644 --- a/src/maple_ipa/src/interleaved_manager.cpp +++ b/src/maple_ipa/src/interleaved_manager.cpp @@ -52,7 +52,7 @@ void InterleavedManager::AddPhases(std::vector &phases, bool isModu MeFuncPhaseManager *fpm = GetMempool()->New(GetMempool(), mirModule, mrm); fpm->RegisterFuncPhases(); if (genMpl) { - fpm->SetGenMempool(true); + fpm->SetGenMeMpl(true); } if (timePhases) { fpm->SetTimePhases(true); @@ -98,7 +98,7 @@ void InterleavedManager::Run() { fpm->Run(func, rangeNum, meInput); rangeNum++; } - if (fpm->GetGenMempool()) { + if (fpm->GetGenMeMpl()) { mirModule.Emit("comb.me.mpl"); } } else { diff --git a/src/maple_me/include/me_phase_manager.h b/src/maple_me/include/me_phase_manager.h index 5a02b4c2de..f2e74bb13e 100644 --- a/src/maple_me/include/me_phase_manager.h +++ b/src/maple_me/include/me_phase_manager.h @@ -34,7 +34,7 @@ class MeFuncPhaseManager : public PhaseManager { mirModule(mod), modResMgr(mrm), mePhaseType(kMePhaseInvalid), - genMempool(false), + genMeMpl(false), timePhases(false) {} ~MeFuncPhaseManager() { @@ -66,12 +66,12 @@ class MeFuncPhaseManager : public PhaseManager { bool FuncFilter(const std::string &filter, const std::string &name); - bool GetGenMempool() { - return genMempool; + bool GetGenMeMpl() { + return genMeMpl; } - void SetGenMempool(bool pl) { - genMempool = pl; + void SetGenMeMpl(bool pl) { + genMeMpl = pl; } void SetTimePhases(bool phs) { @@ -84,7 +84,7 @@ class MeFuncPhaseManager : public PhaseManager { MIRModule &mirModule; ModuleResultMgr *modResMgr; MePhaseType mePhaseType; - bool genMempool; + bool genMeMpl; bool timePhases; }; -- Gitee From 6d203903d596df2bb54ea9377849292170dd5b1d Mon Sep 17 00:00:00 2001 From: Yang Ding Date: Tue, 15 Oct 2019 16:08:51 -0700 Subject: [PATCH 2/2] Introduce ScalarMeExpr as base class VarMeExpr and RegMeExpr have a lot of things in common. This change introduceds ScalarMeExpr as base class to refactor some code. 1) Introduced ScalarMeExpr to abstract common parts in VarMeExpr and RegMeExpr 2) Unify MeVarPhiNode and MeRegPhiNode as MePhiNode 3) Renamed GetOstIdx to GetOStIdx to be consistent --- src/maple_me/include/bb.h | 13 +- src/maple_me/include/irmap.h | 3 +- src/maple_me/include/me_ir.h | 318 +++++++++-------------------- src/maple_me/src/irmap.cpp | 26 +-- src/maple_me/src/me_cfg.cpp | 8 +- src/maple_me/src/me_ir.cpp | 115 ++++------- src/maple_me/src/me_ssa_update.cpp | 14 +- 7 files changed, 171 insertions(+), 326 deletions(-) diff --git a/src/maple_me/include/bb.h b/src/maple_me/include/bb.h index cadf730d4f..fbcd29305b 100644 --- a/src/maple_me/include/bb.h +++ b/src/maple_me/include/bb.h @@ -21,8 +21,7 @@ namespace maple { class VersionSt; class OriginalSt; class MeStmt; -class MeVarPhiNode; -class MeRegPhiNode; +class MePhiNode; class IRMap; enum BBKind { kBBUnknown, // uninitialized @@ -367,15 +366,15 @@ class BB { return phiList; } - const MapleMap &GetMevarPhiList() const { + const MapleMap &GetMevarPhiList() const { return mevarPhiList; } - MapleMap &GetMevarPhiList() { + MapleMap &GetMevarPhiList() { return mevarPhiList; } - MapleMap &GetMeregphiList() { + MapleMap &GetMeregphiList() { return meregPhiList; } @@ -385,8 +384,8 @@ class BB { MapleVector pred; // predecessor list MapleVector succ; // successor list MapleMap phiList; - MapleMap mevarPhiList; - MapleMap meregPhiList; + MapleMap mevarPhiList; + MapleMap meregPhiList; uint32 frequency; BBKind kind; uint32 attributes; diff --git a/src/maple_me/include/irmap.h b/src/maple_me/include/irmap.h index fae859984c..fdada40ffa 100644 --- a/src/maple_me/include/irmap.h +++ b/src/maple_me/include/irmap.h @@ -97,8 +97,7 @@ class IRMap : public AnalysisResult { return ssaTab->GetVerSt(veridx); } - MeRegPhiNode *CreateMeRegPhi(RegMeExpr*); - MeVarPhiNode *CreateMeVarPhi(VarMeExpr*); + MePhiNode *CreateMePhi(ScalarMeExpr*); bool Verify(); // iterate hash table and check with meexpr_table BB *GetFalseBrBB(CondGotoMeStmt*); std::string PhaseName() const { diff --git a/src/maple_me/include/me_ir.h b/src/maple_me/include/me_ir.h index d253296a04..ccf3cb90e1 100644 --- a/src/maple_me/include/me_ir.h +++ b/src/maple_me/include/me_ir.h @@ -182,29 +182,20 @@ class ChiMeNode; // forward decl class MustDefMeNode; // forward decl class IassignMeStmt; // forward decl - -// represant dread -class VarMeExpr : public MeExpr { +// base class for VarMeExpr and RegMeExpr +class ScalarMeExpr : public MeExpr { public: - public: - VarMeExpr(MapleAllocator *alloc, int32 exprid, OStIdx oidx, size_t vidx) - : MeExpr(exprid, kMeOpVar), + ScalarMeExpr(int32 exprid, OStIdx oidx, size_t vidx, MeExprOp op) + : MeExpr(exprid, op), def{ .defStmt = nullptr }, - ostIdx(oidx), - vstIdx(vidx), - fieldID(0), - inferredTyIdx(0), - inferredTypeCandidates(alloc->Adapter()), defBy(kDefByNo), - maybeNull(true) { + ostIdx(oidx), + vstIdx(vidx) { } - ~VarMeExpr() = default; + ~ScalarMeExpr() = default; - void Dump(IRMap*, int32 indent = 0) const; bool IsUseSameSymbol(MeExpr*) const; - BaseNode *EmitExpr(SSATab*); - bool IsValidVerIdx(SSATab *ssaTab); void SetDefByStmt(MeStmt *defStmt) { defBy = kDefByStmt; def.defStmt = defStmt; @@ -214,17 +205,7 @@ class VarMeExpr : public MeExpr { return defBy == kDefByPhi; } - MeVarPhiNode *GetMeVarPhiDef() const { - return IsDefByPhi() ? def.defPhi : nullptr; - } - BB *DefByBB(); - bool IsVolatile(SSATab*); - // indicate if the variable is local variable but not a function formal variable - bool IsPureLocal(SSATab*, const MIRFunction*) const; - bool IsZeroVersion(SSATab*) const; - BB *GetDefByBBMeStmt(Dominance*, MeStmtPtr&); - VarMeExpr *ResolveVarMeValue(); const OStIdx &GetOStIdx() const { return ostIdx; @@ -238,26 +219,6 @@ class VarMeExpr : public MeExpr { vstIdx = vstIdxVal; } - FieldID GetFieldID() const { - return fieldID; - } - - void SetFieldID(FieldID fieldId) { - fieldID = fieldId; - } - - TyIdx &GetInferredTyIdx() { - return inferredTyIdx; - } - - void SetInferredTyIdx(TyIdx inferredTyIdxVal) { - inferredTyIdx = inferredTyIdxVal; - } - - MapleVector &GetInferredTypeCandidates() { - return inferredTypeCandidates; - } - MeDefBy GetDefBy() const { return defBy; } @@ -266,14 +227,6 @@ class VarMeExpr : public MeExpr { defBy = defByVal; } - bool GetMaybeNull() { - return maybeNull; - } - - void SetMaybeNull(bool maybeNullVal) { - maybeNull = maybeNullVal; - } - MeStmt *GetDefStmt() const { return def.defStmt; } @@ -282,11 +235,11 @@ class VarMeExpr : public MeExpr { def.defStmt = defStmt; } - MeVarPhiNode *GetDefPhi() { + MePhiNode *GetDefPhi() { return def.defPhi; } - void SetDefPhi(MeVarPhiNode *defPhi) { + void SetDefPhi(MePhiNode *defPhi) { def.defPhi = defPhi; } @@ -306,61 +259,119 @@ class VarMeExpr : public MeExpr { def.defMustDef = defMustDef; } - private: + protected: union { MeStmt *defStmt; // definition stmt of this var - MeVarPhiNode *defPhi; + MePhiNode *defPhi; ChiMeNode *defChi; // definition node by Chi MustDefMeNode *defMustDef; // definition by callassigned } def; - + MeDefBy defBy; OStIdx ostIdx; // the index in MEOptimizer's OriginalStTable; size_t vstIdx; // the index in MEOptimizer's VersionStTable, 0 if not in VersionStTable +}; + +// represant dread +class VarMeExpr : public ScalarMeExpr { + public: + VarMeExpr(MapleAllocator *alloc, int32 exprid, OStIdx oidx, size_t vidx) + : ScalarMeExpr(exprid, oidx, vidx, kMeOpVar), + fieldID(0), + inferredTyIdx(0), + inferredTypeCandidates(alloc->Adapter()), + maybeNull(true) { + } + + ~VarMeExpr() = default; + + void Dump(IRMap*, int32 indent = 0) const; + BaseNode *EmitExpr(SSATab*); + bool IsValidVerIdx(SSATab *ssaTab); + + MePhiNode *GetMeVarPhiDef() const { + return IsDefByPhi() ? def.defPhi : nullptr; + } + + bool IsVolatile(SSATab*); + // indicate if the variable is local variable but not a function formal variable + bool IsPureLocal(SSATab*, const MIRFunction*) const; + bool IsZeroVersion(SSATab*) const; + BB *GetDefByBBMeStmt(Dominance*, MeStmtPtr&); + VarMeExpr *ResolveVarMeValue(); + + FieldID GetFieldID() const { + return fieldID; + } + + void SetFieldID(FieldID fieldId) { + fieldID = fieldId; + } + + TyIdx &GetInferredTyIdx() { + return inferredTyIdx; + } + + void SetInferredTyIdx(TyIdx inferredTyIdxVal) { + inferredTyIdx = inferredTyIdxVal; + } + + MapleVector &GetInferredTypeCandidates() { + return inferredTypeCandidates; + } + + bool GetMaybeNull() { + return maybeNull; + } + + void SetMaybeNull(bool maybeNullVal) { + maybeNull = maybeNullVal; + } + + private: + /* bool recursivePtr: 1; // if pointer to recursive data structures */ FieldID fieldID; TyIdx inferredTyIdx; /* Non zero if it has a known type (allocation type is seen). */ MapleVector inferredTypeCandidates; - MeDefBy defBy; bool maybeNull; // false if definitely not null }; -class MeVarPhiNode { +class MePhiNode { public: - explicit MeVarPhiNode(MapleAllocator *alloc) - : lhs(nullptr), opnds(2, nullptr, alloc->Adapter()), isLive(true), defBB(nullptr) { - opnds.pop_back(); - opnds.pop_back(); + explicit MePhiNode(MapleAllocator *alloc) + : opnds(2, nullptr, alloc->Adapter()) { + opnds.resize(0); } - MeVarPhiNode(VarMeExpr *var, MapleAllocator *alloc) - : lhs(var), opnds(2, nullptr, alloc->Adapter()), isLive(true), defBB(nullptr) { - var->SetDefPhi(this); - var->SetDefBy(kDefByPhi); - opnds.pop_back(); - opnds.pop_back(); + MePhiNode(ScalarMeExpr *var, MapleAllocator *alloc) + : lhs(var), opnds(2, nullptr, alloc->Adapter()) { + opnds.resize(0); } - ~MeVarPhiNode() = default; + ~MePhiNode() = default; - void UpdateLHS(VarMeExpr *var) { + void UpdateLHS(ScalarMeExpr *var) { lhs = var; var->SetDefBy(kDefByPhi); var->SetDefPhi(this); } + bool UseReg() { + return lhs->GetMeOp() == kMeOpReg; + } bool IsPureLocal(SSATab *ssatab, MIRFunction *mirfunc); void Dump(IRMap *irmap) const; - VarMeExpr *GetOpnd(size_t idx) const { - ASSERT(idx < opnds.size(), "out of range in MeVarPhiNode::GetOpnd"); + ScalarMeExpr *GetOpnd(size_t idx) const { + ASSERT(idx < opnds.size(), "out of range in MePhiNode::GetOpnd"); return opnds.at(idx); } - void SetOpnd(size_t idx, VarMeExpr *opnd) { - CHECK_FATAL(idx < opnds.size(), "out of range in MeVarPhiNode::SetOpnd"); + void SetOpnd(size_t idx, ScalarMeExpr *opnd) { + CHECK_FATAL(idx < opnds.size(), "out of range in MePhiNode::SetOpnd"); opnds[idx] = opnd; } - MapleVector &GetOpnds() { + MapleVector &GetOpnds() { return opnds; } @@ -380,54 +391,36 @@ class MeVarPhiNode { return defBB; } - VarMeExpr *GetLHS() { + ScalarMeExpr *GetLHS() { return lhs; } - void SetLHS(VarMeExpr *value) { + void SetLHS(ScalarMeExpr *value) { lhs = value; } private: - VarMeExpr *lhs; - MapleVector opnds; - bool isLive; - BB *defBB; // the bb that defines this phi + ScalarMeExpr *lhs = nullptr; + MapleVector opnds; + bool isLive = true; + BB *defBB = nullptr; // the bb that defines this phi }; -class RegMeExpr : public MeExpr { +class RegMeExpr : public ScalarMeExpr { public: RegMeExpr(MapleAllocator *alloc, int32 exprid, PregIdx preg, PUIdx pidx, OStIdx oidx, uint32 vidx) - : MeExpr(exprid, kMeOpReg), + : ScalarMeExpr(exprid, oidx, vidx, kMeOpReg), regIdx(preg), - defBy(kDefByNo), recursivePtr(false), puIdx(pidx), - ostIdx(oidx), - vstIdx(vidx), - phiUseSet(std::less(), alloc->Adapter()) { - def.defStmt = nullptr; + phiUseSet(std::less(), alloc->Adapter()) { } ~RegMeExpr() = default; void Dump(IRMap*, int32 indent = 0) const; BaseNode *EmitExpr(SSATab*); - void SetDefByStmt(MeStmt *defStmt) { - defBy = kDefByStmt; - def.defStmt = defStmt; - } - bool IsDefByPhi() const { - return defBy == kDefByPhi; - } - - MeRegPhiNode *GetMeRegPhiDef() { - return IsDefByPhi() ? def.defPhi : nullptr; - } - - bool IsUseSameSymbol(MeExpr*) const; - BB *DefByBB(); RegMeExpr *FindDefByStmt(std::set *visited); PregIdx16 GetRegIdx() const { @@ -438,127 +431,20 @@ class RegMeExpr : public MeExpr { regIdx = regIdxVal; } - MeDefBy GetDefBy() const { - return defBy; - } - - void SetDefBy(MeDefBy defByVal) { - defBy = defByVal; - } - PUIdx GetPuIdx() const { return puIdx; } - OStIdx GetOstIdx() const { - return ostIdx; - } - - MapleSet &GetPhiUseSet() { + MapleSet &GetPhiUseSet() { return phiUseSet; } - MeStmt *GetDefStmt() const { - return def.defStmt; - } - - MeRegPhiNode *GetDefPhi() { - return def.defPhi; - } - - MustDefMeNode *GetDefMustDef() { - return def.defMustDef; - } - - void SetDefStmt(MeStmt *defStmtVal) { - def.defStmt = defStmtVal; - } - - void SetDefPhi(MeRegPhiNode *defPhiVal) { - def.defPhi = defPhiVal; - } - - void SetDefMustDef(MustDefMeNode *defMustDefVal) { - def.defMustDef = defMustDefVal; - } - private: PregIdx16 regIdx; - MeDefBy defBy; bool recursivePtr; // if pointer to recursive data structures; // used only is_escaped is false PUIdx puIdx; - OStIdx ostIdx; // the index in MEOptimizer's OriginalStTable; - uint32 vstIdx; // the index in MEOptimizer's VersionStTable, 0 if not in VersionStTable - MapleSet phiUseSet; // the use set of this reg node, used by preg renamer - union { - MeStmt *defStmt; - MeRegPhiNode *defPhi; - MustDefMeNode *defMustDef; // definition by callassigned - } def; -}; - -class MeRegPhiNode { - public: - explicit MeRegPhiNode(MapleAllocator *alloc) - : lhs(nullptr), opnds(2, nullptr, alloc->Adapter()), isLive(true), defBB(nullptr) { - opnds.pop_back(); - opnds.pop_back(); - } - - ~MeRegPhiNode() = default; - - void UpdateLHS(RegMeExpr *reg) { - lhs = reg; - reg->SetDefBy(kDefByPhi); - reg->SetDefPhi(this); - } - - void Dump(IRMap *irMap) const; - - RegMeExpr *GetLHS() { - return lhs; - } - - void SetLHS(RegMeExpr *lhsVal) { - lhs = lhsVal; - } - - MapleVector &GetOpnds() { - return opnds; - } - - RegMeExpr *GetOpnd(size_t idx) { - CHECK_FATAL(idx < opnds.size(), "out of range in MeRegPhiNode::GetOpnd"); - return opnds[idx]; - } - - void SetOpnd(size_t idx, RegMeExpr *opnd) { - CHECK_FATAL(idx < opnds.size(), "out of range in MeRegPhiNode::SetOpnd"); - opnds[idx] = opnd; - } - - void SetIsLive(bool isLiveVal) { - isLive = isLiveVal; - } - - bool GetIsLive() { - return isLive; - } - - void SetDefBB(BB *defBBVal) { - defBB = defBBVal; - } - - BB *GetDefBB() { - return defBB; - } - - private: - RegMeExpr *lhs; - MapleVector opnds; - bool isLive; - BB *defBB; // the bb that defines this phi + MapleSet phiUseSet; // the use set of this reg node, used by preg renamer }; class ConstMeExpr : public MeExpr { @@ -705,11 +591,11 @@ class AddrofMeExpr : public MeExpr { bool IsUseSameSymbol(MeExpr*) const; BaseNode *EmitExpr(SSATab*); - OStIdx &GetOstIdx() { + OStIdx &GetOStIdx() { return ostIdx; } - OStIdx GetOstIdx() const { + OStIdx GetOStIdx() const { return ostIdx; } diff --git a/src/maple_me/src/irmap.cpp b/src/maple_me/src/irmap.cpp index a8d3597aaf..bb4d54ec96 100644 --- a/src/maple_me/src/irmap.cpp +++ b/src/maple_me/src/irmap.cpp @@ -54,7 +54,7 @@ void IRMap::BuildPhiMeNode(BB *bb) { OriginalSt *origst = phi.first; VersionSt *verSt = phi.second.GetResult(); if (origst->IsPregOst()) { - MeRegPhiNode *phimenode = NewInPool(); + MePhiNode *phimenode = NewInPool(); RegMeExpr *medef = GetOrCreateRegFromVerSt(verSt); phimenode->UpdateLHS(medef); phimenode->SetDefBB(bb); @@ -62,9 +62,9 @@ void IRMap::BuildPhiMeNode(BB *bb) { for (VersionSt *opnd : phi.second.GetPhiOpns()) { phimenode->GetOpnds().push_back(GetOrCreateRegFromVerSt(opnd)); } - bb->GetMeregphiList().insert(std::make_pair(medef->GetOstIdx(), phimenode)); + bb->GetMeregphiList().insert(std::make_pair(medef->GetOStIdx(), phimenode)); } else { - MeVarPhiNode *phimenode = NewInPool(); + MePhiNode *phimenode = NewInPool(); VarMeExpr *medef = GetOrCreateVarFromVerSt(verSt); phimenode->UpdateLHS(medef); phimenode->SetDefBB(bb); @@ -140,7 +140,7 @@ RegMeExpr *IRMap::CreateRegMeExprVersion(const OriginalSt *pregOrgst) { RegMeExpr *IRMap::CreateRegMeExprVersion(const RegMeExpr *origExpr) { RegMeExpr *regreadexpr = - NewInPool(exprID++, origExpr->GetRegIdx(), origExpr->GetPuIdx(), origExpr->GetOstIdx(), 0); + NewInPool(exprID++, origExpr->GetRegIdx(), origExpr->GetPuIdx(), origExpr->GetOStIdx(), 0); regreadexpr->InitBase(origExpr->GetOp(), origExpr->GetPrimType(), origExpr->GetNumOpnds()); regMeExprTable.push_back(regreadexpr); return regreadexpr; @@ -1005,12 +1005,12 @@ MeExpr *IRMap::HashMeExpr(MeExpr *meExpr) { itexpr = static_cast(itexpr->GetNext()); continue; } - if (itexpr->GetOstIdx() == addrofmeexpr->GetOstIdx() && itexpr->GetFieldID() == addrofmeexpr->GetFieldID()) { + if (itexpr->GetOStIdx() == addrofmeexpr->GetOStIdx() && itexpr->GetFieldID() == addrofmeexpr->GetFieldID()) { return itexpr; } itexpr = static_cast(itexpr->GetNext()); } - AddrofMeExpr *newaddrofmeexpr = New(exprID++, addrofmeexpr->GetOstIdx()); + AddrofMeExpr *newaddrofmeexpr = New(exprID++, addrofmeexpr->GetOStIdx()); newaddrofmeexpr->InitBase(meExpr->GetOp(), meExpr->GetPrimType(), meExpr->GetNumOpnds()); newaddrofmeexpr->SetFieldID(addrofmeexpr->GetFieldID()); PutToBucket(hidx, newaddrofmeexpr); @@ -1234,16 +1234,10 @@ bool IRMap::ReplaceMeExprStmt(MeStmt *meStmt, MeExpr *meExpr, MeExpr *repexpr) { return isReplaced; } -MeRegPhiNode *IRMap::CreateMeRegPhi(RegMeExpr *mevar) { - MeRegPhiNode *phimereg = NewInPool(); - phimereg->UpdateLHS(mevar); - return phimereg; -} - -MeVarPhiNode *IRMap::CreateMeVarPhi(VarMeExpr *mevar) { - MeVarPhiNode *phimevar = NewInPool(); - phimevar->UpdateLHS(mevar); - return phimevar; +MePhiNode *IRMap::CreateMePhi(ScalarMeExpr *meExpr) { + MePhiNode *phime = NewInPool(); + phime->UpdateLHS(meExpr); + return phime; } DassignMeStmt *IRMap::CreateDassignMeStmt(MeExpr *lhs, MeExpr *rhs, BB *curbb) { diff --git a/src/maple_me/src/me_cfg.cpp b/src/maple_me/src/me_cfg.cpp index e5f8b7ead6..c9292be080 100644 --- a/src/maple_me/src/me_cfg.cpp +++ b/src/maple_me/src/me_cfg.cpp @@ -484,8 +484,8 @@ void MirCFG::ConvertPhis2IdentityAssigns(BB *meBB) { OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(varPhiIt->first); if (ost->IsSymbolOst() && ost->GetIndirectLev() == 0) { DassignMeStmt *dassign = func->GetIRMap()->NewInPool(); - MeVarPhiNode *varPhi = varPhiIt->second; - dassign->SetLHS(varPhi->GetLHS()); + MePhiNode *varPhi = varPhiIt->second; + dassign->SetLHS(static_cast(varPhi->GetLHS())); dassign->SetRHS(varPhi->GetOpnd(0)); dassign->SetBB(varPhi->GetDefBB()); dassign->SetIsLive(varPhi->GetIsLive()); @@ -504,8 +504,8 @@ void MirCFG::ConvertPhis2IdentityAssigns(BB *meBB) { OriginalSt *ost = func->GetMeSSATab()->GetOriginalStFromID(regPhiIt->first); if (ost->IsSymbolOst() && ost->GetIndirectLev() == 0) { RegassignMeStmt *regass = func->GetIRMap()->New(); - MeRegPhiNode *regPhi = regPhiIt->second; - regass->SetLHS(regPhi->GetLHS()); + MePhiNode *regPhi = regPhiIt->second; + regass->SetLHS(static_cast(regPhi->GetLHS())); regass->SetRHS(regPhi->GetOpnd(0)); regass->SetBB(regPhi->GetDefBB()); regass->SetIsLive(regPhi->GetIsLive()); diff --git a/src/maple_me/src/me_ir.cpp b/src/maple_me/src/me_ir.cpp index 5598336cec..b8e97595d2 100644 --- a/src/maple_me/src/me_ir.cpp +++ b/src/maple_me/src/me_ir.cpp @@ -185,9 +185,10 @@ RegMeExpr *RegMeExpr::FindDefByStmt(std::set *visited) { return this; } if (GetDefBy() == kDefByPhi) { - MeRegPhiNode *phireg = GetDefPhi(); - for (RegMeExpr *phiOpnd : phireg->GetOpnds()) { - RegMeExpr *res = phiOpnd->FindDefByStmt(visited); + MePhiNode *phireg = GetDefPhi(); + for (ScalarMeExpr *phiOpnd : phireg->GetOpnds()) { + RegMeExpr *regOpnd = static_cast(phiOpnd); + RegMeExpr *res = regOpnd->FindDefByStmt(visited); if (res != nullptr) { return res; } @@ -371,7 +372,7 @@ BB *VarMeExpr::GetDefByBBMeStmt(Dominance *dominance, MeStmtPtr &defMeStmt) { break; } case kDefByPhi: { - MeVarPhiNode *defphi = def.defPhi; + MePhiNode *defphi = def.defPhi; bbx = defphi->GetDefBB(); break; } @@ -381,14 +382,6 @@ BB *VarMeExpr::GetDefByBBMeStmt(Dominance *dominance, MeStmtPtr &defMeStmt) { return bbx; } -bool VarMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { - VarMeExpr *varMeExpr = dynamic_cast(meexpr); - if (varMeExpr == nullptr) { - return false; - } - return ostIdx == varMeExpr->ostIdx; -} - bool VarMeExpr::IsPureLocal(SSATab *ssatab, const MIRFunction *mirfunc) const { MIRSymbol *st = ssatab->GetMIRSymbolFromID(ostIdx); return st->IsLocal() && !mirfunc->IsAFormal(st); @@ -400,34 +393,6 @@ bool VarMeExpr::IsZeroVersion(SSATab *ssatab) const { return ost->GetZeroVersionIndex() == vstIdx; } -bool RegMeExpr::IsUseSameSymbol(MeExpr *meExpr) const { - RegMeExpr *regMeExpr = dynamic_cast(meExpr); - if (regMeExpr == nullptr) { - return false; - } - return ostIdx == regMeExpr->ostIdx; -} - -BB *RegMeExpr::DefByBB() { - switch (defBy) { - case kDefByNo: - return nullptr; - case kDefByStmt: - ASSERT(def.defStmt, "VarMeExpr::DefByBB: defStmt cannot be nullptr"); - return def.defStmt->GetBB(); - case kDefByPhi: - ASSERT(def.defPhi, "VarMeExpr::DefByBB: defPhi cannot be nullptr"); - return def.defPhi->GetDefBB(); - case kDefByMustDef: - ASSERT(def.defMustDef, "VarMeExpr::DefByBB: defMustDef cannot be nullptr"); - ASSERT(def.defMustDef->GetBase(), "VarMeExpr::DefByBB: defMustDef->base cannot be nullptr"); - return def.defMustDef->GetBase()->GetBB(); - default: - ASSERT(false, "reg define unknown"); - return nullptr; - } -} - bool AddrofMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { AddrofMeExpr *varMeExpr = dynamic_cast(meexpr); if (!varMeExpr) { @@ -492,9 +457,22 @@ int64 ConstMeExpr::GetIntValue() const { return mirConst->GetValue(); } -void MeVarPhiNode::Dump(IRMap *irMap) const { - LogInfo::MapleLogger() << "VAR:"; - irMap->GetSSATab()->GetOriginalStFromID(lhs->GetOStIdx())->Dump(); +void MePhiNode::Dump(IRMap *irMap) const { + OriginalSt *ost = irMap->GetSSATab()->GetOriginalStFromID(lhs->GetOStIdx()); + bool isSym = ost->IsSymbolOst(); + if (isSym) { + LogInfo::MapleLogger() << "VAR:"; + ost->Dump(); + } else { + PregIdx regId = static_cast(lhs)->GetRegIdx(); + LogInfo::MapleLogger() << "REGVAR: " << regId; + LogInfo::MapleLogger() << "(%" + << irMap->GetMIRModule()->CurFunction() + ->GetPregTab() + ->PregFromPregIdx(regId) + ->GetPregNo() + << ")"; + } LogInfo::MapleLogger() << " mx" << lhs->GetExprID(); LogInfo::MapleLogger() << " = MEPHI{"; for (size_t i = 0; i < opnds.size(); i++) { @@ -504,31 +482,12 @@ void MeVarPhiNode::Dump(IRMap *irMap) const { } } LogInfo::MapleLogger() << "}"; - if (!isLive) { + if (isSym && !isLive) { LogInfo::MapleLogger() << " dead"; } LogInfo::MapleLogger() << std::endl; } -void MeRegPhiNode::Dump(IRMap *irMap) const { - LogInfo::MapleLogger() << "REGVAR: " << lhs->GetRegIdx(); - LogInfo::MapleLogger() << "(%" - << irMap->GetMIRModule()->CurFunction() - ->GetPregTab() - ->PregFromPregIdx(static_cast(lhs->GetRegIdx())) - ->GetPregNo() - << ")"; - LogInfo::MapleLogger() << " mx" << lhs->GetExprID(); - LogInfo::MapleLogger() << " = MEPHI{"; - for (size_t i = 0; i < opnds.size(); i++) { - LogInfo::MapleLogger() << "mx" << opnds[i]->GetExprID(); - if (i != opnds.size() - 1) { - LogInfo::MapleLogger() << ","; - } - } - LogInfo::MapleLogger() << "}" << std::endl; -} - void VarMeExpr::Dump(IRMap *irMap, int32 indent) const { LogInfo::MapleLogger() << "VAR "; irMap->GetSSATab()->GetOriginalStFromID(ostIdx)->Dump(); @@ -1082,28 +1041,36 @@ void AssertMeStmt::Dump(IRMap *irMap) const { LogInfo::MapleLogger() << std::endl; } -BB *VarMeExpr::DefByBB() { +bool ScalarMeExpr::IsUseSameSymbol(MeExpr *meexpr) const { + ScalarMeExpr *scalar = dynamic_cast(meexpr); + if (scalar == nullptr) { + return false; + } + return ostIdx == scalar->ostIdx; +} + +BB *ScalarMeExpr::DefByBB() { switch (defBy) { case kDefByNo: return nullptr; case kDefByStmt: - ASSERT(def.defStmt, "VarMeExpr::DefByBB: defStmt cannot be nullptr"); + ASSERT(def.defStmt, "ScalarMeExpr::DefByBB: defStmt cannot be nullptr"); return def.defStmt->GetBB(); case kDefByPhi: - ASSERT(def.defPhi, "VarMeExpr::DefByBB: defPhi cannot be nullptr"); + ASSERT(def.defPhi, "ScalarMeExpr::DefByBB: defPhi cannot be nullptr"); return def.defPhi->GetDefBB(); case kDefByChi: { - ASSERT(def.defChi, "VarMeExpr::DefByBB: defChi cannot be nullptr"); - ASSERT(def.defChi->GetBase(), "VarMeExpr::DefByBB: defChi->base cannot be nullptr"); + ASSERT(def.defChi, "ScalarMeExpr::DefByBB: defChi cannot be nullptr"); + ASSERT(def.defChi->GetBase(), "ScalarMeExpr::DefByBB: defChi->base cannot be nullptr"); return def.defChi->GetBase()->GetBB(); } case kDefByMustDef: { - ASSERT(def.defMustDef, "VarMeExpr::DefByBB: defMustDef cannot be nullptr"); - ASSERT(def.defMustDef->GetBase(), "VarMeExpr::DefByBB: defMustDef->base cannot be nullptr"); + ASSERT(def.defMustDef, "ScalarMeExpr::DefByBB: defMustDef cannot be nullptr"); + ASSERT(def.defMustDef->GetBase(), "ScalarMeExpr::DefByBB: defMustDef->base cannot be nullptr"); return def.defMustDef->GetBase()->GetBB(); } default: - ASSERT(false, "var define unknown"); + ASSERT(false, "scalar define unknown"); return nullptr; } } @@ -1182,10 +1149,10 @@ MapleMap *GenericGetChiListFromVarMeExprInner(VarMeExpr *exp } visited.insert(expr); if (expr->GetDefBy() == kDefByPhi) { - MeVarPhiNode *phime = expr->GetDefPhi(); - MapleVector &phiopnds = phime->GetOpnds(); + MePhiNode *phime = expr->GetDefPhi(); + MapleVector &phiopnds = phime->GetOpnds(); for (auto it = phiopnds.begin(); it != phiopnds.end(); it++) { - VarMeExpr *meexpr = *it; + VarMeExpr *meexpr = static_cast(*it); MapleMap *chiList = GenericGetChiListFromVarMeExprInner(meexpr, visited); if (chiList != nullptr) { return chiList; diff --git a/src/maple_me/src/me_ssa_update.cpp b/src/maple_me/src/me_ssa_update.cpp index 3c1d46c747..2f07d2313c 100644 --- a/src/maple_me/src/me_ssa_update.cpp +++ b/src/maple_me/src/me_ssa_update.cpp @@ -50,12 +50,12 @@ void SSAUpdate::InsertPhis() { // insert a phi node BB *bb = func->GetBBFromID(bbid); ASSERT(bb != nullptr, "null ptr check"); - MapleMap::iterator phiListIt = bb->GetMevarPhiList().find(it->first); + MapleMap::iterator phiListIt = bb->GetMevarPhiList().find(it->first); if (phiListIt != bb->GetMevarPhiList().end()) { phiListIt->second->SetIsLive(true); continue; } - MeVarPhiNode *phiMeNode = irMap->NewInPool(); + MePhiNode *phiMeNode = irMap->NewInPool(); phiMeNode->SetDefBB(bb); phiMeNode->GetOpnds().resize(bb->GetPred().size()); bb->GetMevarPhiList().insert(std::make_pair(it->first, phiMeNode)); @@ -68,10 +68,10 @@ void SSAUpdate::InsertPhis() { void SSAUpdate::RenamePhi(BB *bb) { MapleMap*>::iterator it1 = renameStacks.begin(); for (; it1 != renameStacks.end(); it1++) { - MapleMap::iterator it2 = bb->GetMevarPhiList().find(it1->first); + MapleMap::iterator it2 = bb->GetMevarPhiList().find(it1->first); if (it2 != bb->GetMevarPhiList().end()) { // if there is existing phi result node - MeVarPhiNode *phi = it2->second; + MePhiNode *phi = it2->second; phi->SetIsLive(true); // always make it live, for correctness if (phi->GetLHS() == nullptr) { // create a new VarMeExpr defined by this phi @@ -86,7 +86,7 @@ void SSAUpdate::RenamePhi(BB *bb) { phi->UpdateLHS(newvar); it1->second->push(newvar); // push the stack } else { - it1->second->push(phi->GetLHS()); // push the stack + it1->second->push(static_cast(phi->GetLHS())); // push the stack } } } @@ -221,11 +221,11 @@ void SSAUpdate::RenamePhiOpndsInSucc(BB *bb) { CHECK_FATAL(index < succ->GetPred().size(), "RenamePhiOpndsinSucc: cannot find corresponding pred"); MapleMap*>::iterator it1 = renameStacks.begin(); for (; it1 != renameStacks.end(); it1++) { - MapleMap::iterator it2 = succ->GetMevarPhiList().find(it1->first); + MapleMap::iterator it2 = succ->GetMevarPhiList().find(it1->first); if (it2 == succ->GetMevarPhiList().end()) { continue; } - MeVarPhiNode *phi = it2->second; + MePhiNode *phi = it2->second; MapleStack *renameStack = it1->second; VarMeExpr *curvar = renameStack->top(); if (phi->GetOpnd(index) != curvar) { -- Gitee