diff --git a/src/mapleall/maple_ir/src/mir_type.cpp b/src/mapleall/maple_ir/src/mir_type.cpp index 10e20ecabb6948ee78ee3ed4c379d02ad3f6b73d..0de4963d21c8d55d06df33c860676e0200f3e455 100644 --- a/src/mapleall/maple_ir/src/mir_type.cpp +++ b/src/mapleall/maple_ir/src/mir_type.cpp @@ -1569,7 +1569,7 @@ int64 MIRArrayType::GetBitOffsetFromArrayAddress(std::vector &indexArray) } elemsize = RoundUp(elemsize, typeAttrs.GetAlign()); constexpr int64 bitsPerByte = 8; - int64 offset = sum * static_cast(elemsize) * bitsPerByte; + int64 offset = static_cast(sum) * elemsize * static_cast(bitsPerByte); if (GetElemType()->GetKind() == kTypeArray && indexArray.size() > dim) { std::vector subIndexArray(indexArray.begin() + dim, indexArray.end()); offset += static_cast(GetElemType())->GetBitOffsetFromArrayAddress(subIndexArray); diff --git a/src/mapleall/maple_me/include/orig_symbol.h b/src/mapleall/maple_me/include/orig_symbol.h index d79af85c19e1bf7185132b05f24fc68014dc77b9..1bc285a04aa7dcd747c914130a4d1980a404567e 100644 --- a/src/mapleall/maple_me/include/orig_symbol.h +++ b/src/mapleall/maple_me/include/orig_symbol.h @@ -323,6 +323,7 @@ class OriginalSt { bool epreLocalRefVar = false; // is a localrefvar temp created by epre phase public: bool isPtrWithIncDec = false; // is a pointer with self-increment/decrement + bool storesIVInitValue = false; // temp created to store IV's initial value private: SymOrPreg symOrPreg; PUIdx puIdx; diff --git a/src/mapleall/maple_me/src/lfo_iv_canon.cpp b/src/mapleall/maple_me/src/lfo_iv_canon.cpp index 8a19db1990e80bd450a15ddbcd21e495950b76a9..37f4f803206b41ce1b50b3666ab4ff55e14a74b5 100644 --- a/src/mapleall/maple_me/src/lfo_iv_canon.cpp +++ b/src/mapleall/maple_me/src/lfo_iv_canon.cpp @@ -375,6 +375,7 @@ void IVCanon::CanonEntryValues() { initName.append(".init"); GStrIdx strIdx = GlobalTables::GetStrTable().GetOrCreateStrIdxFromName(initName); ScalarMeExpr *scalarMeExpr = func->GetIRMap()->CreateNewVar(strIdx, ivdesc->primType, false); + scalarMeExpr->GetOst()->storesIVInitValue = true; #else // create preg ScalarMeExpr *scalarmeexpr = func->irMap->CreateRegMeExpr(ivdesc->primType); #endif diff --git a/src/mapleall/maple_me/src/prop.cpp b/src/mapleall/maple_me/src/prop.cpp index 85bff5ced6acd7aa16cd4f80af4dac2fefd09673..2a4bb199d9091c759a3872abdb7deacc0c27cfa6 100644 --- a/src/mapleall/maple_me/src/prop.cpp +++ b/src/mapleall/maple_me/src/prop.cpp @@ -645,7 +645,11 @@ MeExpr &Prop::PropVar(VarMeExpr &varMeExpr, bool atParm, bool checkPhi) { DassignMeStmt *defStmt = static_cast(varMeExpr.GetDefStmt()); ASSERT(defStmt != nullptr, "dynamic cast result is nullptr"); MeExpr *rhs = defStmt->GetRHS(); - if (rhs->GetDepth() > kPropTreeLevel) { + uint32 treeLevelLimitUsed = kPropTreeLevel; + if (varMeExpr.GetOst()->storesIVInitValue) { + treeLevelLimitUsed = treeLevelLimitUsed >> 2; + } + if (rhs->GetDepth() > treeLevelLimitUsed) { return varMeExpr; } if (rhs->GetOp() == OP_select) {