[llvm] [BOLT][AArch64] Enabling Inlining for Memcpy for AArch64 in BOLT (PR #154929)
via llvm-commits
llvm-commits at lists.llvm.org
Thu Sep 4 10:25:05 PDT 2025
================
@@ -2597,6 +2597,121 @@ class AArch64MCPlusBuilder : public MCPlusBuilder {
getInstructionSize(const MCInst &Inst) const override {
return 4;
}
+
+ InstructionListType createInlineMemcpy(bool ReturnEnd) const override {
+ return createInlineMemcpy(ReturnEnd, std::nullopt);
+ }
+
+ std::optional<uint64_t>
+ extractMoveImmediate(const MCInst &Inst, MCPhysReg TargetReg) const override {
+ // Match MOVZ instructions (both X and W register variants) with no shift.
+ if ((Inst.getOpcode() == AArch64::MOVZXi ||
+ Inst.getOpcode() == AArch64::MOVZWi) &&
+ Inst.getOperand(2).getImm() == 0 &&
+ getAliases(TargetReg)[Inst.getOperand(0).getReg()])
+ return Inst.getOperand(1).getImm();
+ return std::nullopt;
+ }
+
+ std::optional<uint64_t>
+ findMemcpySizeInBytes(const BinaryBasicBlock &BB,
+ BinaryBasicBlock::iterator CallInst) const override {
+ BitVector WrittenRegs(RegInfo->getNumRegs());
+ MCPhysReg SizeReg = getIntArgRegister(2);
+ const BitVector &SizeRegAliases = getAliases(SizeReg);
+
+ for (auto InstIt = BB.begin(); InstIt != CallInst; ++InstIt) {
+ const MCInst &Inst = *InstIt;
+ WrittenRegs.reset();
+ getWrittenRegs(Inst, WrittenRegs);
+
+ if (SizeReg != getNoRegister() && WrittenRegs.anyCommon(SizeRegAliases);
----------------
yafet-a wrote:
Yes, you're right. I have moved it out of the loop now. I have also moved the call to WrittenRegs to be after the check for the size register too since that'd be slightly more efficient.
https://github.com/llvm/llvm-project/pull/154929
More information about the llvm-commits
mailing list