diff --git a/src/bin/maple b/src/bin/maple index db6799ada744926d1036c08e922d738dbe0ef573..8470a48470ea9e897df890931676b43170341217 100755 Binary files a/src/bin/maple and b/src/bin/maple differ diff --git a/src/deplibs/libmplutil.a b/src/deplibs/libmplutil.a index 627f3c8f7e9c9b2f583ecb0126cd4298d790e259..4dd33a87cbb6b3fed325d08939c28f7bebc38e2d 100644 Binary files a/src/deplibs/libmplutil.a and b/src/deplibs/libmplutil.a differ diff --git a/src/maple_me/include/me_abco.h b/src/maple_me/include/me_abco.h index b8f296e9eb24294d1e0d1a63d03a4ec96dc1f906..65b663360a073c73266bed8241b4b35e144e65e8 100755 --- a/src/maple_me/include/me_abco.h +++ b/src/maple_me/include/me_abco.h @@ -206,7 +206,7 @@ class MeABC { allocator(&pool), inequalityGraph(nullptr), prove(nullptr), - forbidenPi(nullptr) {} + currentCheck(nullptr) {} ~MeABC() = default; void ExecuteABCO(); @@ -239,6 +239,7 @@ class MeABC { ESSABaseNode *GetOrCreateRHSNode(MeExpr &expr); void BuildPhiInGraph(MePhiNode &phi); void BuildSoloPiInGraph(const PiassignMeStmt &piMeStmt); + bool PiExcuteBeforeCurrentCheck(const PiassignMeStmt &piMeStmt); bool BuildArrayCheckInGraph(MeStmt &meStmt); bool BuildBrMeStmtInGraph(MeStmt &meStmt); bool BuildAssignInGraph(MeStmt &meStmt); @@ -249,7 +250,7 @@ class MeABC { void AddCarePhi(MePhiNode &defP); void BuildInequalityGraph(); void FindRedundantABC(MeStmt &meStmt, NaryMeExpr &naryMeExpr); - void InitNewStartPoint(const MeStmt &meStmt, const NaryMeExpr &nMeExpr); + void InitNewStartPoint(MeStmt &meStmt, const NaryMeExpr &nMeExpr); void DeleteABC(); bool CleanABCInStmt(MeStmt &meStmt, NaryMeExpr &naryMeExpr); MeExpr *ReplaceArrayExpr(MeExpr &rhs, MeExpr &naryMeExpr, MeStmt *ivarStmt); @@ -277,7 +278,7 @@ class MeABC { MapleAllocator allocator; std::unique_ptr inequalityGraph; std::unique_ptr prove; - MeStmt *forbidenPi; + MeStmt *currentCheck; std::map arrayChecks; std::map arrayNewChecks; std::set careMeStmts; diff --git a/src/maple_me/src/me_abco.cpp b/src/maple_me/src/me_abco.cpp index 27b87c33317f8b422fc986e9bbec2e3261b8b700..97c3f32ac8dd9d8ed37a68da1bfa8845bb94a780 100755 --- a/src/maple_me/src/me_abco.cpp +++ b/src/maple_me/src/me_abco.cpp @@ -650,11 +650,29 @@ void MeABC::BuildSoloPiInGraph(const PiassignMeStmt &piMeStmt) { (void)inequalityGraph->AddEdge(*piLHSNode, *piRHSNode, 0, EdgeType::kLower); } +bool MeABC::PiExcuteBeforeCurrentCheck(const PiassignMeStmt &piMeStmt) { + BB *currentCheckBB = currentCheck->GetBB(); + BB *piBB = piMeStmt.GetBB(); + if (currentCheckBB != piBB) { + return dom->Dominate(*piBB, *currentCheckBB); + } + MeStmt *lastMeStmt = piBB->GetLastMe(); + CHECK_FATAL(lastMeStmt->GetNextMeStmt() == nullptr, "must be"); + MeStmt *tmpMeStmt = piMeStmt.GetNextMeStmt(); + while (tmpMeStmt != nullptr) { + if (tmpMeStmt == currentCheck) { + return true; + } + tmpMeStmt = tmpMeStmt->GetNextMeStmt(); + } + return false; +} + bool MeABC::BuildArrayCheckInGraph(MeStmt &meStmt) { CHECK_FATAL(meStmt.GetOp() == OP_piassign, "must be"); auto *piMeStmt = static_cast(&meStmt); BuildSoloPiInGraph(*piMeStmt); - if (piMeStmt == forbidenPi) { + if (!PiExcuteBeforeCurrentCheck(*piMeStmt)) { return true; } MeStmt *generatedByMeStmt = piMeStmt->GetGeneratedBy(); @@ -1297,7 +1315,7 @@ void MeABC::DeleteABC() { } } -void MeABC::InitNewStartPoint(const MeStmt &meStmt, const NaryMeExpr &nMeExpr) { +void MeABC::InitNewStartPoint(MeStmt &meStmt, const NaryMeExpr &nMeExpr) { careMeStmts.clear(); careMePhis.clear(); carePoints.clear(); @@ -1324,9 +1342,7 @@ void MeABC::InitNewStartPoint(const MeStmt &meStmt, const NaryMeExpr &nMeExpr) { AddUseDef(*pi->GetLHS()); } } - forbidenPi = meStmt.GetNextMeStmt(); - CHECK_FATAL(forbidenPi != nullptr, "forbidenPi is nullptr"); - CHECK_FATAL(forbidenPi->GetOp() == OP_piassign, "must be"); + currentCheck = &meStmt; } void MeABC::ExecuteABCO() {