[PATCH] D143796: [AArch64][ISel] Always use pre-inc/post-inc addressing mode for auto-indexed load/store with constant offset.

Huihui Zhang via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Wed Feb 15 15:50:31 PST 2023


huihuiz updated this revision to Diff 497828.
huihuiz retitled this revision from "[SelectionDAG] Negate constant offset before morphing load/store node with pre-dec/post-dec addressing mode." to "[AArch64][ISel] Always use pre-inc/post-inc addressing mode for auto-indexed load/store with constant offset.".
huihuiz edited the summary of this revision.
huihuiz added a comment.
Herald added subscribers: arphaman, kristof.beyls.

Thanks Eli for the feedbacks!

Current AArch64TargetLowering::getIndexedAddressParts() is not splitting out a non-constant offset. If we are to split out a non-constant offset, we need to make sure a negate is applied to that offset.

take another t.ll below , using non-constant offset

  define i8* @test(i8* %ptr, i64 %t0, i64 %off) {
    %t1 = add nuw nsw i64 %t0, %off
    %t2 = mul i64 %t1, -4
    %t3 = getelementptr i8, i8* %ptr, i64 %t2
    %t4 = bitcast i8* %t3 to i32*
    store i32 0, i32* %t4, align 4
    %t5 = shl i64 %t1, 2
    %t6 = sub nuw nsw i64 -8, %t5
    %t7 = getelementptr i8, i8* %ptr, i64 %t6
    %t8 = bitcast i8* %t7 to i32*
    store i32 0, i32* %t8, align 4
    ret i8* %ptr
  }

We are generating

  // %bb.0:
          add     x8, x1, x2
          sub     x8, x0, x8, lsl #2
          str     wzr, [x8]  // We are not splitting out a non-constant offset
          stur    wzr, [x8, #-8]
          ret




Repository:
  rG LLVM Github Monorepo

CHANGES SINCE LAST ACTION
  https://reviews.llvm.org/D143796/new/

https://reviews.llvm.org/D143796

Files:
  llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
  llvm/test/CodeGen/AArch64/pre-indexed-addrmode-with-constant-offset.ll


Index: llvm/test/CodeGen/AArch64/pre-indexed-addrmode-with-constant-offset.ll
===================================================================
--- /dev/null
+++ llvm/test/CodeGen/AArch64/pre-indexed-addrmode-with-constant-offset.ll
@@ -0,0 +1,24 @@
+; RUN: llc -mtriple=aarch64-linux-gnu < %s | FileCheck %s
+
+; Reduced test from https://github.com/llvm/llvm-project/issues/60645.
+; To check that we are generating -32 as offset for the first store.
+
+define i8* @pr60645(i8* %ptr, i64 %t0) {
+; CHECK-LABEL: pr60645:
+; CHECK:       // %bb.0:
+; CHECK-NEXT:    sub x8, x0, x1, lsl #2
+; CHECK-NEXT:    str wzr, [x8, #-32]!
+; CHECK-NEXT:    stur wzr, [x8, #-8]
+; CHECK-NEXT:    ret
+  %t1 = add nuw nsw i64 %t0, 8
+  %t2 = mul i64 %t1, -4
+  %t3 = getelementptr i8, i8* %ptr, i64 %t2
+  %t4 = bitcast i8* %t3 to i32*
+  store i32 0, i32* %t4, align 4
+  %t5 = shl i64 %t1, 2
+  %t6 = sub nuw nsw i64 -8, %t5
+  %t7 = getelementptr i8, i8* %ptr, i64 %t6
+  %t8 = bitcast i8* %t7 to i32*
+  store i32 0, i32* %t8, align 4
+  ret i8* %ptr
+}
Index: llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
===================================================================
--- llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -21940,8 +21940,10 @@
       RHSC = -(uint64_t)RHSC;
     if (!isInt<9>(RHSC))
       return false;
-    IsInc = (Op->getOpcode() == ISD::ADD);
-    Offset = Op->getOperand(1);
+    // Always emit pre-inc/post-inc addressing mode. Constant offset is already
+    // negated when dealing with subtraction.
+    IsInc = true;
+    Offset = DAG.getConstant(RHSC, SDLoc(N), RHS->getValueType(0));
     return true;
   }
   return false;


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143796.497828.patch
Type: text/x-patch
Size: 1710 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230215/08533973/attachment.bin>


More information about the llvm-commits mailing list