diff options
Diffstat (limited to 'bolt/lib/Passes/BinaryPasses.cpp')
| -rw-r--r-- | bolt/lib/Passes/BinaryPasses.cpp | 12 |
1 files changed, 10 insertions, 2 deletions
diff --git a/bolt/lib/Passes/BinaryPasses.cpp b/bolt/lib/Passes/BinaryPasses.cpp index d7f02b947003..2f1bb21bc1fd 100644 --- a/bolt/lib/Passes/BinaryPasses.cpp +++ b/bolt/lib/Passes/BinaryPasses.cpp @@ -1843,7 +1843,7 @@ Error StripRepRet::runOnFunctions(BinaryContext &BC) { } Error InlineMemcpy::runOnFunctions(BinaryContext &BC) { - if (!BC.isX86()) + if (!BC.isX86() && !BC.isAArch64()) return Error::success(); uint64_t NumInlined = 0; @@ -1866,8 +1866,16 @@ Error InlineMemcpy::runOnFunctions(BinaryContext &BC) { const bool IsMemcpy8 = (CalleeSymbol->getName() == "_memcpy8"); const bool IsTailCall = BC.MIB->isTailCall(Inst); + // Extract size from preceding instructions (AArch64 only). + // Pattern: MOV X2, #nb-bytes; BL memcpy src, dest, X2. + std::optional<uint64_t> KnownSize = + BC.MIB->findMemcpySizeInBytes(BB, II); + + if (BC.isAArch64() && (!KnownSize.has_value() || *KnownSize > 64)) + continue; + const InstructionListType NewCode = - BC.MIB->createInlineMemcpy(IsMemcpy8); + BC.MIB->createInlineMemcpy(IsMemcpy8, KnownSize); II = BB.replaceInstruction(II, NewCode); std::advance(II, NewCode.size() - 1); if (IsTailCall) { |
