From 9927284766bff18dc25fb498854677bc5c5faf0d Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Fri, 16 Jul 2021 16:42:32 -0700 Subject: [PATCH 1/2] Fixed two alias analysis issues showing in code that does casting at the actual parameter and the call is inlined --- src/mapleall/maple_me/src/alias_class.cpp | 4 ++-- src/mapleall/maple_me/src/orig_symbol.cpp | 3 +++ 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/mapleall/maple_me/src/alias_class.cpp b/src/mapleall/maple_me/src/alias_class.cpp index 17715670c7..f67d4f9227 100644 --- a/src/mapleall/maple_me/src/alias_class.cpp +++ b/src/mapleall/maple_me/src/alias_class.cpp @@ -338,7 +338,7 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { auto *opnd = expr.Opnd(1); if (!opnd->IsConstval() || !IsAddress(expr.GetPrimType())) { - return AliasInfo(aliasInfo.ae, aliasInfo.fieldID, OffsetType::InvalidOffset()); + return AliasInfo(aliasInfo.ae, 0, OffsetType::InvalidOffset()); } auto mirConst = static_cast(opnd)->GetConstVal(); CHECK_FATAL(mirConst->GetKind() == kConstInt, "array index must be integer"); @@ -350,7 +350,7 @@ AliasInfo AliasClass::CreateAliasElemsExpr(BaseNode &expr) { } constexpr int64 bitsPerByte = 8; OffsetType newOffset = aliasInfo.offset + constVal * bitsPerByte; - return AliasInfo(aliasInfo.ae, aliasInfo.fieldID, newOffset); + return AliasInfo(aliasInfo.ae, 0, newOffset); } case OP_array: { for (size_t i = 1; i < expr.NumOpnds(); ++i) { diff --git a/src/mapleall/maple_me/src/orig_symbol.cpp b/src/mapleall/maple_me/src/orig_symbol.cpp index 4e30ce78b3..40482bd131 100644 --- a/src/mapleall/maple_me/src/orig_symbol.cpp +++ b/src/mapleall/maple_me/src/orig_symbol.cpp @@ -204,6 +204,9 @@ OriginalSt *OriginalStTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt * if (mirType->GetKind() == kTypePointer) { const auto *ptType = static_cast(mirType); typeOfExtraLevOst = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptType->GetPointedTyIdxWithFieldID(fld)); + if (typeOfExtraLevOst == nullptr) { + typeOfExtraLevOst = ptType->GetPointedType(); + } if (fld <= ptType->NumberOfFieldIDs()) { offsetOfNextLevOst = offset + ptType->GetPointedType()->GetBitOffsetFromBaseAddr(fld); } -- Gitee From da73109dfebe0e04d02d2a788378bc08be514eae Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 22 Jul 2021 23:12:17 -0700 Subject: [PATCH 2/2] tolerate casting that can result in typeOfExtraLevOst being nullptr in FindOrCreateExtraLevSymOrRegOriginalSt() --- src/mapleall/maple_me/src/orig_symbol.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/mapleall/maple_me/src/orig_symbol.cpp b/src/mapleall/maple_me/src/orig_symbol.cpp index 4e30ce78b3..40482bd131 100644 --- a/src/mapleall/maple_me/src/orig_symbol.cpp +++ b/src/mapleall/maple_me/src/orig_symbol.cpp @@ -204,6 +204,9 @@ OriginalSt *OriginalStTable::FindOrCreateExtraLevSymOrRegOriginalSt(OriginalSt * if (mirType->GetKind() == kTypePointer) { const auto *ptType = static_cast(mirType); typeOfExtraLevOst = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ptType->GetPointedTyIdxWithFieldID(fld)); + if (typeOfExtraLevOst == nullptr) { + typeOfExtraLevOst = ptType->GetPointedType(); + } if (fld <= ptType->NumberOfFieldIDs()) { offsetOfNextLevOst = offset + ptType->GetPointedType()->GetBitOffsetFromBaseAddr(fld); } -- Gitee