diff --git a/src/mapleall/maple_me/include/lfo_dep_test.h b/src/mapleall/maple_me/include/lfo_dep_test.h index 2d1ee8db305d0e78d7b4d2a67a7aaa63ddf7e4e5..245388fa6fef0c1cb4171009916e58ebc5142ce4 100644 --- a/src/mapleall/maple_me/include/lfo_dep_test.h +++ b/src/mapleall/maple_me/include/lfo_dep_test.h @@ -94,6 +94,7 @@ class DoloopInfo { redVars(alloc->Adapter()) {} ~DoloopInfo() = default; bool IsLoopInvariant(MeExpr *x); + bool IsLoopInvariant2(BaseNode *x); bool OnlyInvariantScalars(MeExpr *x); SubscriptDesc *BuildOneSubscriptDesc(BaseNode *subsX); ArrayAccessDesc *BuildOneArrayAccessDesc(ArrayNode *arr, BaseNode *parent); diff --git a/src/mapleall/maple_me/include/lfo_pre_emit.h b/src/mapleall/maple_me/include/lfo_pre_emit.h index 6ae76ba942ff99515f42370792b1f80a926e6e93..5184b012f5ecee9f39e5b0af1a9ff85a6d4aa333 100644 --- a/src/mapleall/maple_me/include/lfo_pre_emit.h +++ b/src/mapleall/maple_me/include/lfo_pre_emit.h @@ -88,7 +88,11 @@ class LfoPreEmitter : public AnalysisResult { return nullptr; } MeExpr *GetMexpr(BaseNode *node) { - LfoPart *lfopart = lfoExprParts[node]; + MapleMap::iterator it = lfoExprParts.find(node); + if (it == lfoExprParts.end()) { + return nullptr; + } + LfoPart *lfopart = it->second; return lfopart->meexpr; } MeStmt *GetMeStmt(uint32_t stmtID) { diff --git a/src/mapleall/maple_me/src/lfo_dep_test.cpp b/src/mapleall/maple_me/src/lfo_dep_test.cpp index 64444e879c89b3bdea455cfc35d74909a410a78b..3c7c1b8e2ae0a31904781d1fbedfff0c30ac8d79 100644 --- a/src/mapleall/maple_me/src/lfo_dep_test.cpp +++ b/src/mapleall/maple_me/src/lfo_dep_test.cpp @@ -128,6 +128,20 @@ bool DoloopInfo::IsLoopInvariant(MeExpr *x) { return false; } +// check if x is loop-invariant w.r.t. the doloop +bool DoloopInfo::IsLoopInvariant2(BaseNode *x) { + MeExpr *meExpr = depInfo->preEmit->GetMexpr(x); + if (meExpr != nullptr) { + return IsLoopInvariant(meExpr); + } + for (size_t i = 0; i < x->NumOpnds(); i++) { + if (!IsLoopInvariant2(x->Opnd(i))) { + return false; + } + } + return true; +} + // check if all the scalars contained in x are loop-invariant unless it is IV bool DoloopInfo::OnlyInvariantScalars(MeExpr *x) { if (x == nullptr) { @@ -182,7 +196,7 @@ bool DoloopInfo::OnlyInvariantScalars(MeExpr *x) { SubscriptDesc *DoloopInfo::BuildOneSubscriptDesc(BaseNode *subsX) { MeExpr *meExpr = depInfo->preEmit->GetMexpr(subsX); SubscriptDesc *subsDesc = alloc->GetMemPool()->New(meExpr); - if (IsLoopInvariant(meExpr)) { + if (IsLoopInvariant2(subsX)) { subsDesc->loopInvariant = true; return subsDesc; } @@ -259,15 +273,15 @@ ArrayAccessDesc *DoloopInfo::BuildOneArrayAccessDesc(ArrayNode *arr, BaseNode *p size_t dim = arryty->GetDim(); CHECK_FATAL(dim >= arr->NumOpnds() - 1, "BuildOneArrayAccessDesc: inconsistent array dimension"); // ensure array base is loop invariant - OpMeExpr *arrayMeExpr = static_cast(depInfo->preEmit->GetMexpr(arr)); - if (!IsLoopInvariant(arrayMeExpr->GetOpnd(0))) { + if (!IsLoopInvariant2(arr->Opnd(0))) { hasPtrAccess = true; return nullptr; } // determine arryOst IvarMeExpr *ivarMeExpr = nullptr; OriginalSt *arryOst = nullptr; - if (arrayMeExpr->GetOp() == OP_add) { // the array is converted from add + OpMeExpr *arrayMeExpr = static_cast(depInfo->preEmit->GetMexpr(arr)); + if (arrayMeExpr == nullptr || arrayMeExpr->GetOp() == OP_add) { // the array is converted from add } else if (parent->op == OP_iread) { ivarMeExpr = static_cast(depInfo->preEmit->GetMexpr(parent)); CHECK_FATAL(ivarMeExpr->GetMu() != nullptr, "BuildOneArrayAccessDesc: no mu corresponding to iread"); @@ -304,7 +318,7 @@ ArrayAccessDesc *DoloopInfo::BuildOneArrayAccessDesc(ArrayNode *arr, BaseNode *p void DoloopInfo::CreateRHSArrayAccessDesc(BaseNode *x, BaseNode *parent) { if (x->GetOpCode() == OP_array) { if (parent->GetOpCode() != OP_iread) { // skip arrays not underneath iread unless loop-invariant - if (IsLoopInvariant(depInfo->preEmit->GetMexpr(x))) { + if (IsLoopInvariant2(x)) { return; } hasPtrAccess = true; diff --git a/src/mapleall/maple_me/src/lfo_loop_vec.cpp b/src/mapleall/maple_me/src/lfo_loop_vec.cpp index 96559906528572dbd4321dfd99dddba68a307d12..1c445ab0e6651e211eb95d8bce6ad94fbf0990b0 100644 --- a/src/mapleall/maple_me/src/lfo_loop_vec.cpp +++ b/src/mapleall/maple_me/src/lfo_loop_vec.cpp @@ -792,10 +792,8 @@ bool LoopVectorization::ExprVectorizable(DoloopInfo *doloopInfo, LoopVecInfo* ve case OP_cmpg: case OP_cmpl: { // check two operands are constant - MeExpr *r0MeExpr = (*lfoExprParts)[x->Opnd(0)]->GetMeExpr(); - MeExpr *r1MeExpr = (*lfoExprParts)[x->Opnd(1)]->GetMeExpr(); - bool r0Uniform = doloopInfo->IsLoopInvariant(r0MeExpr); - bool r1Uniform = doloopInfo->IsLoopInvariant(r1MeExpr); + bool r0Uniform = doloopInfo->IsLoopInvariant2(x->Opnd(0)); + bool r1Uniform = doloopInfo->IsLoopInvariant2(x->Opnd(1)); if (r0Uniform && r1Uniform) { vecInfo->uniformNodes.insert(x->Opnd(0)); vecInfo->uniformNodes.insert(x->Opnd(1)); @@ -814,8 +812,7 @@ bool LoopVectorization::ExprVectorizable(DoloopInfo *doloopInfo, LoopVecInfo* ve case OP_lnot: case OP_neg: case OP_abs: { - MeExpr *r0MeExpr = (*lfoExprParts)[x->Opnd(0)]->GetMeExpr(); - bool r0Uniform = doloopInfo->IsLoopInvariant(r0MeExpr); + bool r0Uniform = doloopInfo->IsLoopInvariant2(x->Opnd(0)); if (r0Uniform) { vecInfo->uniformNodes.insert(x->Opnd(0)); return true; @@ -835,8 +832,7 @@ bool LoopVectorization::ExprVectorizable(DoloopInfo *doloopInfo, LoopVecInfo* ve IreadNode *iread = static_cast(x); if ((iread->GetFieldID() != 0 || MustBeAddress(iread->GetPrimType())) && iread->Opnd(0)->GetOpCode() == OP_array) { - MeExpr *meExpr = depInfo->preEmit->GetLfoExprPart(iread->Opnd(0))->GetMeExpr(); - canVec = doloopInfo->IsLoopInvariant(meExpr); + canVec = doloopInfo->IsLoopInvariant2(iread->Opnd(0)); } } } @@ -945,8 +941,7 @@ bool LoopVectorization::Vectorizable(DoloopInfo *doloopInfo, LoopVecInfo* vecInf bool canVec = ExprVectorizable(doloopInfo, vecInfo, iassign->GetRHS()); if (canVec) { if (iassign->GetFieldID() != 0) { // check base of iassign - MeExpr *meExpr = (*lfoExprParts)[iassign->Opnd(0)]->GetMeExpr(); - canVec = doloopInfo->IsLoopInvariant(meExpr); + canVec = doloopInfo->IsLoopInvariant2(iassign->Opnd(0)); if ((!canVec) && enableDebug) { LogInfo::MapleLogger() << "NOT VECTORIZABLE because of baseaddress is not const with non-zero filedID\n"; } @@ -977,8 +972,7 @@ bool LoopVectorization::Vectorizable(DoloopInfo *doloopInfo, LoopVecInfo* vecInf return false; // need cvt instruction } // rsh is loop invariant - MeExpr *meExpr = (*lfoExprParts)[iassign->GetRHS()]->GetMeExpr(); - if (meExpr && doloopInfo->IsLoopInvariant(meExpr)) { + if (doloopInfo->IsLoopInvariant2(iassign->GetRHS())) { vecInfo->uniformNodes.insert(iassign->GetRHS()); } vecInfo->vecStmtIDs.insert((stmt)->GetStmtID());