[llvm] [AArch64] Verify ldp/stp alignment stricter (PR #83948)
Yuta Mukai via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 5 20:59:23 PST 2024
================
@@ -2349,31 +2348,38 @@ bool AArch64LoadStoreOpt::tryToPairLdStInst(MachineBasicBlock::iterator &MBBI) {
MachineMemOperand *MemOp =
MI.memoperands_empty() ? nullptr : MI.memoperands().front();
- // Get the needed alignments to check them if
- // ldp-aligned-only/stp-aligned-only features are opted.
- uint64_t MemAlignment = MemOp ? MemOp->getAlign().value() : -1;
- uint64_t TypeAlignment = MemOp ? Align(MemOp->getSize()).value() : -1;
+ // If a load/store arrives and ldp/stp-aligned-only feature is opted, check
+ // that the alignment of the source pointer is at least double the alignment
+ // of the type.
+ if ((MI.mayLoad() && Subtarget->hasLdpAlignedOnly()) ||
+ (MI.mayStore() && Subtarget->hasStpAlignedOnly())) {
+ // If there is no size/align information, cancel the transformation.
+ if (!MemOp || !MemOp->getMemoryType().isValid()) {
+ NumFailedAlignmentCheck++;
+ return false;
+ }
- // If a load arrives and ldp-aligned-only feature is opted, check that the
- // alignment of the source pointer is at least double the alignment of the
- // type.
- if (MI.mayLoad() && Subtarget->hasLdpAlignedOnly() && MemOp &&
- MemAlignment < 2 * TypeAlignment)
- return false;
+ // Get the needed alignments to check them if
+ // ldp-aligned-only/stp-aligned-only features are opted.
+ uint64_t MemAlignment = MemOp->getAlign().value();
+ uint64_t TypeAlignment = Align(MemOp->getSize()).value();
- // If a store arrives and stp-aligned-only feature is opted, check that the
- // alignment of the source pointer is at least double the alignment of the
- // type.
- if (MI.mayStore() && Subtarget->hasStpAlignedOnly() && MemOp &&
- MemAlignment < 2 * TypeAlignment)
- return false;
+ if (MemAlignment < 2 * TypeAlignment) {
+ NumFailedAlignmentCheck++;
+ return false;
+ }
+ }
MBBI = mergePairedInsns(MBBI, Paired, Flags);
// Collect liveness info for instructions between Prev and the new position
// MBBI.
for (auto I = std::next(Prev); I != MBBI; I++)
updateDefinedRegisters(*I, DefinedInBB, TRI);
+ ++NumPairCreated;
+ if (TII->hasUnscaledLdStOffset(MI))
----------------
ytmukai wrote:
This line must precede the update. I'll modify it and resubmit a patch.
https://github.com/llvm/llvm-project/pull/83948
More information about the llvm-commits
mailing list