diff --git a/src/mapleall/maple_me/include/alias_class.h b/src/mapleall/maple_me/include/alias_class.h index 0f2a89c156ff3adfa79f1c0a0ff3501dd3c137ef..9486b5d3f544a650f3089ff74ec934b9fed44fd1 100644 --- a/src/mapleall/maple_me/include/alias_class.h +++ b/src/mapleall/maple_me/include/alias_class.h @@ -186,7 +186,7 @@ class AliasClass : public AnalysisResult { bool CallHasSideEffect(StmtNode *stmt) const; bool CallHasNoPrivateDefEffect(StmtNode *stmt) const; AliasElem *FindOrCreateAliasElem(OriginalSt &ost); - AliasElem *FindOrCreateExtraLevAliasElem(BaseNode &expr, const TyIdx &tyIdx, FieldID fieldId); + AliasElem *FindOrCreateExtraLevAliasElem(BaseNode &expr, const TyIdx &tyIdx, FieldID fieldId, bool typeHasBeenCasted); AliasInfo CreateAliasElemsExpr(BaseNode &expr); void SetNotAllDefsSeenForMustDefs(const StmtNode &callas); void SetPtrOpndNextLevNADS(const BaseNode &opnd, AliasElem *aliasElem, bool hasNoPrivateDefEffect); diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index fc9a81faa54df648891327757de6dceec609cea8..d238963b71144bd6e1a6b5242f1224fb17c06420 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -241,7 +241,7 @@ OriginalSt *AliasClass::FindOrCreateExtraLevOst(SSATab *ssaTab, OriginalSt *prev return ssaTab->FindOrCreateExtraLevOriginalSt(prevLevOst, tyIdx, fld); } -AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode &baseAddress, const TyIdx &tyIdx, FieldID fieldId) { +AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode &baseAddress, const TyIdx &tyIdx, FieldID fieldId, bool typeHasBeenCasted) { auto *baseAddr = RemoveTypeConvertionIfExist(&baseAddress); AliasInfo aliasInfoOfBaseAddress = CreateAliasElemsExpr(*baseAddr); if (aliasInfoOfBaseAddress.ae == nullptr) { @@ -252,7 +252,7 @@ AliasElem *AliasClass::FindOrCreateExtraLevAliasElem(BaseNode &baseAddress, cons } auto newOst = FindOrCreateExtraLevOst(&ssaTab, aliasInfoOfBaseAddress.ae->GetOst(), tyIdx, - aliasInfoOfBaseAddress.fieldID + fieldId, aliasInfoOfBaseAddress.offset); + aliasInfoOfBaseAddress.fieldID + fieldId, typeHasBeenCasted ? OffsetType(kOffsetUnknown) : aliasInfoOfBaseAddress.offset); CHECK_FATAL(newOst != nullptr, "null ptr check"); if (newOst->GetIndex() == osym2Elem.size()) { @@ -311,7 +311,10 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { } case OP_iread: { auto &iread = static_cast(expr); - return AliasInfo(FindOrCreateExtraLevAliasElem(*iread.Opnd(0), iread.GetTyIdx(), iread.GetFieldID()), 0); + MIRType *mirType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(iread.GetTyIdx()); + CHECK_FATAL(mirType->GetKind() == kTypePointer, "CreateAliasElemsExpr: ptr type expected in iread"); + bool typeHasBeenCasted = static_cast(mirType)->GetPointedType()->GetSize() != GetPrimTypeSize(iread.GetPrimType()); + return AliasInfo(FindOrCreateExtraLevAliasElem(*iread.Opnd(0), iread.GetTyIdx(), iread.GetFieldID(), typeHasBeenCasted), 0); } case OP_iaddrof: { auto &iread = static_cast(expr); @@ -630,7 +633,7 @@ void AliasClass::ApplyUnionForCopies(StmtNode &stmt) { auto &iassignNode = static_cast(stmt); AliasInfo rhsAinfo = CreateAliasElemsExpr(*iassignNode.Opnd(1)); AliasElem *lhsAliasElem = - FindOrCreateExtraLevAliasElem(*iassignNode.Opnd(0), iassignNode.GetTyIdx(), iassignNode.GetFieldID()); + FindOrCreateExtraLevAliasElem(*iassignNode.Opnd(0), iassignNode.GetTyIdx(), iassignNode.GetFieldID(), false); if (lhsAliasElem != nullptr) { ApplyUnionForDassignCopy(*lhsAliasElem, rhsAinfo.ae, *iassignNode.Opnd(1)); } @@ -1598,7 +1601,7 @@ bool AliasClass::IsEquivalentField(TyIdx tyIdxA, FieldID fldA, TyIdx tyIdxB, Fie void AliasClass::CollectMayDefForIassign(StmtNode &stmt, std::set &mayDefOsts) { auto &iassignNode = static_cast(stmt); AliasElem *lhsAe = - FindOrCreateExtraLevAliasElem(*iassignNode.Opnd(0), iassignNode.GetTyIdx(), iassignNode.GetFieldID()); + FindOrCreateExtraLevAliasElem(*iassignNode.Opnd(0), iassignNode.GetTyIdx(), iassignNode.GetFieldID(), false); // lhsAe does not alias with any aliasElem if (lhsAe->GetClassSet() == nullptr) {