diff --git a/src/mapleall/maple_me/include/alias_class.h b/src/mapleall/maple_me/include/alias_class.h index 97594707647855c1b221488b1e34472f432ea0f4..831c5751c14240e28f164c95a5c415f27ba2c71d 100644 --- a/src/mapleall/maple_me/include/alias_class.h +++ b/src/mapleall/maple_me/include/alias_class.h @@ -199,27 +199,27 @@ class AliasClass : public AnalysisResult { void CollectMayUseForNextLevel(const OriginalSt *ost, std::set &mayUseOsts, const StmtNode &stmt, bool isFirstOpnd); void CollectMayUseForCallOpnd(const StmtNode &stmt, std::set &mayUseOsts); - void InsertMayDefNodeForCall(std::set &mayDefOsts, TypeOfMayDefList &mayDefNodes, + void InsertMayDefNodeForCall(std::set &mayDefOsts, AccessSSANodes *ssaPart, StmtNode &stmt, BBId bbid, bool hasNoPrivateDefEffect); void InsertMayUseExpr(BaseNode &expr); void CollectMayUseFromGlobalsAffectedByCalls(std::set &mayUseOsts); void CollectMayUseFromNADS(std::set &mayUseOsts); void CollectMayUseFromDefinedFinalField(std::set &mayUseOsts); - void InsertMayUseNode(std::set &mayUseOsts, TypeOfMayUseList &mayUseNodes); + void InsertMayUseNode(std::set &mayUseOsts, AccessSSANodes *ssaPart); void InsertMayUseReturn(const StmtNode &stmt); void CollectPtsToOfReturnOpnd(const OriginalSt &ost, std::set &mayUseOsts); void InsertReturnOpndMayUse(const StmtNode &stmt); void InsertMayUseAll(const StmtNode &stmt); void CollectMayDefForDassign(const StmtNode &stmt, std::set &mayDefOsts); - void InsertMayDefNode(std::set &mayDefOsts, TypeOfMayDefList &mayDefNodes, StmtNode &stmt, BBId bbid); + void InsertMayDefNode(std::set &mayDefOsts, AccessSSANodes *ssaPart, StmtNode &stmt, BBId bbid); void InsertMayDefDassign(StmtNode &stmt, BBId bbid); bool IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, FieldID fldB) const; void CollectMayDefForIassign(StmtNode &stmt, std::set &mayDefOsts); - void InsertMayDefNodeExcludeFinalOst(std::set &mayDefOsts, TypeOfMayDefList &mayDefNodes, + void InsertMayDefNodeExcludeFinalOst(std::set &mayDefOsts, AccessSSANodes *ssaPart, StmtNode &stmt, BBId bbid); void InsertMayDefIassign(StmtNode &stmt, BBId bbid); void InsertMayDefUseSyncOps(StmtNode &stmt, BBId bbid); - void InsertMayUseNodeExcludeFinalOst(const std::set &mayUseOsts, TypeOfMayUseList &mayUseNodes); + void InsertMayUseNodeExcludeFinalOst(const std::set &mayUseOsts, AccessSSANodes *ssaPart); void InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbid); void InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt, BBId bbid); virtual BB *GetBB(BBId id) = 0; diff --git a/src/mapleall/maple_me/include/ssa_mir_nodes.h b/src/mapleall/maple_me/include/ssa_mir_nodes.h index 6b5af97e954732db7e89d26bacdd9b69bd00b6ae..46ecedac7e19a56a3876f82bb466b39862a753c9 100644 --- a/src/mapleall/maple_me/include/ssa_mir_nodes.h +++ b/src/mapleall/maple_me/include/ssa_mir_nodes.h @@ -62,6 +62,10 @@ class MayDefNode { LogInfo::MapleLogger() << ")\n"; } + bool operator==(const MayDefNode &other) const { + return opnd == other.opnd && result == other.result && stmt == other.stmt; + } + VersionSt *base = nullptr; // only provided if indirectLev is 1 and attached to iassign private: VersionSt *opnd; @@ -89,6 +93,10 @@ class MayUseNode { LogInfo::MapleLogger() << ")"; } + bool operator==(const MayUseNode &other) const { + return opnd == other.opnd; + } + private: VersionSt *opnd; }; @@ -191,9 +199,24 @@ class AccessSSANodes { } } - virtual void InsertMayDefNode(VersionSt *vst, StmtNode *stmtNode) { - CHECK_FATAL(vst != nullptr, "null ptr check"); - GetMayDefNodes().emplace_back(MayDefNode(vst, stmtNode)); + void InsertMayDefNode(VersionSt *vst, StmtNode *stmtNode) { + ASSERT(vst != nullptr, "null ptr check"); + auto &mayDefNodes = GetMayDefNodes(); + MayDefNode mayDefNode(vst, stmtNode); + if (std::find(mayDefNodes.begin(), mayDefNodes.end(), mayDefNode) != mayDefNodes.end()) { + return; + } + mayDefNodes.emplace_back(mayDefNode); + } + + void InsertMayUseNode(VersionSt *vst) { + ASSERT(vst != nullptr, "null ptr check"); + auto &mayUseNodes = GetMayUseNodes(); + MayUseNode mayUseNode(vst); + if (std::find(mayUseNodes.begin(), mayUseNodes.end(), mayUseNode) != mayUseNodes.end()) { + return; + } + mayUseNodes.emplace_back(mayUseNode); } virtual void InsertMustDefNode(VersionSt *sym, StmtNode *s) { diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index 05e0396eb9ab0fc017e31d2dea30f4bee08ce305..f2ef7a2542946f4b1ca743431f2317ac7b4e7927 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -1254,10 +1254,10 @@ void AliasClass::CollectMayUseFromDefinedFinalField(std::set &mayUs } // insert the ost of mayUseOsts into mayUseNodes -void AliasClass::InsertMayUseNode(std::set &mayUseOsts, TypeOfMayUseList &mayUseNodes) { +void AliasClass::InsertMayUseNode(std::set &mayUseOsts, AccessSSANodes *ssaPart) { for (OriginalSt *ost : mayUseOsts) { - mayUseNodes.emplace_back( - MayUseNode(ssaTab.GetVersionStTable().GetVersionStVectorItem(ost->GetZeroVersionIndex()))); + ssaPart->InsertMayUseNode( + ssaTab.GetVersionStTable().GetVersionStVectorItem(ost->GetZeroVersionIndex())); } } @@ -1276,8 +1276,8 @@ void AliasClass::InsertMayUseReturn(const StmtNode &stmt) { if (mirModule.CurFunction()->IsConstructor()) { CollectMayUseFromDefinedFinalField(mayUseOsts); } - TypeOfMayUseList &mayUseNodes = ssaTab.GetStmtsSSAPart().GetMayUseNodesOf(stmt); - InsertMayUseNode(mayUseOsts, mayUseNodes); + auto *ssaPart = ssaTab.GetStmtsSSAPart().SSAPartOf(stmt); + InsertMayUseNode(mayUseOsts, ssaPart); } // collect next_level_nodes of the ost of ReturnOpnd into mayUseOsts @@ -1316,8 +1316,8 @@ void AliasClass::InsertReturnOpndMayUse(const StmtNode &stmt) { } } // insert mayUses - TypeOfMayUseList &mayUseNodes = ssaTab.GetStmtsSSAPart().GetMayUseNodesOf(stmt); - InsertMayUseNode(mayUseOsts, mayUseNodes); + auto *ssaPart = ssaTab.GetStmtsSSAPart().SSAPartOf(stmt); + InsertMayUseNode(mayUseOsts, ssaPart); } } } @@ -1386,11 +1386,11 @@ void AliasClass::CollectMayDefForDassign(const StmtNode &stmt, std::set &mayDefOsts, TypeOfMayDefList &mayDefNodes, +void AliasClass::InsertMayDefNode(std::set &mayDefOsts, AccessSSANodes *ssaPart, StmtNode &stmt, BBId bbid) { for (OriginalSt *mayDefOst : mayDefOsts) { - mayDefNodes.emplace_back( - MayDefNode(ssaTab.GetVersionStTable().GetVersionStVectorItem(mayDefOst->GetZeroVersionIndex()), &stmt)); + ssaPart->InsertMayDefNode( + ssaTab.GetVersionStTable().GetVersionStVectorItem(mayDefOst->GetZeroVersionIndex()), &stmt); ssaTab.AddDefBB4Ost(mayDefOst->GetIndex(), bbid); } } @@ -1398,8 +1398,7 @@ void AliasClass::InsertMayDefNode(std::set &mayDefOsts, TypeOfMayDe void AliasClass::InsertMayDefDassign(StmtNode &stmt, BBId bbid) { std::set mayDefOsts; CollectMayDefForDassign(stmt, mayDefOsts); - TypeOfMayDefList &mayDefNodes = ssaTab.GetStmtsSSAPart().GetMayDefNodesOf(stmt); - InsertMayDefNode(mayDefOsts, mayDefNodes, stmt, bbid); + InsertMayDefNode(mayDefOsts, ssaTab.GetStmtsSSAPart().SSAPartOf(stmt), stmt, bbid); } bool AliasClass::IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, FieldID fldB) const { @@ -1486,12 +1485,12 @@ void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set & } void AliasClass::InsertMayDefNodeExcludeFinalOst(std::set &mayDefOsts, - TypeOfMayDefList &mayDefNodes, StmtNode &stmt, + AccessSSANodes *ssaPart, StmtNode &stmt, BBId bbid) { for (OriginalSt *mayDefOst : mayDefOsts) { if (!mayDefOst->IsFinal()) { - mayDefNodes.emplace_back( - MayDefNode(ssaTab.GetVersionStTable().GetVersionStVectorItem(mayDefOst->GetZeroVersionIndex()), &stmt)); + ssaPart->InsertMayDefNode( + ssaTab.GetVersionStTable().GetVersionStVectorItem(mayDefOst->GetZeroVersionIndex()), &stmt); ssaTab.AddDefBB4Ost(mayDefOst->GetIndex(), bbid); } } @@ -1500,12 +1499,14 @@ void AliasClass::InsertMayDefNodeExcludeFinalOst(std::set &mayDefOs void AliasClass::InsertMayDefIassign(StmtNode &stmt, BBId bbid) { std::set mayDefOsts; CollectMayDefForIassign(stmt, mayDefOsts); - TypeOfMayDefList &mayDefNodes = ssaTab.GetStmtsSSAPart().GetMayDefNodesOf(stmt); + auto *ssaPart = ssaTab.GetStmtsSSAPart().SSAPartOf(stmt); if (mayDefOsts.size() == 1) { - InsertMayDefNode(mayDefOsts, mayDefNodes, stmt, bbid); + InsertMayDefNode(mayDefOsts, ssaPart, stmt, bbid); } else { - InsertMayDefNodeExcludeFinalOst(mayDefOsts, mayDefNodes, stmt, bbid); + InsertMayDefNodeExcludeFinalOst(mayDefOsts, ssaPart, stmt, bbid); } + + TypeOfMayDefList &mayDefNodes = ssaTab.GetStmtsSSAPart().GetMayDefNodesOf(stmt); ASSERT(!mayDefNodes.empty(), "AliasClass::InsertMayUseIassign(): iassign cannot have empty maydef"); // go thru inserted MayDefNode to add the base info TypeOfMayDefList::iterator it = mayDefNodes.begin(); @@ -1661,13 +1662,13 @@ void AliasClass::CollectMayUseForCallOpnd(const StmtNode &stmt, std::set &mayDefOsts, TypeOfMayDefList &mayDefNodes, +void AliasClass::InsertMayDefNodeForCall(std::set &mayDefOsts, AccessSSANodes *ssaPart, StmtNode &stmt, BBId bbid, bool hasNoPrivateDefEffect) { for (OriginalSt *mayDefOst : mayDefOsts) { if (!hasNoPrivateDefEffect || !mayDefOst->IsPrivate()) { - mayDefNodes.emplace_back( - MayDefNode(ssaTab.GetVersionStTable().GetVersionStVectorItem(mayDefOst->GetZeroVersionIndex()), &stmt)); + ssaPart->InsertMayDefNode( + ssaTab.GetVersionStTable().GetVersionStVectorItem(mayDefOst->GetZeroVersionIndex()), &stmt); ssaTab.AddDefBB4Ost(mayDefOst->GetIndex(), bbid); } } @@ -1683,33 +1684,33 @@ void AliasClass::InsertMayDefUseCall(StmtNode &stmt, BBId bbid, bool hasSideEffe CollectMayUseForCallOpnd(stmt, mayDefUseOstsA); // 2. collect mayDefs and mayUses caused by not_all_def_seen_ae CollectMayUseFromNADS(mayDefUseOstsA); - InsertMayUseNode(mayDefUseOstsA, theSSAPart->GetMayUseNodes()); + InsertMayUseNode(mayDefUseOstsA, theSSAPart); // insert may def node, if the callee has side-effect. if (hasSideEffect) { - InsertMayDefNodeForCall(mayDefUseOstsA, theSSAPart->GetMayDefNodes(), stmt, bbid, hasNoPrivateDefEffect); + InsertMayDefNodeForCall(mayDefUseOstsA, theSSAPart, stmt, bbid, hasNoPrivateDefEffect); } // 3. insert mayDefs and mayUses caused by globalsAffectedByCalls std::set mayDefUseOstsB; CollectMayUseFromGlobalsAffectedByCalls(mayDefUseOstsB); - InsertMayUseNode(mayDefUseOstsB, theSSAPart->GetMayUseNodes()); + InsertMayUseNode(mayDefUseOstsB, theSSAPart); // insert may def node, if the callee has side-effect. if (hasSideEffect) { - InsertMayDefNodeExcludeFinalOst(mayDefUseOstsB, theSSAPart->GetMayDefNodes(), stmt, bbid); + InsertMayDefNodeExcludeFinalOst(mayDefUseOstsB, theSSAPart, stmt, bbid); if (kOpcodeInfo.IsCallAssigned(stmt.GetOpCode())) { // 4. insert mayDefs caused by the mustDefs std::set mayDefOstsC; CollectMayDefForMustDefs(stmt, mayDefOstsC); - InsertMayDefNodeExcludeFinalOst(mayDefOstsC, theSSAPart->GetMayDefNodes(), stmt, bbid); + InsertMayDefNodeExcludeFinalOst(mayDefOstsC, theSSAPart, stmt, bbid); } } } void AliasClass::InsertMayUseNodeExcludeFinalOst(const std::set &mayUseOsts, - TypeOfMayUseList &mayUseNodes) { + AccessSSANodes *ssaPart) { for (OriginalSt *mayUseOst : mayUseOsts) { if (!mayUseOst->IsFinal()) { - mayUseNodes.emplace_back( - MayUseNode(ssaTab.GetVersionStTable().GetVersionStVectorItem(mayUseOst->GetZeroVersionIndex()))); + ssaPart->InsertMayUseNode( + ssaTab.GetVersionStTable().GetVersionStVectorItem(mayUseOst->GetZeroVersionIndex())); } } } @@ -1734,28 +1735,28 @@ void AliasClass::InsertMayDefUseIntrncall(StmtNode &stmt, BBId bbid) { CollectMayUseFromNADS(mayDefUseOsts); // 3. collect mayDefs and mayUses caused by globalsAffectedByCalls CollectMayUseFromGlobalsAffectedByCalls(mayDefUseOsts); - InsertMayUseNodeExcludeFinalOst(mayDefUseOsts, theSSAPart->GetMayUseNodes()); + InsertMayUseNodeExcludeFinalOst(mayDefUseOsts, theSSAPart); if (!intrinDesc->HasNoSideEffect() || calleeHasSideEffect) { - InsertMayDefNodeExcludeFinalOst(mayDefUseOsts, theSSAPart->GetMayDefNodes(), stmt, bbid); + InsertMayDefNodeExcludeFinalOst(mayDefUseOsts, theSSAPart, stmt, bbid); } if (kOpcodeInfo.IsCallAssigned(stmt.GetOpCode())) { // 4. insert maydefs caused by the mustdefs std::set mayDefOsts; CollectMayDefForMustDefs(stmt, mayDefOsts); - InsertMayDefNodeExcludeFinalOst(mayDefOsts, theSSAPart->GetMayDefNodes(), stmt, bbid); + InsertMayDefNodeExcludeFinalOst(mayDefOsts, theSSAPart, stmt, bbid); } } void AliasClass::InsertMayDefUseClinitCheck(IntrinsiccallNode &stmt, BBId bbid) { - TypeOfMayDefList &mayDefNodes = ssaTab.GetStmtsSSAPart().GetMayDefNodesOf(stmt); + auto *ssaPart = ssaTab.GetStmtsSSAPart().SSAPartOf(stmt); for (OStIdx ostIdx : globalsMayAffectedByClinitCheck) { AliasElem *aliasElem = osym2Elem[ostIdx]; OriginalSt &ostOfAE = aliasElem->GetOriginalSt(); std::string typeNameOfOst = ostOfAE.GetMIRSymbol()->GetName(); std::string typeNameOfStmt = GlobalTables::GetTypeTable().GetTypeFromTyIdx(stmt.GetTyIdx())->GetName(); if (typeNameOfOst.find(typeNameOfStmt) != std::string::npos) { - mayDefNodes.emplace_back( - MayDefNode(ssaTab.GetVersionStTable().GetVersionStVectorItem(ostOfAE.GetZeroVersionIndex()), &stmt)); + ssaPart->InsertMayDefNode( + ssaTab.GetVersionStTable().GetVersionStVectorItem(ostOfAE.GetZeroVersionIndex()), &stmt); ssaTab.AddDefBB4Ost(ostOfAE.GetIndex(), bbid); } }