From 98cd31ecd2f0e2d494312e53024b3cf76de7edb0 Mon Sep 17 00:00:00 2001 From: William Chen Date: Tue, 30 Mar 2021 16:13:56 -0700 Subject: [PATCH] add missing parmCopy for SelectAggDassign --- .../maple_be/src/cg/aarch64/aarch64_cgfunc.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp index bf465a808d..b8b6171738 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp @@ -1041,13 +1041,19 @@ void AArch64CGFunc::SelectAggDassign(DassignNode &stmt) { rhsAlign = GetBecommon().GetTypeAlign(rhsType->GetTypeIndex()); alignUsed = std::min(lhsAlign, rhsAlign); ASSERT(alignUsed != 0, "expect non-zero"); + bool parmCopy = IsParamStructCopy(*rhsSymbol); for (uint32 i = 0; i < (lhsSize / alignUsed); i++) { /* generate the load */ - Operand &rhsMemOpnd = GetOrCreateMemOpnd(*rhsSymbol, rhsOffset + i * alignUsed, alignUsed * k8BitSize); + Operand *rhsMemOpnd; + if (parmCopy) { + rhsMemOpnd = &LoadStructCopyBase(*rhsSymbol, rhsOffset + i * alignUsed, alignUsed * k8BitSize); + } else { + rhsMemOpnd = &GetOrCreateMemOpnd(*rhsSymbol, rhsOffset + i * alignUsed, alignUsed * k8BitSize); + } regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, alignUsed)); RegOperand &result = CreateVirtualRegisterOperand(vRegNO); GetCurBB()->AppendInsn(GetCG()->BuildInstruction(PickLdInsn(alignUsed * k8BitSize, PTY_u32), - result, rhsMemOpnd)); + result, *rhsMemOpnd)); /* generate the store */ Operand &lhsMemOpnd = GenLargeAggFormalMemOpnd(*lhsSymbol, alignUsed, (lhsOffset + i * alignUsed)); GetCurBB()->AppendInsn(GetCG()->BuildInstruction(PickStInsn(alignUsed * k8BitSize, PTY_u32), -- Gitee