From db3cb78969edb0ace20712425c477356314567be Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Wed, 1 Sep 2021 09:47:09 -0700 Subject: [PATCH] Fixed bug in irmap_build where insertion of OP_sext was omitted Test case to show the bug: unsigned char u8 = 0x80; signed char i8 = 0x80; int main() { signed char ti8 = u8; if (ti8 != 0xffffff80) abort(); } --- src/mapleall/maple_me/include/irmap_build.h | 2 +- src/mapleall/maple_me/src/irmap_build.cpp | 23 ++++++++++++++++----- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/src/mapleall/maple_me/include/irmap_build.h b/src/mapleall/maple_me/include/irmap_build.h index be4e09a086..0f0e321f9c 100644 --- a/src/mapleall/maple_me/include/irmap_build.h +++ b/src/mapleall/maple_me/include/irmap_build.h @@ -38,7 +38,7 @@ class IRMapBuild { void BuildBB(BB &bb, std::vector &bbIRMapProcessed); private: - VarMeExpr *GetOrCreateVarFromVerSt(const VersionSt &vst); + VarMeExpr *GetOrCreateVarFromVerSt(const VersionSt &vst, PrimType ptyp = PTY_unknown); RegMeExpr *GetOrCreateRegFromVerSt(const VersionSt &vst); MeExpr *BuildLHSVar(const VersionSt &vst, DassignMeStmt &defMeStmt); diff --git a/src/mapleall/maple_me/src/irmap_build.cpp b/src/mapleall/maple_me/src/irmap_build.cpp index d14bcdb227..e4ea0accc5 100644 --- a/src/mapleall/maple_me/src/irmap_build.cpp +++ b/src/mapleall/maple_me/src/irmap_build.cpp @@ -29,7 +29,7 @@ static constexpr uint32 kMaxRegParamNum = 8; using MeExprBuildFactory = FunctionFactory; using MeStmtFactory = FunctionFactory; -VarMeExpr *IRMapBuild::GetOrCreateVarFromVerSt(const VersionSt &vst) { +VarMeExpr *IRMapBuild::GetOrCreateVarFromVerSt(const VersionSt &vst, PrimType ptyp) { size_t vindex = vst.GetIndex(); ASSERT(vindex < irMap->verst2MeExprTable.size(), "GetOrCreateVarFromVerSt: index %d is out of range", vindex); MeExpr *meExpr = irMap->verst2MeExprTable.at(vindex); @@ -38,8 +38,11 @@ VarMeExpr *IRMapBuild::GetOrCreateVarFromVerSt(const VersionSt &vst) { } OriginalSt *ost = vst.GetOst(); ASSERT(ost->IsSymbolOst() || ost->GetIndirectLev() > 0, "GetOrCreateVarFromVerSt: wrong ost_type"); - auto *varx = irMap->New(irMap->exprID++, ost, vindex, - GlobalTables::GetTypeTable().GetTypeTable()[ost->GetTyIdx().GetIdx()]->GetPrimType()); + PrimType ptypUsed = GlobalTables::GetTypeTable().GetTypeTable()[ost->GetTyIdx().GetIdx()]->GetPrimType(); + if (GetPrimTypeSize(ptypUsed) < 4 && ptyp != PTY_unknown) { + ptypUsed = ptyp; + } + auto *varx = irMap->New(irMap->exprID++, ost, vindex, ptypUsed); ASSERT(!GlobalTables::GetTypeTable().GetTypeTable().empty(), "container check"); irMap->verst2MeExprTable[vindex] = varx; return varx; @@ -321,9 +324,13 @@ MeExpr *IRMapBuild::BuildExpr(BaseNode &mirNode, bool atParm, bool noProp) { if (op == OP_dread) { auto &addrOfNode = static_cast(mirNode); VersionSt *vst = addrOfNode.GetSSAVar(); - VarMeExpr *varMeExpr = GetOrCreateVarFromVerSt(*vst); + VarMeExpr *varMeExpr = GetOrCreateVarFromVerSt(*vst, mirNode.GetPrimType()); ASSERT(!vst->GetOst()->IsPregOst(), "not expect preg symbol here"); - varMeExpr->SetPtyp(GlobalTables::GetTypeTable().GetTypeFromTyIdx(vst->GetOst()->GetTyIdx())->GetPrimType()); + PrimType ptypUsed = GlobalTables::GetTypeTable().GetTypeTable()[vst->GetOst()->GetTyIdx().GetIdx()]->GetPrimType(); + if (GetPrimTypeSize(ptypUsed) < 4) { + ptypUsed = mirNode.GetPrimType(); + } + varMeExpr->SetPtyp(ptypUsed); varMeExpr->GetOst()->SetFieldID(addrOfNode.GetFieldID()); MeExpr *retmeexpr; if (propagater && !noProp) { @@ -337,6 +344,12 @@ MeExpr *IRMapBuild::BuildExpr(BaseNode &mirNode, bool atParm, bool noProp) { retmeexpr = varMeExpr; } uint32 typesize = GetPrimTypeSize(retmeexpr->GetPrimType()); + if (retmeexpr == varMeExpr) { + PrimType varPrimType = GlobalTables::GetTypeTable().GetTypeTable()[varMeExpr->GetOst()->GetTyIdx().GetIdx()]->GetPrimType(); + if (varPrimType != PTY_u1) { // special ciase for PTY_u1 + typesize = GetPrimTypeSize(GlobalTables::GetTypeTable().GetTypeTable()[varMeExpr->GetOst()->GetTyIdx().GetIdx()]->GetPrimType()); + } + } if (typesize < GetPrimTypeSize(addrOfNode.GetPrimType()) && typesize != 0) { // need to insert a convert if (typesize < 4) { -- Gitee