[llvm] [AArch64] Fix DUP-of-extload combine to ignore chain uses (PR #201351)
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jun 3 06:04:21 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: Guy David (guy-david)
<details>
<summary>Changes</summary>
The original combine bailed when the load had more than one use, but counted chain uses too.
---
Full diff: https://github.com/llvm/llvm-project/pull/201351.diff
2 Files Affected:
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+1-1)
- (modified) llvm/test/CodeGen/AArch64/dup.ll (+6-6)
``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 89466adf7d4f3..40dd3fe11e982 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -28461,7 +28461,7 @@ static SDValue performDUPCombine(SDNode *N,
EVT ElemVT = VT.getVectorElementType();
if ((ExtType == ISD::EXTLOAD || ExtType == ISD::ZEXTLOAD) &&
(MemVT == MVT::i8 || MemVT == MVT::i16 || MemVT == MVT::i32) &&
- ElemVT != MemVT && LD->hasOneUse()) {
+ ElemVT != MemVT && Op.hasOneUse()) {
EVT Vec128VT = EVT::getVectorVT(*DCI.DAG.getContext(), ElemVT,
128 / ElemVT.getSizeInBits());
SDValue ScalarToVec =
diff --git a/llvm/test/CodeGen/AArch64/dup.ll b/llvm/test/CodeGen/AArch64/dup.ll
index 7d5a2fad6de6b..593f30de20b1a 100644
--- a/llvm/test/CodeGen/AArch64/dup.ll
+++ b/llvm/test/CodeGen/AArch64/dup.ll
@@ -74,9 +74,9 @@ entry:
define <2 x i8> @loaddup_str_v2i8(ptr %p) {
; CHECK-SD-LABEL: loaddup_str_v2i8:
; CHECK-SD: // %bb.0: // %entry
-; CHECK-SD-NEXT: ldrb w8, [x0]
+; CHECK-SD-NEXT: ldr b0, [x0]
; CHECK-SD-NEXT: strb wzr, [x0]
-; CHECK-SD-NEXT: dup v0.2s, w8
+; CHECK-SD-NEXT: dup v0.2s, v0.s[0]
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: loaddup_str_v2i8:
@@ -247,9 +247,9 @@ entry:
define <4 x i8> @loaddup_str_v4i8(ptr %p) {
; CHECK-SD-LABEL: loaddup_str_v4i8:
; CHECK-SD: // %bb.0: // %entry
-; CHECK-SD-NEXT: ldrb w8, [x0]
+; CHECK-SD-NEXT: ldr b0, [x0]
; CHECK-SD-NEXT: strb wzr, [x0]
-; CHECK-SD-NEXT: dup v0.4h, w8
+; CHECK-SD-NEXT: dup v0.4h, v0.h[0]
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: loaddup_str_v4i8:
@@ -498,9 +498,9 @@ entry:
define <2 x i16> @loaddup_str_v2i16(ptr %p) {
; CHECK-SD-LABEL: loaddup_str_v2i16:
; CHECK-SD: // %bb.0: // %entry
-; CHECK-SD-NEXT: ldrh w8, [x0]
+; CHECK-SD-NEXT: ldr h0, [x0]
; CHECK-SD-NEXT: strh wzr, [x0]
-; CHECK-SD-NEXT: dup v0.2s, w8
+; CHECK-SD-NEXT: dup v0.2s, v0.s[0]
; CHECK-SD-NEXT: ret
;
; CHECK-GI-LABEL: loaddup_str_v2i16:
``````````
</details>
https://github.com/llvm/llvm-project/pull/201351
More information about the llvm-commits
mailing list