From 4c6d35de1d0d9562a1d398a07028e0737d351066 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Tue, 9 Nov 2021 20:19:02 -0800 Subject: [PATCH] Implemented DoloopInfo::IsLoopInvariant2(BaseNode *) which can handle nodes with no corresponding MeExpr --- src/mapleall/maple_me/include/lfo_dep_test.h | 1 + src/mapleall/maple_me/include/lfo_pre_emit.h | 6 ++++- src/mapleall/maple_me/src/lfo_dep_test.cpp | 24 ++++++++++++++++---- src/mapleall/maple_me/src/lfo_loop_vec.cpp | 18 +++++---------- 4 files changed, 31 insertions(+), 18 deletions(-) diff --git a/src/mapleall/maple_me/include/lfo_dep_test.h b/src/mapleall/maple_me/include/lfo_dep_test.h index 2d1ee8db30..245388fa6f 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 6ae76ba942..5184b012f5 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 64444e879c..3c7c1b8e2a 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 e26c5e049e..86c302e9b7 100644 --- a/src/mapleall/maple_me/src/lfo_loop_vec.cpp +++ b/src/mapleall/maple_me/src/lfo_loop_vec.cpp @@ -783,10 +783,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)); @@ -805,8 +803,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; @@ -826,8 +823,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)); } } } @@ -933,8 +929,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) { @@ -959,8 +954,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()); -- Gitee