From 513a1b90894f6be37864b2eee4faaa05d135e1f1 Mon Sep 17 00:00:00 2001 From: BinaryFZ Date: Mon, 7 Jun 2021 11:23:40 +0800 Subject: [PATCH 1/3] =?UTF-8?q?=E5=9B=9E=E9=80=80=20'Pull=20Request=20!633?= =?UTF-8?q?=20:=20Optimize=20for=20struct=20copy=20with=20larger=20sized?= =?UTF-8?q?=20loads/stores'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../include/cg/aarch64/aarch64_cgfunc.h | 6 +- .../src/cg/aarch64/aarch64_cgfunc.cpp | 331 +++++------------- 2 files changed, 97 insertions(+), 240 deletions(-) diff --git a/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h b/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h index c544a2067f..feaf5d19ab 100644 --- a/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h +++ b/src/mapleall/maple_be/include/cg/aarch64/aarch64_cgfunc.h @@ -91,8 +91,9 @@ class AArch64CGFunc : public CGFunc { void SelectDassign(DassignNode &stmt, Operand &opnd0) override; void SelectRegassign(RegassignNode &stmt, Operand &opnd0) override; void SelectAssertNull(UnaryStmtNode &stmt) override; - AArch64MemOperand *GenLargeAggFormalMemOpnd(const MIRSymbol &sym, uint32 alignUsed, int32 offset); - AArch64MemOperand *FixLargeMemOpnd(MemOperand &memOpnd, uint32 align); + AArch64MemOperand &GenLargeAggFormalMemOpnd(const MIRSymbol &sym, uint32 alignUsed, int32 offset, + const RegOperand &addReg); + AArch64MemOperand &FixLargeMemOpnd(MemOperand &memOpnd, uint32 align, const RegOperand &addReg); void SelectAggDassign(DassignNode &stmt) override; void SelectIassign(IassignNode &stmt) override; void SelectAggIassign(IassignNode &stmt, Operand &lhsAddrOpnd) override; @@ -227,7 +228,6 @@ class AArch64CGFunc : public CGFunc { LabelOperand &GetOrCreateLabelOperand(LabelIdx labIdx) override; LabelOperand &GetOrCreateLabelOperand(BB &bb) override; LabelOperand &CreateFuncLabelOperand(const MIRSymbol &func); - uint32 GetAggCopySize(uint32 offset1, uint32 offset2, uint32 alignment); AArch64ImmOperand &CreateImmOperand(PrimType ptyp, int64 val) override { return CreateImmOperand(val, GetPrimTypeBitSize(ptyp), IsSignedInteger(ptyp)); 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 600c89a611..79750b7bbc 100644 --- a/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp +++ b/src/mapleall/maple_be/src/cg/aarch64/aarch64_cgfunc.cpp @@ -1048,17 +1048,17 @@ void AArch64CGFunc::SelectRegassign(RegassignNode &stmt, Operand &opnd0) { } } -AArch64MemOperand *AArch64CGFunc::FixLargeMemOpnd(MemOperand &memOpnd, uint32 align) { +AArch64MemOperand &AArch64CGFunc::FixLargeMemOpnd(MemOperand &memOpnd, uint32 align, const RegOperand &addReg) { AArch64MemOperand *lhsMemOpnd = static_cast(&memOpnd); if ((lhsMemOpnd->GetMemVaryType() == kNotVary) && IsImmediateOffsetOutOfRange(*lhsMemOpnd, align * kBitsPerByte)) { - RegOperand *addReg = &CreateRegisterOperandOfType(PTY_i64); - lhsMemOpnd = &SplitOffsetWithAddInstruction(*lhsMemOpnd, align * k8BitSize, addReg->GetRegisterNumber()); + lhsMemOpnd = &SplitOffsetWithAddInstruction(*lhsMemOpnd, align * k8BitSize, addReg.GetRegisterNumber()); } - return lhsMemOpnd; + return *lhsMemOpnd; } -AArch64MemOperand *AArch64CGFunc::GenLargeAggFormalMemOpnd(const MIRSymbol &sym, uint32 align, int32 offset) { +AArch64MemOperand &AArch64CGFunc::GenLargeAggFormalMemOpnd(const MIRSymbol &sym, uint32 align, int32 offset, + const RegOperand &addReg) { MemOperand *memOpnd; if (sym.GetStorageClass() == kScFormal && GetBecommon().GetTypeSize(sym.GetTyIdx()) > k16ByteSize) { /* formal of size of greater than 16 is copied by the caller and the pointer to it is passed. */ @@ -1072,7 +1072,7 @@ AArch64MemOperand *AArch64CGFunc::GenLargeAggFormalMemOpnd(const MIRSymbol &sym, } else { memOpnd = &GetOrCreateMemOpnd(sym, offset, align * kBitsPerByte); } - return FixLargeMemOpnd(*memOpnd, align); + return FixLargeMemOpnd(*memOpnd, align, addReg); } void AArch64CGFunc::SelectAggDassign(DassignNode &stmt) { @@ -1091,6 +1091,7 @@ void AArch64CGFunc::SelectAggDassign(DassignNode &stmt) { uint32 rhsAlign; uint32 alignUsed; int32 rhsOffset = 0; + RegOperand *addReg = &CreateRegisterOperandOfType(PTY_i64); if (stmt.GetRHS()->GetOpCode() == OP_dread) { AddrofNode *rhsDread = static_cast(stmt.GetRHS()); MIRSymbol *rhsSymbol = GetFunction().GetLocalOrGlobalSymbol(rhsDread->GetStIdx()); @@ -1104,66 +1105,29 @@ void AArch64CGFunc::SelectAggDassign(DassignNode &stmt) { rhsAlign = GetBecommon().GetTypeAlign(rhsType->GetTypeIndex()); alignUsed = std::min(lhsAlign, rhsAlign); ASSERT(alignUsed != 0, "expect non-zero"); - uint32 copySize = GetAggCopySize(lhsOffset, rhsOffset, alignUsed); - MemOperand *rhsBaseMemOpnd; - if (IsParamStructCopy(*rhsSymbol)) { - rhsBaseMemOpnd = &LoadStructCopyBase(*rhsSymbol, rhsOffset, copySize * k8BitSize); - } else { - rhsBaseMemOpnd = &GetOrCreateMemOpnd(*rhsSymbol, rhsOffset, copySize * k8BitSize); - rhsBaseMemOpnd = FixLargeMemOpnd(*rhsBaseMemOpnd, copySize); - } - RegOperand *rhsBaseReg = rhsBaseMemOpnd->GetBaseRegister(); - int64 rhsOffsetVal = rhsBaseMemOpnd->GetOffsetOperand()->GetValue(); - AArch64MemOperand *lhsBaseMemOpnd = GenLargeAggFormalMemOpnd(*lhsSymbol, copySize, lhsOffset); - RegOperand *lhsBaseReg = lhsBaseMemOpnd->GetBaseRegister(); - int64 lhsOffsetVal = lhsBaseMemOpnd->GetOffsetOperand()->GetValue(); - bool rhsIsLo12 = (static_cast(rhsBaseMemOpnd)->GetAddrMode() - == AArch64MemOperand::kAddrModeLo12Li); - bool lhsIsLo12 = (static_cast(lhsBaseMemOpnd)->GetAddrMode() - == AArch64MemOperand::kAddrModeLo12Li); - for (uint32 i = 0; i < (lhsSize / copySize); i++) { - uint32 rhsBaseOffset = i * copySize + rhsOffsetVal; - uint32 lhsBaseOffset = i * copySize + lhsOffsetVal; - AArch64MemOperand::AArch64AddressingMode addrMode = rhsIsLo12 ? - AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - MIRSymbol *sym = rhsIsLo12 ? rhsSymbol : nullptr; - AArch64OfstOperand &rhsOfstOpnd = GetOrCreateOfstOpnd(rhsBaseOffset, k32BitSize); - MemOperand *rhsMemOpnd; - rhsMemOpnd = &GetOrCreateMemOpnd(addrMode, copySize * k8BitSize, rhsBaseReg, nullptr, &rhsOfstOpnd, sym); - rhsMemOpnd = FixLargeMemOpnd(*rhsMemOpnd, copySize); + bool parmCopy = IsParamStructCopy(*rhsSymbol); + for (uint32 i = 0; i < (lhsSize / alignUsed); i++) { /* generate the load */ - RegOperand &result = CreateVirtualRegisterOperand(NewVReg(kRegTyInt, std::max(4u, copySize))); - bool doPair = (!rhsIsLo12 && !lhsIsLo12 && (copySize >= 4) && ((i + 1) < (lhsSize / copySize)) && - !AArch64MemOperand::IsSIMMOffsetOutOfRange(rhsBaseOffset, (copySize == 8), true) && - !AArch64MemOperand::IsSIMMOffsetOutOfRange(lhsBaseOffset, (copySize == 8), true)); - RegOperand *result1 = nullptr; - if (doPair) { - result1 = &CreateVirtualRegisterOperand(NewVReg(kRegTyInt, std::max(4u, copySize))); - MOperator mOp = (copySize == 4) ? MOP_wldp : MOP_xldp; - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *result1, *rhsMemOpnd)); + MemOperand *rhsMemOpnd; + if (parmCopy) { + rhsMemOpnd = &LoadStructCopyBase(*rhsSymbol, rhsOffset + i * alignUsed, alignUsed * k8BitSize); } else { - MOperator mOp = PickLdInsn(copySize * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *rhsMemOpnd)); + rhsMemOpnd = &GetOrCreateMemOpnd(*rhsSymbol, rhsOffset + i * alignUsed, alignUsed * k8BitSize); + rhsMemOpnd = &FixLargeMemOpnd(*rhsMemOpnd, alignUsed, *addReg); } + regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, alignUsed)); + RegOperand &result = CreateVirtualRegisterOperand(vRegNO); + GetCurBB()->AppendInsn(GetCG()->BuildInstruction(PickLdInsn(alignUsed * k8BitSize, PTY_u32), + result, *rhsMemOpnd)); /* generate the store */ - AArch64OfstOperand &lhsOfstOpnd = GetOrCreateOfstOpnd(lhsBaseOffset, k32BitSize); - addrMode = lhsIsLo12 ? AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - sym = lhsIsLo12 ? lhsSymbol : nullptr; - MemOperand *lhsMemOpnd; - lhsMemOpnd = &GetOrCreateMemOpnd(addrMode, copySize * k8BitSize, lhsBaseReg, nullptr, &lhsOfstOpnd, sym); - lhsMemOpnd = FixLargeMemOpnd(*lhsMemOpnd, copySize); - if (doPair) { - MOperator mOp = (copySize == 4) ? MOP_wstp : MOP_xstp; - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *result1, *lhsMemOpnd)); - i++; - } else { - MOperator mOp = PickStInsn(copySize * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *lhsMemOpnd)); - } + AArch64MemOperand *lhsMemOpnd = &GenLargeAggFormalMemOpnd(*lhsSymbol, alignUsed, + (lhsOffset + i * alignUsed), *addReg); + GetCurBB()->AppendInsn(GetCG()->BuildInstruction(PickStInsn(alignUsed * k8BitSize, PTY_u32), + result, *lhsMemOpnd)); } - /* take care of extra content at the end less than the unit */ - uint64 lhsSizeCovered = (lhsSize / copySize) * copySize; - uint32 newAlignUsed = copySize; + /* take care of extra content at the end less than the unit of alignUsed */ + uint64 lhsSizeCovered = (lhsSize / alignUsed) * alignUsed; + uint32 newAlignUsed = alignUsed; while (lhsSizeCovered < lhsSize) { newAlignUsed = newAlignUsed >> 1; CHECK_FATAL(newAlignUsed != 0, "expect non-zero"); @@ -1171,26 +1135,16 @@ void AArch64CGFunc::SelectAggDassign(DassignNode &stmt) { continue; } /* generate the load */ - MemOperand *rhsMemOpnd; - AArch64MemOperand::AArch64AddressingMode addrMode = rhsIsLo12 ? - AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - MIRSymbol *sym = rhsIsLo12 ? rhsSymbol : nullptr; - AArch64OfstOperand &rhsOfstOpnd = GetOrCreateOfstOpnd(lhsSizeCovered + rhsOffsetVal, k32BitSize); - rhsMemOpnd = &GetOrCreateMemOpnd(addrMode, newAlignUsed * k8BitSize, rhsBaseReg, nullptr, &rhsOfstOpnd, sym); - rhsMemOpnd = FixLargeMemOpnd(*rhsMemOpnd, newAlignUsed); + MemOperand &rhsMemOpnd = GetOrCreateMemOpnd(*rhsSymbol, rhsOffset + lhsSizeCovered, newAlignUsed * k8BitSize); + rhsMemOpnd = FixLargeMemOpnd(rhsMemOpnd, newAlignUsed, *addReg); regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, newAlignUsed)); RegOperand &result = CreateVirtualRegisterOperand(vRegNO); - MOperator mOp = PickLdInsn(newAlignUsed * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *rhsMemOpnd)); + GetCurBB()->AppendInsn(GetCG()->BuildInstruction(PickLdInsn(newAlignUsed * k8BitSize, PTY_u32), + result, rhsMemOpnd)); /* generate the store */ - addrMode = lhsIsLo12 ? AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - sym = lhsIsLo12 ? lhsSymbol : nullptr; - AArch64OfstOperand &lhsOfstOpnd = GetOrCreateOfstOpnd(lhsSizeCovered + lhsOffsetVal, k32BitSize); - MemOperand *lhsMemOpnd; - lhsMemOpnd = &GetOrCreateMemOpnd(addrMode, newAlignUsed * k8BitSize, lhsBaseReg, nullptr, &lhsOfstOpnd, sym); - lhsMemOpnd = FixLargeMemOpnd(*lhsMemOpnd, newAlignUsed); - mOp = PickStInsn(newAlignUsed * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *lhsMemOpnd)); + Operand &lhsMemOpnd = GenLargeAggFormalMemOpnd(*lhsSymbol, newAlignUsed, (lhsOffset + lhsSizeCovered), *addReg); + GetCurBB()->AppendInsn(GetCG()->BuildInstruction(PickStInsn(newAlignUsed * k8BitSize, PTY_u32), + result, lhsMemOpnd)); lhsSizeCovered += newAlignUsed; } } else if (stmt.GetRHS()->GetOpCode() == OP_iread) { @@ -1212,58 +1166,26 @@ void AArch64CGFunc::SelectAggDassign(DassignNode &stmt) { rhsAlign = GetBecommon().GetTypeAlign(rhsType->GetTypeIndex()); alignUsed = std::min(lhsAlign, rhsAlign); ASSERT(alignUsed != 0, "expect non-zero"); - uint32 copySize = GetAggCopySize(rhsOffset, lhsOffset, alignUsed); - AArch64MemOperand *lhsBaseMemOpnd = GenLargeAggFormalMemOpnd(*lhsSymbol, copySize, lhsOffset); - RegOperand *lhsBaseReg = lhsBaseMemOpnd->GetBaseRegister(); - int64 lhsOffsetVal = lhsBaseMemOpnd->GetOffsetOperand()->GetValue(); - bool lhsIsLo12 = (static_cast(lhsBaseMemOpnd)->GetAddrMode() - == AArch64MemOperand::kAddrModeLo12Li); - for (uint32 i = 0; i < (lhsSize / copySize); i++) { - uint32 rhsBaseOffset = rhsOffset + i * copySize; - uint32 lhsBaseOffset = lhsOffsetVal + i * copySize; + for (uint32 i = 0; i < (lhsSize / alignUsed); i++) { /* generate the load */ - AArch64OfstOperand &ofstOpnd = GetOrCreateOfstOpnd(rhsBaseOffset, k32BitSize); - MemOperand *rhsMemOpnd = &GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, copySize * k8BitSize, + AArch64OfstOperand &ofstOpnd = GetOrCreateOfstOpnd(rhsOffset + i * alignUsed, k32BitSize); + MemOperand &rhsMemOpnd = GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, alignUsed * k8BitSize, addrOpnd, nullptr, &ofstOpnd, nullptr); - rhsMemOpnd = FixLargeMemOpnd(*rhsMemOpnd, copySize); - regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, copySize)); + rhsMemOpnd = FixLargeMemOpnd(rhsMemOpnd, alignUsed, *addReg); + regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, alignUsed)); RegOperand &result = CreateVirtualRegisterOperand(vRegNO); - bool doPair = (!lhsIsLo12 && copySize >=4) && ((i + 1) < (lhsSize / copySize)) && - !AArch64MemOperand::IsSIMMOffsetOutOfRange(rhsBaseOffset, (copySize == 8), true) && - !AArch64MemOperand::IsSIMMOffsetOutOfRange(lhsBaseOffset, (copySize == 8), true); - Insn *insn; - RegOperand *result1 = nullptr; - if (doPair) { - regno_t vRegNO1 = NewVReg(kRegTyInt, std::max(4u, copySize)); - result1 = &CreateVirtualRegisterOperand(vRegNO1); - MOperator mOp = (copySize == 4) ? MOP_wldp : MOP_xldp; - insn = &GetCG()->BuildInstruction(mOp, result, *result1, *rhsMemOpnd); - } else { - MOperator mOp = PickLdInsn(copySize * k8BitSize, PTY_u32); - insn = &GetCG()->BuildInstruction(mOp, result, *rhsMemOpnd); - } - insn->MarkAsAccessRefField(isRefField); - GetCurBB()->AppendInsn(*insn); + Insn &insn = + GetCG()->BuildInstruction(PickLdInsn(alignUsed * k8BitSize, PTY_u32), result, rhsMemOpnd); + insn.MarkAsAccessRefField(isRefField); + GetCurBB()->AppendInsn(insn); /* generate the store */ - AArch64MemOperand::AArch64AddressingMode addrMode = lhsIsLo12 ? - AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - MIRSymbol *sym = lhsIsLo12 ? lhsSymbol : nullptr; - AArch64OfstOperand &lhsOfstOpnd = GetOrCreateOfstOpnd(lhsBaseOffset, k32BitSize); - MemOperand *lhsMemOpnd; - lhsMemOpnd = &GetOrCreateMemOpnd(addrMode, copySize * k8BitSize, lhsBaseReg, nullptr, &lhsOfstOpnd, sym); - lhsMemOpnd = FixLargeMemOpnd(*lhsMemOpnd, copySize); - if (doPair) { - MOperator mOp = (copySize == 4) ? MOP_wstp : MOP_xstp; - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *result1, *lhsMemOpnd)); - i++; - } else { - MOperator mOp = PickStInsn(copySize * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *lhsMemOpnd)); - } + Operand &lhsMemOpnd = GenLargeAggFormalMemOpnd(*lhsSymbol, alignUsed, (lhsOffset + i * alignUsed), *addReg); + GetCurBB()->AppendInsn( + GetCG()->BuildInstruction(PickStInsn(alignUsed * k8BitSize, PTY_u32), result, lhsMemOpnd)); } - /* take care of extra content at the end less than the unit */ - uint64 lhsSizeCovered = (lhsSize / copySize) * copySize; - uint32 newAlignUsed = copySize; + /* take care of extra content at the end less than the unit of alignUsed */ + uint64 lhsSizeCovered = (lhsSize / alignUsed) * alignUsed; + uint32 newAlignUsed = alignUsed; while (lhsSizeCovered < lhsSize) { newAlignUsed = newAlignUsed >> 1; CHECK_FATAL(newAlignUsed != 0, "expect non-zero"); @@ -1272,24 +1194,19 @@ void AArch64CGFunc::SelectAggDassign(DassignNode &stmt) { } /* generate the load */ AArch64OfstOperand &ofstOpnd = GetOrCreateOfstOpnd(rhsOffset + lhsSizeCovered, k32BitSize); - MemOperand *rhsMemOpnd = &GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, newAlignUsed * k8BitSize, + MemOperand &rhsMemOpnd = GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, newAlignUsed * k8BitSize, addrOpnd, nullptr, &ofstOpnd, nullptr); - rhsMemOpnd = FixLargeMemOpnd(*rhsMemOpnd, newAlignUsed); - RegOperand &result = CreateVirtualRegisterOperand(NewVReg(kRegTyInt, std::max(4u, newAlignUsed))); - MOperator mOp = PickLdInsn(newAlignUsed * k8BitSize, PTY_u32); - Insn &insn = GetCG()->BuildInstruction(mOp, result, *rhsMemOpnd); + rhsMemOpnd = FixLargeMemOpnd(rhsMemOpnd, newAlignUsed, *addReg); + regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, newAlignUsed)); + RegOperand &result = CreateVirtualRegisterOperand(vRegNO); + Insn &insn = + GetCG()->BuildInstruction(PickLdInsn(newAlignUsed * k8BitSize, PTY_u32), result, rhsMemOpnd); insn.MarkAsAccessRefField(isRefField); GetCurBB()->AppendInsn(insn); /* generate the store */ - AArch64MemOperand::AArch64AddressingMode addrMode = lhsIsLo12 ? - AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - MIRSymbol *sym = lhsIsLo12 ? lhsSymbol : nullptr; - AArch64OfstOperand &lhsOfstOpnd = GetOrCreateOfstOpnd(lhsSizeCovered + lhsOffsetVal, k32BitSize); - MemOperand *lhsMemOpnd; - lhsMemOpnd = &GetOrCreateMemOpnd(addrMode, newAlignUsed * k8BitSize, lhsBaseReg, nullptr, &lhsOfstOpnd, sym); - lhsMemOpnd = FixLargeMemOpnd(*lhsMemOpnd, newAlignUsed); - mOp = PickStInsn(newAlignUsed * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *lhsMemOpnd)); + Operand &lhsMemOpnd = GenLargeAggFormalMemOpnd(*lhsSymbol, newAlignUsed, (lhsOffset + lhsSizeCovered), *addReg); + GetCurBB()->AppendInsn( + GetCG()->BuildInstruction(PickStInsn(newAlignUsed * k8BitSize, PTY_u32), result, lhsMemOpnd)); lhsSizeCovered += newAlignUsed; } } else { @@ -1553,81 +1470,48 @@ void AArch64CGFunc::SelectAggIassign(IassignNode &stmt, Operand &AddrOpnd) { rhsAlign = GetBecommon().GetTypeAlign(rhsType->GetTypeIndex()); alignUsed = std::min(lhsAlign, rhsAlign); ASSERT(alignUsed != 0, "expect non-zero"); - uint32 copySize = GetAggCopySize(rhsOffset, lhsOffset, alignUsed); - MemOperand *rhsBaseMemOpnd; - if (IsParamStructCopy(*rhsSymbol)) { - rhsBaseMemOpnd = &LoadStructCopyBase(*rhsSymbol, rhsOffset, copySize * k8BitSize); - } else { - rhsBaseMemOpnd = GenLargeAggFormalMemOpnd(*rhsSymbol, copySize, rhsOffset); - } - RegOperand *rhsBaseReg = rhsBaseMemOpnd->GetBaseRegister(); - int64 rhsOffsetVal = rhsBaseMemOpnd->GetOffsetOperand()->GetValue(); - bool rhsIsLo12 = (static_cast(rhsBaseMemOpnd)->GetAddrMode() - == AArch64MemOperand::kAddrModeLo12Li); - for (uint32 i = 0; i < (lhsSize / copySize); ++i) { - uint32 rhsBaseOffset = rhsOffsetVal + i * copySize; - uint32 lhsBaseOffset = lhsOffset + i * copySize; - AArch64MemOperand::AArch64AddressingMode addrMode = rhsIsLo12 ? - AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - MIRSymbol *sym = rhsIsLo12 ? rhsSymbol : nullptr; - AArch64OfstOperand &rhsOfstOpnd = GetOrCreateOfstOpnd(rhsBaseOffset, k32BitSize); - MemOperand *rhsMemOpnd; - rhsMemOpnd = &GetOrCreateMemOpnd(addrMode, copySize * k8BitSize, rhsBaseReg, nullptr, &rhsOfstOpnd, sym); - rhsMemOpnd = FixLargeMemOpnd(*rhsMemOpnd, copySize); + bool parmCopy = IsParamStructCopy(*rhsSymbol); + RegOperand *addReg = &CreateRegisterOperandOfType(PTY_i64); + for (uint32 i = 0; i < (lhsSize / alignUsed); ++i) { /* generate the load */ - RegOperand &result = CreateVirtualRegisterOperand(NewVReg(kRegTyInt, std::max(4u, copySize))); - bool doPair = (!rhsIsLo12 && (copySize >= 4) && ((i + 1) < (lhsSize / copySize)) && - !AArch64MemOperand::IsSIMMOffsetOutOfRange(rhsBaseOffset, (copySize == 8), true)); - RegOperand *result1 = nullptr; - if (doPair) { - regno_t vRegNO1 = NewVReg(kRegTyInt, std::max(4u, copySize)); - result1 = &CreateVirtualRegisterOperand(vRegNO1); - MOperator mOp = (copySize == 4) ? MOP_wldp : MOP_xldp; - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *result1, *rhsMemOpnd)); + Operand *rhsMemOpnd = nullptr; + if (parmCopy) { + rhsMemOpnd = &LoadStructCopyBase(*rhsSymbol, rhsOffset + i * alignUsed, alignUsed * k8BitSize); } else { - MOperator mOp = PickLdInsn(copySize * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *rhsMemOpnd)); + rhsMemOpnd = &GenLargeAggFormalMemOpnd(*rhsSymbol, alignUsed, (rhsOffset + i * alignUsed), *addReg); } + regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, alignUsed)); + RegOperand &result = CreateVirtualRegisterOperand(vRegNO); + GetCurBB()->AppendInsn( + GetCG()->BuildInstruction(PickLdInsn(alignUsed * k8BitSize, PTY_u32), result, *rhsMemOpnd)); /* generate the store */ - AArch64OfstOperand &ofstOpnd = GetOrCreateOfstOpnd(lhsBaseOffset, k32BitSize); - Operand *lhsMemOpnd = &GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, copySize * k8BitSize, + AArch64OfstOperand &ofstOpnd = GetOrCreateOfstOpnd(lhsOffset + i * alignUsed, k32BitSize); + Operand &lhsMemOpnd = GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, alignUsed * k8BitSize, static_cast(&lhsAddrOpnd), nullptr, &ofstOpnd, nullptr); - if (doPair) { - MOperator mOp = (copySize == 4) ? MOP_wstp : MOP_xstp; - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *result1, *lhsMemOpnd)); - i++; - } else { - MOperator mOp = PickStInsn(copySize * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *lhsMemOpnd)); - } + GetCurBB()->AppendInsn( + GetCG()->BuildInstruction(PickStInsn(alignUsed * k8BitSize, PTY_u32), result, lhsMemOpnd)); } /* take care of extra content at the end less than the unit of alignUsed */ - uint64 lhsSizeCovered = (lhsSize / copySize) * copySize; - uint32 newAlignUsed = copySize; + uint64 lhsSizeCovered = (lhsSize / alignUsed) * alignUsed; + uint32 newAlignUsed = alignUsed; while (lhsSizeCovered < lhsSize) { newAlignUsed = newAlignUsed >> 1; CHECK_FATAL(newAlignUsed != 0, "expect non-zero"); if ((lhsSizeCovered + newAlignUsed) > lhsSize) { continue; } - AArch64MemOperand::AArch64AddressingMode addrMode = rhsIsLo12 ? - AArch64MemOperand::kAddrModeLo12Li : AArch64MemOperand::kAddrModeBOi; - MIRSymbol *sym = rhsIsLo12 ? rhsSymbol : nullptr; - AArch64OfstOperand &rhsOfstOpnd = GetOrCreateOfstOpnd(lhsSizeCovered + rhsOffsetVal, k32BitSize); - MemOperand *rhsMemOpnd; - rhsMemOpnd = &GetOrCreateMemOpnd(addrMode, newAlignUsed * k8BitSize, rhsBaseReg, nullptr, &rhsOfstOpnd, sym); - rhsMemOpnd = FixLargeMemOpnd(*rhsMemOpnd, newAlignUsed); /* generate the load */ - Operand &result = CreateVirtualRegisterOperand(NewVReg(kRegTyInt, std::max(4u, newAlignUsed))); - MOperator mOp = PickLdInsn(newAlignUsed * k8BitSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *rhsMemOpnd)); + Operand &rhsMemOpnd = GetOrCreateMemOpnd(*rhsSymbol, rhsOffset + lhsSizeCovered, newAlignUsed * k8BitSize); + regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, newAlignUsed)); + Operand &result = CreateVirtualRegisterOperand(vRegNO); + GetCurBB()->AppendInsn( + GetCG()->BuildInstruction(PickLdInsn(newAlignUsed * k8BitSize, PTY_u32), result, rhsMemOpnd)); /* generate the store */ AArch64OfstOperand &ofstOpnd = GetOrCreateOfstOpnd(lhsOffset + lhsSizeCovered, k32BitSize); Operand &lhsMemOpnd = GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, newAlignUsed * k8BitSize, static_cast(&lhsAddrOpnd), nullptr, &ofstOpnd, static_cast(nullptr)); - mOp = PickStInsn(newAlignUsed * k8BitSize, PTY_u32); GetCurBB()->AppendInsn( - GetCG()->BuildInstruction(mOp, result, lhsMemOpnd)); + GetCG()->BuildInstruction(PickStInsn(newAlignUsed * k8BitSize, PTY_u32), result, lhsMemOpnd)); lhsSizeCovered += newAlignUsed; } } else { /* rhs is iread */ @@ -1681,49 +1565,34 @@ void AArch64CGFunc::SelectAggIassign(IassignNode &stmt, Operand &AddrOpnd) { rhsAlign = GetBecommon().GetTypeAlign(rhsType->GetTypeIndex()); alignUsed = std::min(lhsAlign, rhsAlign); ASSERT(alignUsed != 0, "expect non-zero"); - uint32 copySize = GetAggCopySize(rhsOffset, lhsOffset, alignUsed); - for (uint32 i = 0; i < (lhsSize / copySize); i++) { + for (uint32 i = 0; i < (lhsSize / alignUsed); i++) { /* generate the load */ - uint32 operandSize = copySize * k8BitSize; - AArch64OfstOperand &rhsOfstOpnd = GetOrCreateOfstOpnd(rhsOffset + i * copySize, k32BitSize); + uint32 operandSize = alignUsed * k8BitSize; + AArch64OfstOperand &rhsOfstOpnd = GetOrCreateOfstOpnd(rhsOffset + i * alignUsed, k32BitSize); Operand *rhsMemOpnd = &GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, operandSize, static_cast(rhsAddrOpnd), nullptr, &rhsOfstOpnd, nullptr); if (IsImmediateOffsetOutOfRange(*static_cast(rhsMemOpnd), operandSize)) { rhsMemOpnd = &SplitOffsetWithAddInstruction(*static_cast(rhsMemOpnd), operandSize); } - RegOperand &result = CreateVirtualRegisterOperand(NewVReg(kRegTyInt, std::max(4u, copySize))); - bool doPair = ((copySize >= 4) && ((i + 1) < (lhsSize / copySize))); - Insn *insn; - RegOperand *result1 = nullptr; - if (doPair) { - result1 = &CreateVirtualRegisterOperand(NewVReg(kRegTyInt, std::max(4u, copySize))); - MOperator mOp = (copySize == 4) ? MOP_wldp : MOP_xldp; - insn = &GetCG()->BuildInstruction(mOp, result, *result1, *rhsMemOpnd); - } else { - MOperator mOp = PickLdInsn(operandSize, PTY_u32); - insn = &GetCG()->BuildInstruction(mOp, result, *rhsMemOpnd); - } - insn->MarkAsAccessRefField(isRefField); - GetCurBB()->AppendInsn(*insn); + regno_t vRegNO = NewVReg(kRegTyInt, std::max(4u, alignUsed)); + RegOperand &result = CreateVirtualRegisterOperand(vRegNO); + Insn &insn = + GetCG()->BuildInstruction(PickLdInsn(operandSize, PTY_u32), result, *rhsMemOpnd); + insn.MarkAsAccessRefField(isRefField); + GetCurBB()->AppendInsn(insn); /* generate the store */ - AArch64OfstOperand &lhsOfstOpnd = GetOrCreateOfstOpnd(lhsOffset + i * copySize, k32BitSize); + AArch64OfstOperand &lhsOfstOpnd = GetOrCreateOfstOpnd(lhsOffset + i * alignUsed, k32BitSize); Operand *lhsMemOpnd = &GetOrCreateMemOpnd(AArch64MemOperand::kAddrModeBOi, operandSize, static_cast(&lhsAddrOpnd), nullptr, &lhsOfstOpnd, nullptr); if (IsImmediateOffsetOutOfRange(*static_cast(lhsMemOpnd), operandSize)) { lhsMemOpnd = &SplitOffsetWithAddInstruction(*static_cast(lhsMemOpnd), operandSize); } - if (doPair) { - MOperator mOp = (copySize == 4) ? MOP_wstp : MOP_xstp; - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *result1, *lhsMemOpnd)); - i++; - } else { - MOperator mOp = PickStInsn(operandSize, PTY_u32); - GetCurBB()->AppendInsn(GetCG()->BuildInstruction(mOp, result, *lhsMemOpnd)); - } + GetCurBB()->AppendInsn( + GetCG()->BuildInstruction(PickStInsn(operandSize, PTY_u32), result, *lhsMemOpnd)); } - /* take care of extra content at the end less than the unit */ - uint64 lhsSizeCovered = (lhsSize / copySize) * copySize; - uint32 newAlignUsed = copySize; + /* take care of extra content at the end less than the unit of alignUsed */ + uint64 lhsSizeCovered = (lhsSize / alignUsed) * alignUsed; + uint32 newAlignUsed = alignUsed; while (lhsSizeCovered < lhsSize) { newAlignUsed = newAlignUsed >> 1; CHECK_FATAL(newAlignUsed != 0, "expect non-zero"); @@ -6542,18 +6411,6 @@ LabelOperand &AArch64CGFunc::CreateFuncLabelOperand(const MIRSymbol &funcSymbol) return *memPool->New(funcName); } -uint32 AArch64CGFunc::GetAggCopySize(uint32 offset1, uint32 offset2, uint32 alignment) { - /* Generating a larger sized mem op than alignment if allowed by aggregate starting address */ - uint32 offsetAlign1 = (offset1 == 0) ? k8ByteSize : offset1; - uint32 offsetAlign2 = (offset2 == 0) ? k8ByteSize : offset2; - uint32 alignOffset = std::min((offsetAlign1 & 0x0f), (offsetAlign2 & 0x0f)); - if (alignOffset == k8ByteSize || alignOffset == k4ByteSize || alignOffset == k2ByteSize) { - return alignOffset; - } else { - return alignment; - } -} - AArch64OfstOperand &AArch64CGFunc::GetOrCreateOfstOpnd(uint32 offset, uint32 size) { uint64 aarch64OfstRegIdx = offset; aarch64OfstRegIdx = (aarch64OfstRegIdx << 1); -- Gitee From 1be1efc1ec6112a2c80820aa8e379f6ef3efedfd Mon Sep 17 00:00:00 2001 From: binaryfz Date: Mon, 7 Jun 2021 16:19:48 +0800 Subject: [PATCH 2/3] add 4 cases into banlist --- testsuite/driver/config/testall.conf | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/testsuite/driver/config/testall.conf b/testsuite/driver/config/testall.conf index a2d73d6d08..f710a9475c 100644 --- a/testsuite/driver/config/testall.conf +++ b/testsuite/driver/config/testall.conf @@ -266,3 +266,7 @@ java_test/rc_test/RC0515-GC-FrequentGCTest01: O2 java_test/reflection_test/RT0199-rt-reflection-AnnotationPackageSetTest: O2 java_test/thread_test/RT0094-rt-thread-ThreadStateyield: O2 + c_test/sanity_test/SANITY0027-convert: CO0 + c_test/sanity_test/SANITY0027-convert: CO2 + c_test/sanity_test/SANITY0023-cc_sret: CO2 + c_test/sanity_test/SANITY0023-cc_sret: CO0 -- Gitee From e2dd02f66c8edcc0e51bcde4fe3716b346eeed53 Mon Sep 17 00:00:00 2001 From: binaryfz Date: Mon, 7 Jun 2021 16:22:49 +0800 Subject: [PATCH 3/3] revert clang2mpl to 347f19ede73f49e0e2df52896affd7ee3719dbe1 --- tools/setup_tools.sh | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/setup_tools.sh b/tools/setup_tools.sh index 7516812573..13a11813cb 100755 --- a/tools/setup_tools.sh +++ b/tools/setup_tools.sh @@ -164,6 +164,9 @@ git clean -df git checkout . git checkout master git pull +git reset 347f19ede73f49e0e2df52896affd7ee3719dbe1 +git reset --hard +git clean -fd mkdir -p ${TOOL_BIN_PATH} if [ "$OLD_OS" == "1" ]; then -- Gitee