From 11b1d029b984cb99d0522de10c4083c92ce9ec65 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 26 Aug 2021 14:48:29 -0700 Subject: [PATCH] In deptest phase, tolerate arrays with less subscripts than dimension Guard against SIMD types in irmap's simplification routines. Fixed a coding bug in prop.cpp. --- src/mapleall/maple_me/src/irmap.cpp | 15 +++++++++++++++ src/mapleall/maple_me/src/lfo_dep_test.cpp | 11 +++++++---- src/mapleall/maple_me/src/prop.cpp | 4 ++-- 3 files changed, 24 insertions(+), 6 deletions(-) diff --git a/src/mapleall/maple_me/src/irmap.cpp b/src/mapleall/maple_me/src/irmap.cpp index 59dabaef4c..5bba73d169 100644 --- a/src/mapleall/maple_me/src/irmap.cpp +++ b/src/mapleall/maple_me/src/irmap.cpp @@ -779,6 +779,9 @@ static bool IgnoreInnerTypeCvt(PrimType typeA, PrimType typeB, PrimType typeC) { // return nullptr if the result is unknow MeExpr *IRMap::SimplifyCompareSameExpr(OpMeExpr *opmeexpr) { + if (!IsPrimitivePureScalar(opmeexpr->GetPrimType())) { + return nullptr; + } CHECK_FATAL(opmeexpr->GetOpnd(0) == opmeexpr->GetOpnd(1), "must be"); Opcode opop = opmeexpr->GetOp(); int64 val = 0; @@ -925,6 +928,9 @@ MeExpr *IRMap::FoldConstExpr(PrimType primType, Opcode op, ConstMeExpr *opndA, C } MeExpr *IRMap::SimplifyAddExpr(OpMeExpr *addExpr) { + if (!IsPrimitivePureScalar(addExpr->GetPrimType())) { + return nullptr; + } if (addExpr->GetOp() != OP_add) { return nullptr; } @@ -1025,6 +1031,9 @@ MeExpr *IRMap::SimplifyAddExpr(OpMeExpr *addExpr) { } MeExpr *IRMap::SimplifyMulExpr(OpMeExpr *mulExpr) { + if (!IsPrimitivePureScalar(mulExpr->GetPrimType())) { + return nullptr; + } if (mulExpr->GetOp() != OP_mul) { return nullptr; } @@ -1181,6 +1190,9 @@ bool IRMap::IfMeExprIsU1Type(const MeExpr *expr) const { } MeExpr *IRMap::SimplifyOpMeExpr(OpMeExpr *opmeexpr) { + if (!IsPrimitivePureScalar(opmeexpr->GetPrimType())) { + return nullptr; + } Opcode opop = opmeexpr->GetOp(); MeExpr *simpleCast = SimplifyCast(opmeexpr); if (simpleCast != nullptr) { @@ -1473,6 +1485,9 @@ MeExpr *IRMap::SimplifyOpMeExpr(OpMeExpr *opmeexpr) { } MeExpr *IRMap::SimplifyMeExpr(MeExpr *x) { + if (!IsPrimitivePureScalar(x->GetPrimType())) { + return x; + } switch (x->GetMeOp()) { case kMeOpAddrof: case kMeOpAddroffunc: diff --git a/src/mapleall/maple_me/src/lfo_dep_test.cpp b/src/mapleall/maple_me/src/lfo_dep_test.cpp index ef64b0c84f..6fa22174b8 100644 --- a/src/mapleall/maple_me/src/lfo_dep_test.cpp +++ b/src/mapleall/maple_me/src/lfo_dep_test.cpp @@ -206,7 +206,7 @@ ArrayAccessDesc *DoloopInfo::BuildOneArrayAccessDesc(ArrayNode *arr, BaseNode *p ASSERT(atype->GetKind() == kTypeArray, "type was wrong"); MIRArrayType *arryty = static_cast(atype); size_t dim = arryty->GetDim(); - CHECK_FATAL(dim == arr->NumOpnds() - 1, "BuildOneArrayAccessDesc: inconsistent array dimension"); + 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))) { @@ -242,7 +242,7 @@ ArrayAccessDesc *DoloopInfo::BuildOneArrayAccessDesc(ArrayNode *arr, BaseNode *p } else { rhsArrays.push_back(arrDesc); } - for (size_t i = 0; i < dim; i++) { + for (size_t i = 0; i < arr->NumOpnds()-1; i++) { SubscriptDesc *subs = BuildOneSubscriptDesc(arr->GetIndex(i)); arrDesc->subscriptVec.push_back(subs); } @@ -372,8 +372,11 @@ void DoloopInfo::TestDependences(MapleVector *depTestList, bool bot } else { arrDesc2 = rhsArrays[testPair->depTestPair.second]; } - CHECK_FATAL(arrDesc1->subscriptVec.size() == arrDesc2->subscriptVec.size(), - "TestDependences: inconsistent array dimension"); + if (arrDesc1->subscriptVec.size() == arrDesc2->subscriptVec.size()) { + testPair->dependent = true; + testPair->unknownDist = true; + continue; + } for (j = 0; j < arrDesc1->subscriptVec.size(); j++) { SubscriptDesc *subs1 = arrDesc1->subscriptVec[j]; SubscriptDesc *subs2 = arrDesc2->subscriptVec[j]; diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index 51330f66ba..f422e407f3 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -510,9 +510,9 @@ MeExpr *Prop::RehashUsingInverse(MeExpr *x) { naryx->GetNumOpnds(), naryx->GetTyIdx(), naryx->GetIntrinsic(), naryx->GetBoundCheck()); for (i = 0; i < naryx->GetNumOpnds(); i++) { if (results[i] != nullptr) { - newnaryx.SetOpnd(i, results[i]); + newnaryx.PushOpnd(results[i]); } else { - newnaryx.SetOpnd(i, naryx->GetOpnd(i)); + newnaryx.PushOpnd(naryx->GetOpnd(i)); } } return irMap.HashMeExpr(newnaryx); -- Gitee