diff --git a/src/mapleall/maple_me/src/irmap.cpp b/src/mapleall/maple_me/src/irmap.cpp index 8a84820e3be783800d6af3ee8a9711ea8985f4e0..ec3d08761bd3b3334a93f0eb92821347de78c5da 100644 --- a/src/mapleall/maple_me/src/irmap.cpp +++ b/src/mapleall/maple_me/src/irmap.cpp @@ -294,6 +294,7 @@ MeExpr* IRMap::SimplifyIvarWithConstOffset(IvarMeExpr *ivar, bool lhsIvar) { ScalarMeExpr *ptrVar = dynamic_cast(foundTerminal.second); MeExpr *newBase = nullptr; int32 offsetVal = 0; + bool dontRecurse = false; if ((ptrVar == nullptr || ptrVar->GetOst()->isPtrWithIncDec)) { // get offset value auto *mirConst = static_cast(offsetNode)->GetConstVal(); @@ -307,6 +308,7 @@ MeExpr* IRMap::SimplifyIvarWithConstOffset(IvarMeExpr *ivar, bool lhsIvar) { newBase = base->GetOpnd(0); offsetVal = offset.val; } else { + dontRecurse = true; offsetVal = ivar->GetOffset(); // reassociate the base expression such that the constant is added directly to ptrVar MeExpr *newAddSub = CreateMeExprBinary(base->GetOp(), ptrVar->GetPrimType(), *ptrVar, *offsetNode); @@ -324,24 +326,31 @@ MeExpr* IRMap::SimplifyIvarWithConstOffset(IvarMeExpr *ivar, bool lhsIvar) { } } Opcode op = (offsetVal == 0) ? OP_iread : OP_ireadoff; + IvarMeExpr *formedIvar = nullptr; if (lhsIvar) { - auto *meDef = New(exprID++, ivar->GetPrimType(), ivar->GetTyIdx(), ivar->GetFieldID(), op); - meDef->SetBase(newBase); - meDef->SetOffset(offsetVal); - meDef->SetMuVal(ivar->GetMu()); - meDef->SetVolatileFromBaseSymbol(ivar->GetVolatileFromBaseSymbol()); - PutToBucket(meDef->GetHashIndex() % mapHashLength, *meDef); - meDef->simplifiedWithConstOffset = true; - return meDef; + formedIvar = New(exprID++, ivar->GetPrimType(), ivar->GetTyIdx(), ivar->GetFieldID(), op); + formedIvar->SetBase(newBase); + formedIvar->SetOffset(offsetVal); + formedIvar->SetMuVal(ivar->GetMu()); + formedIvar->SetVolatileFromBaseSymbol(ivar->GetVolatileFromBaseSymbol()); + PutToBucket(formedIvar->GetHashIndex() % mapHashLength, *formedIvar); } else { IvarMeExpr newIvar(kInvalidExprID, ivar->GetPrimType(), ivar->GetTyIdx(), ivar->GetFieldID(), op); newIvar.SetBase(newBase); newIvar.SetOffset(offsetVal); newIvar.SetMuVal(ivar->GetMu()); newIvar.SetVolatileFromBaseSymbol(ivar->GetVolatileFromBaseSymbol()); - IvarMeExpr *formedIvar = static_cast(HashMeExpr(newIvar)); + formedIvar = static_cast(HashMeExpr(newIvar)); + } + IvarMeExpr *nextSimplifiedIvar = nullptr; + if (!dontRecurse) { + nextSimplifiedIvar = static_cast(SimplifyIvarWithConstOffset(formedIvar, lhsIvar)); + } + if (nextSimplifiedIvar == nullptr) { formedIvar->simplifiedWithConstOffset = true; return formedIvar; + } else { + return nextSimplifiedIvar; } } } diff --git a/src/mapleall/maple_me/src/me_ivopts.cpp b/src/mapleall/maple_me/src/me_ivopts.cpp index 5c1c623ef5be531fed3470b86c85580bf029a2fe..08a23738818f3231570304a1ec183f8f2bc6eaf3 100644 --- a/src/mapleall/maple_me/src/me_ivopts.cpp +++ b/src/mapleall/maple_me/src/me_ivopts.cpp @@ -1503,10 +1503,10 @@ MeExpr *IVOptimizer::ComputeExtraExprOfBase(MeExpr &candBase, MeExpr &groupBase, : irMap->CreateMeExprBinary(OP_add, ptyp, *extraExpr, *expr); } } - if (groupConst - candConst == 0) { + if (static_cast(groupConst) - static_cast(candConst) == 0) { return extraExpr; } - auto *constExpr = irMap->CreateIntConstMeExpr(groupConst - candConst, ptyp); + auto *constExpr = irMap->CreateIntConstMeExpr(static_cast(groupConst) - static_cast(candConst), ptyp); extraExpr = extraExpr == nullptr ? constExpr : irMap->CreateMeExprBinary(OP_add, ptyp, *extraExpr, *constExpr); return extraExpr; diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index 15f84daa817be2ff7eef65162a80f1caaa142080..a80c03ed916fe085633221a78c968508178807fe 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -15,7 +15,6 @@ #include "prop.h" #include "me_irmap.h" #include "dominance.h" -#include "constantfold.h" #define JAVALANG (mirModule.IsJavaModule())