diff --git a/src/mapleall/maple_me/include/lfo_dep_test.h b/src/mapleall/maple_me/include/lfo_dep_test.h index 2e7987edbb1231144facf8ab014486353b5c3f09..8e15f6e8115ced9761f302883fdd2c5bcae65ac1 100644 --- a/src/mapleall/maple_me/include/lfo_dep_test.h +++ b/src/mapleall/maple_me/include/lfo_dep_test.h @@ -43,12 +43,12 @@ class SubscriptDesc{ class ArrayAccessDesc { public: ArrayNode *theArray; - OriginalSt *arrayOst = nullptr; // if null, array base is an invariant expression + MapleSet *arrayOstIdxSet = nullptr; // if null, array base is an invariant expression MapleVector subscriptVec; // describe the subscript of each array dimension - ArrayAccessDesc(MapleAllocator *alloc, ArrayNode *arr, OriginalSt *arryOst) + ArrayAccessDesc(MapleAllocator *alloc, ArrayNode *arr, MapleSet *arryOstSet) : theArray(arr), - arrayOst(arryOst), + arrayOstIdxSet(arryOstSet), subscriptVec(alloc->Adapter()) {} virtual ~ArrayAccessDesc() = default; }; diff --git a/src/mapleall/maple_me/src/lfo_dep_test.cpp b/src/mapleall/maple_me/src/lfo_dep_test.cpp index 5aeeb55e1c64419436c68eb708b025e31056d094..d95bd925e2057ec43b2aefa80424a16afbc1cdbd 100644 --- a/src/mapleall/maple_me/src/lfo_dep_test.cpp +++ b/src/mapleall/maple_me/src/lfo_dep_test.cpp @@ -287,32 +287,36 @@ ArrayAccessDesc *DoloopInfo::BuildOneArrayAccessDesc(ArrayNode *arr, BaseNode *p hasPtrAccess = true; return nullptr; } - // determine arryOst + // determine OStIdx for the array IvarMeExpr *ivarMeExpr = nullptr; - OriginalSt *arryOst = nullptr; + MapleSet *arryOstIdxSet = nullptr; OpMeExpr *arrayMeExpr = static_cast(depInfo->preEmit->GetMexpr(arr)); if (arrayMeExpr == nullptr || arrayMeExpr->GetOp() == OP_add) { // the array is converted from add } else if (parentNode->op == OP_iread) { ivarMeExpr = static_cast(depInfo->preEmit->GetMexpr(parentNode)); CHECK_FATAL(ivarMeExpr->GetMu() != nullptr, "BuildOneArrayAccessDesc: no mu corresponding to iread"); - arryOst = ivarMeExpr->GetMu()->GetOst(); + arryOstIdxSet = alloc->GetMemPool()->New>(alloc->Adapter()); + arryOstIdxSet->insert(ivarMeExpr->GetMu()->GetOst()->GetIndex()); } else if (parentNode->op == OP_iassign) { IassignMeStmt *iassMeStmt = static_cast(depInfo->preEmit-> GetMeStmt(static_cast(parentNode)->GetStmtID())); ivarMeExpr = iassMeStmt->GetLHSVal(); + arryOstIdxSet = alloc->GetMemPool()->New>(alloc->Adapter()); if (ivarMeExpr->GetMu()) { - arryOst = ivarMeExpr->GetMu()->GetOst(); + arryOstIdxSet->insert(ivarMeExpr->GetMu()->GetOst()->GetIndex()); } else { MapleMap *chiList = iassMeStmt->GetChiList(); CHECK_FATAL(!chiList->empty(), "BuildOneArrayAccessDesc: no chi corresponding to iassign"); - arryOst = depInfo->preMeFunc->meFunc->GetMeSSATab()->GetOriginalStFromID(chiList->begin()->first); + for (std::pair mapIt : *chiList) { + arryOstIdxSet->insert(mapIt.first); + } } } else { hasPtrAccess = true; return nullptr; } - ArrayAccessDesc *arrDesc = alloc->GetMemPool()->New(alloc, arr, arryOst); + ArrayAccessDesc *arrDesc = alloc->GetMemPool()->New(alloc, arr, arryOstIdxSet); if (parentNode->op == OP_iassign) { lhsArrays.push_back(arrDesc); } else { @@ -398,15 +402,26 @@ void DoloopInfo::CreateArrayAccessDesc(BlockNode *block) { } } +static bool ArrayOstIdxSetIntersect(MapleSet *set1, MapleSet *set2) { + for (OStIdx oidx1 : *set1) { + for (OStIdx oidx2 : *set2) { + if (oidx1 == oidx2) { + return true; + } + } + } + return false; +} + void DoloopInfo::CreateDepTestLists() { size_t i, j; for (i = 0; i < lhsArrays.size(); ++i) { for (j = i + 1; j < lhsArrays.size(); ++j) { - if (lhsArrays[i]->arrayOst != nullptr && lhsArrays[j]->arrayOst != nullptr) { - if (lhsArrays[i]->arrayOst->IsSameSymOrPreg(lhsArrays[j]->arrayOst)) { + if (lhsArrays[i]->arrayOstIdxSet != nullptr && lhsArrays[j]->arrayOstIdxSet != nullptr) { + if (ArrayOstIdxSetIntersect(lhsArrays[i]->arrayOstIdxSet, lhsArrays[j]->arrayOstIdxSet)) { (void)outputDepTestList.emplace_back(DepTestPair(i, j)); } - } else if (lhsArrays[i]->arrayOst == nullptr && lhsArrays[j]->arrayOst == nullptr) { + } else if (lhsArrays[i]->arrayOstIdxSet == nullptr && lhsArrays[j]->arrayOstIdxSet == nullptr) { BaseNode *arry0 = lhsArrays[i]->theArray->Opnd(0); BaseNode *arry1 = lhsArrays[j]->theArray->Opnd(0); if (depInfo->preEmit->GetMexpr(arry0) == depInfo->preEmit->GetMexpr(arry1)) { @@ -417,11 +432,11 @@ void DoloopInfo::CreateDepTestLists() { } for (i = 0; i < lhsArrays.size(); ++i) { for (j = 0; j < rhsArrays.size(); ++j) { - if (lhsArrays[i]->arrayOst != nullptr && rhsArrays[j]->arrayOst != nullptr) { - if (lhsArrays[i]->arrayOst->IsSameSymOrPreg(rhsArrays[j]->arrayOst)) { + if (lhsArrays[i]->arrayOstIdxSet != nullptr && rhsArrays[j]->arrayOstIdxSet != nullptr) { + if (ArrayOstIdxSetIntersect(lhsArrays[i]->arrayOstIdxSet, rhsArrays[j]->arrayOstIdxSet)) { (void)flowDepTestList.emplace_back(DepTestPair(i, j)); } - } else if (lhsArrays[i]->arrayOst == nullptr && rhsArrays[j]->arrayOst == nullptr) { + } else if (lhsArrays[i]->arrayOstIdxSet == nullptr && rhsArrays[j]->arrayOstIdxSet == nullptr) { BaseNode *arry0 = lhsArrays[i]->theArray->Opnd(0); BaseNode *arry1 = rhsArrays[j]->theArray->Opnd(0); if (depInfo->preEmit->GetMexpr(arry0) == depInfo->preEmit->GetMexpr(arry1)) { @@ -676,10 +691,14 @@ void LfoDepInfo::PerformDepTest() { for (i = 0; i < doloopInfo->lhsArrays.size(); ++i) { ArrayAccessDesc *arrAcc = doloopInfo->lhsArrays[i]; LogInfo::MapleLogger() << "(L" << i << ") "; - if (arrAcc->arrayOst == nullptr) { + if (arrAcc->arrayOstIdxSet == nullptr) { arrAcc->theArray->Opnd(0)->Dump(0); } else { - arrAcc->arrayOst->Dump(); + for (OStIdx oidx : *arrAcc->arrayOstIdxSet) { + OriginalSt *ost = preMeFunc->meFunc->GetMeSSATab()->GetOriginalStFromID(oidx); + ost->Dump(); + LogInfo::MapleLogger() << "| "; + } } LogInfo::MapleLogger() << " subscripts:"; for (SubscriptDesc *subs : arrAcc->subscriptVec) { @@ -704,10 +723,13 @@ void LfoDepInfo::PerformDepTest() { for (i = 0; i < doloopInfo->rhsArrays.size(); ++i) { ArrayAccessDesc *arrAcc = doloopInfo->rhsArrays[i]; LogInfo::MapleLogger() << "(R" << i << ") "; - if (arrAcc->arrayOst == nullptr) { + if (arrAcc->arrayOstIdxSet == nullptr) { arrAcc->theArray->Opnd(0)->Dump(0); } else { - arrAcc->arrayOst->Dump(); + for (OStIdx oidx : *arrAcc->arrayOstIdxSet) { + OriginalSt *ost = preMeFunc->meFunc->GetMeSSATab()->GetOriginalStFromID(oidx); + ost->Dump(); + } } LogInfo::MapleLogger() << " subscripts:"; for (SubscriptDesc *subs : arrAcc->subscriptVec) {