[llvm] [bolt][aarch64] simplify rodata/literal load for X86 & AArch64 (PR #165723)
YongKang Zhu via llvm-commits
llvm-commits at lists.llvm.org
Mon Dec 1 09:09:07 PST 2025
================
@@ -1226,28 +1227,53 @@ bool SimplifyRODataLoads::simplifyRODataLoads(BinaryFunction &BF) {
}
// Get the contents of the section containing the target address of the
- // memory operand. We are only interested in read-only sections.
+ // memory operand. We are only interested in read-only sections for X86,
+ // for aarch64 the sections can be read-only or executable.
ErrorOr<BinarySection &> DataSection =
BC.getSectionForAddress(TargetAddress);
- if (!DataSection || DataSection->isWritable())
+ if (!DataSection)
continue;
+ if (BC.isX86() && DataSection->isWritable())
+ continue;
+
+ if (DataSection->isText()) {
+ // If data is not part of a function, check if it is part of a global CI
+ // Do not proceed if there aren't data markers for CIs
+ BinaryFunction *BFTgt =
+ BC.getBinaryFunctionContainingAddress(TargetAddress,
+ /*CheckPastEnd*/ false,
+ /*UseMaxSize*/ true);
+ const bool IsInsideFunc =
+ BFTgt && BFTgt->isInConstantIsland(TargetAddress);
+
+ auto CIEndIter = BC.AddressToConstantIslandMap.end();
+ auto CIIter = BC.AddressToConstantIslandMap.find(TargetAddress);
+ if (!IsInsideFunc && CIIter == CIEndIter)
+ continue;
+ }
+
if (BC.getRelocationAt(TargetAddress) ||
BC.getDynamicRelocationAt(TargetAddress))
continue;
- uint32_t Offset = TargetAddress - DataSection->getAddress();
- StringRef ConstantData = DataSection->getContents();
-
++NumLocalLoadsFound;
if (BB->hasProfile())
NumDynamicLocalLoadsFound += BB->getExecutionCount();
- if (MIB->replaceMemOperandWithImm(Inst, ConstantData, Offset)) {
- ++NumLocalLoadsSimplified;
- if (BB->hasProfile())
- NumDynamicLocalLoadsSimplified += BB->getExecutionCount();
- }
+ uint32_t Offset = TargetAddress - DataSection->getAddress();
+ StringRef ConstantData = DataSection->getContents();
+ const InstructionListType Instrs =
+ MIB->materializeConstant(Inst, ConstantData, Offset);
+ if (Instrs.empty())
+ continue;
+
+ auto IIter = BB->findInstruction(&Inst);
+ It = std::next(BB->replaceInstruction(IIter, Instrs), Instrs.size());
----------------
yozhu wrote:
It should be `Instrs.size() - 1`, since the loop will do `++It` for the next iteration.
https://github.com/llvm/llvm-project/pull/165723
More information about the llvm-commits
mailing list