[llvm] [DAG][AArch64] Handle vscale addressing modes in reassociationCanBreakAddressingModePattern (PR #89908)
David Sherwood via llvm-commits
llvm-commits at lists.llvm.org
Mon Apr 29 06:43:24 PDT 2024
================
@@ -1085,6 +1085,37 @@ bool DAGCombiner::reassociationCanBreakAddressingModePattern(unsigned Opc,
if (Opc != ISD::ADD || N0.getOpcode() != ISD::ADD)
return false;
+ // Check for vscale addressing modes.
+ // (load/store (add (add x, y), vscale))
+ // (load/store (add (add x, y), (lsl vscale, C)))
+ // (load/store (add (add x, y), (mul vscale, C)))
+ if ((N1.getOpcode() == ISD::VSCALE ||
+ ((N1.getOpcode() == ISD::SHL || N1.getOpcode() == ISD::MUL) &&
+ N1.getOperand(0).getOpcode() == ISD::VSCALE &&
+ isa<ConstantSDNode>(N1.getOperand(1)))) &&
+ N1.getValueSizeInBits() <= 64) {
+ unsigned ScalableOffset =
----------------
david-arm wrote:
A couple of things I've noticed here:
1. The AddrMode struct's ScalableOffset field is actually int64_t and the offset can be negative. e.g. add (add x, y), vscale(-3). I think we need to use int64_t here.
2. This code potentially accepts ISD::VSCALE nodes with result types of 8 or 16-bits, where there is a chance of overflow for large values of vscale. Is it worth just restricting this to integer types that are suitable for pointer arithmetic?
https://github.com/llvm/llvm-project/pull/89908
More information about the llvm-commits
mailing list