From cb16e0eb1cc114967b99e0565d4f4378e1218ed6 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 21 Jul 2022 11:10:31 -0700 Subject: [PATCH 1/2] lmbc: when lowering icallproto and the prototype has firstarg_return, update the parameter list of the prototype if needed When lowering dassign to iassignoff, if lhs is agg but rhs non-agg, use the rhs primtype in the iassignoff. --- src/mapleall/maple_me/include/lmbc_lower.h | 1 + src/mapleall/maple_me/src/lmbc_lower.cpp | 41 +++++++++++++++++++--- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/src/mapleall/maple_me/include/lmbc_lower.h b/src/mapleall/maple_me/include/lmbc_lower.h index 385ac8cd4e..0641d0b4cc 100644 --- a/src/mapleall/maple_me/include/lmbc_lower.h +++ b/src/mapleall/maple_me/include/lmbc_lower.h @@ -42,6 +42,7 @@ class LMBCLowerer { void LowerReturn(NaryStmtNode *retNode, BlockNode *newblk); void LowerCall(NaryStmtNode *stmt, BlockNode *newblk); BlockNode *LowerBlock(BlockNode *); + void FixPrototype4FirstArgReturn(IcallNode *icall); void LowerFunction(); MIRModule *mirModule; diff --git a/src/mapleall/maple_me/src/lmbc_lower.cpp b/src/mapleall/maple_me/src/lmbc_lower.cpp index bab9b20c21..39c4a9d1c2 100644 --- a/src/mapleall/maple_me/src/lmbc_lower.cpp +++ b/src/mapleall/maple_me/src/lmbc_lower.cpp @@ -230,9 +230,13 @@ void LMBCLowerer::LowerDassign(DassignNode *dsnode, BlockNode *newblk) { } BaseNode *rhs = LowerExpr(dsnode->Opnd(0)); if (rhs->GetPrimType() != PTY_agg || rhs->GetOpCode() == OP_regread) { + PrimType ptypUsed = symty->GetPrimType(); + if (ptypUsed == PTY_agg) { + ptypUsed = rhs->GetPrimType(); + } if (!symbol->LMBCAllocateOffSpecialReg()) { BaseNode *base = mirBuilder->CreateExprDreadoff(OP_addrofoff, LOWERED_PTR_TYPE, *symbol, 0); - IassignoffNode *iassignoff = mirBuilder->CreateStmtIassignoff(symty->GetPrimType(), + IassignoffNode *iassignoff = mirBuilder->CreateStmtIassignoff(ptypUsed, offset, base, rhs); newblk->AddStatement(iassignoff); return; @@ -240,7 +244,7 @@ void LMBCLowerer::LowerDassign(DassignNode *dsnode, BlockNode *newblk) { PregIdx spcreg = GetSpecialRegFromSt(symbol); if (spcreg == -kSregFp) { IassignFPoffNode *iassignoff = mirBuilder->CreateStmtIassignFPoff(OP_iassignfpoff, - symty->GetPrimType(), + ptypUsed, memlayout->sym_alloc_table[symbol->GetStIndex()].offset + offset, rhs); newblk->AddStatement(iassignoff); } else { @@ -248,7 +252,7 @@ void LMBCLowerer::LowerDassign(DassignNode *dsnode, BlockNode *newblk) { SymbolAlloc &symalloc = symbol->IsLocal() ? memlayout->sym_alloc_table[symbol->GetStIndex()] : globmemlayout->sym_alloc_table[symbol->GetStIndex()]; - IassignoffNode *iassignoff = mirBuilder->CreateStmtIassignoff(symty->GetPrimType(), + IassignoffNode *iassignoff = mirBuilder->CreateStmtIassignoff(ptypUsed, symalloc.offset + offset, rrn, rhs); @@ -424,6 +428,31 @@ void LMBCLowerer::LowerCall(NaryStmtNode *stmt, BlockNode *newblk) { newblk->AddStatement(stmt); } +void LMBCLowerer::FixPrototype4FirstArgReturn(IcallNode *icall) { + MIRFuncType *ftype = static_cast(GlobalTables::GetTypeTable().GetTypeFromTyIdx(icall->GetRetTyIdx())); + if (!ftype->FirstArgReturn()) { + return; + } + MIRType *retType = GlobalTables::GetTypeTable().GetTypeFromTyIdx(ftype->GetRetTyIdx()); + if (retType->GetPrimType() == PTY_void) { + return; + } + // insert return type as fake first parameter + size_t oldSize = ftype->GetParamTypeList().size(); + ftype->GetParamTypeList().push_back(TyIdx(0)); + ftype->GetParamAttrsList().push_back(TypeAttrs()); + for (size_t i = oldSize; i > 0; i--) { + ftype->GetParamTypeList()[i] = ftype->GetParamTypeList()[i-1]; + ftype->GetParamAttrsList()[i] = ftype->GetParamAttrsList()[i-1]; + } + MIRType *newType = GlobalTables::GetTypeTable().GetOrCreatePointerType(ftype->GetRetTyIdx(), GetExactPtrPrimType(), ftype->GetRetAttrs()); + ftype->GetParamTypeList()[0] = newType->GetTypeIndex(); + ftype->GetParamAttrsList()[0] = TypeAttrs(); + // change return type to void + ftype->SetRetTyIdx(GlobalTables::GetTypeTable().GetVoid()->GetTypeIndex()); + ftype->SetRetAttrs(TypeAttrs()); +} + BlockNode *LMBCLowerer::LowerBlock(BlockNode *block) { BlockNode *newblk = mirModule->CurFuncCodeMemPool()->New(); if (!block->GetFirst()) { @@ -460,9 +489,11 @@ BlockNode *LMBCLowerer::LowerBlock(BlockNode *block) { } break; } + case OP_icallproto: + FixPrototype4FirstArgReturn(static_cast(stmt)); + // fall thru case OP_asm: - case OP_call: - case OP_icallproto: { + case OP_call: { LowerCall(static_cast(stmt), newblk); break; } -- Gitee From 72fa9562e4994acd413a30fd9b37443058fbe787 Mon Sep 17 00:00:00 2001 From: Fred Chow Date: Thu, 21 Jul 2022 19:01:02 -0700 Subject: [PATCH 2/2] CGLowerer::LowerExpr() should fix PTY_U1 to PTY_i32 instead of PTY_u8 --- src/mapleall/maple_be/src/be/lower.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/mapleall/maple_be/src/be/lower.cpp b/src/mapleall/maple_be/src/be/lower.cpp index d3e70932fb..bbde064389 100644 --- a/src/mapleall/maple_be/src/be/lower.cpp +++ b/src/mapleall/maple_be/src/be/lower.cpp @@ -2667,7 +2667,7 @@ BaseNode *CGLowerer::LowerExpr(BaseNode &parent, BaseNode &expr, BlockNode &blkN bool isCvtU1Expr = (expr.GetOpCode() == OP_cvt && expr.GetPrimType() == PTY_u1 && static_cast(expr).FromType() != PTY_u1); if (expr.GetPrimType() == PTY_u1) { - expr.SetPrimType(PTY_u8); + expr.SetPrimType(PTY_i32); } if (expr.GetOpCode() == OP_intrinsicopwithtype) { return LowerIntrinsicopwithtype(parent, static_cast(expr), blkNode); -- Gitee