[llvm] [AArch64] Fold DUPLANE of 0 to zeroimm (PR #228415)
via llvm-commits
llvm-commits at lists.llvm.org
Fri Oct 2 05:24:04 PDT 2026
llvmorg-github-actions[bot] wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-backend-aarch64
Author: David Green (davemgreen)
<details>
<summary>Changes</summary>
This folds away DUPLANE8/16/32/64 of zero into a zero vector, which should be simpler and possibly allow other folds.
---
Full diff: https://github.com/llvm/llvm-project/pull/228415.diff
3 Files Affected:
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+10)
- (modified) llvm/test/CodeGen/AArch64/arm64-rev.ll (-1)
- (modified) llvm/test/CodeGen/AArch64/shuffle-insert-zero.ll (+2-7)
``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 9885dfc854d11..f94368be0cb8f 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -30418,6 +30418,16 @@ static SDValue performDUPCombine(SDNode *N,
}
return performPostLD1Combine(N, DCI, false);
+ } else { // AArch64ISD::DUPLANE8/16/32/64
+ SDValue SrcOp = N->getOperand(0);
+ APInt InDemandedElts =
+ APInt::getOneBitSet(SrcOp.getValueType().getVectorNumElements(),
+ N->getConstantOperandVal(1));
+ KnownBits Known = DCI.DAG.computeKnownBits(SrcOp, InDemandedElts);
+ if (Known.isZero())
+ return DCI.DAG.getBitcast(
+ VT, DCI.DAG.getConstant(Known.getConstant(), DL,
+ VT.changeVectorElementTypeToInteger()));
}
return SDValue();
diff --git a/llvm/test/CodeGen/AArch64/arm64-rev.ll b/llvm/test/CodeGen/AArch64/arm64-rev.ll
index a3c727c64ec02..1c88859df83aa 100644
--- a/llvm/test/CodeGen/AArch64/arm64-rev.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-rev.ll
@@ -491,7 +491,6 @@ define void @float_vrev64(ptr nocapture %source, ptr nocapture %dest) nounwind n
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: movi.2d v0, #0000000000000000
; CHECK-SD-NEXT: add x8, x0, #12
-; CHECK-SD-NEXT: dup.4s v0, v0[0]
; CHECK-SD-NEXT: ld1.s { v0 }[1], [x8]
; CHECK-SD-NEXT: str q0, [x1, #176]
; CHECK-SD-NEXT: ret
diff --git a/llvm/test/CodeGen/AArch64/shuffle-insert-zero.ll b/llvm/test/CodeGen/AArch64/shuffle-insert-zero.ll
index 599e626ddcae1..04872b503a146 100644
--- a/llvm/test/CodeGen/AArch64/shuffle-insert-zero.ll
+++ b/llvm/test/CodeGen/AArch64/shuffle-insert-zero.ll
@@ -53,7 +53,6 @@ define <4 x float> @testv4f32_1(<4 x float> noundef %vec) {
; CHECK-SD-LABEL: testv4f32_1:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: movi v1.2d, #0000000000000000
-; CHECK-SD-NEXT: dup v1.4s, v1.s[0]
; CHECK-SD-NEXT: mov v1.s[0], v0.s[0]
; CHECK-SD-NEXT: mov v0.16b, v1.16b
; CHECK-SD-NEXT: ret
@@ -166,9 +165,8 @@ entry:
define <4 x half> @testv4f16_1(<4 x half> noundef %vec) {
; CHECK-SD-LABEL: testv4f16_1:
; CHECK-SD: // %bb.0: // %entry
-; CHECK-SD-NEXT: movi d1, #0000000000000000
+; CHECK-SD-NEXT: movi v1.2d, #0000000000000000
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
-; CHECK-SD-NEXT: dup v1.4h, v1.h[0]
; CHECK-SD-NEXT: mov v1.h[0], v0.h[0]
; CHECK-SD-NEXT: fmov d0, d1
; CHECK-SD-NEXT: ret
@@ -245,9 +243,8 @@ entry:
define <4 x bfloat> @testv4bf16_1(<4 x bfloat> noundef %vec) {
; CHECK-SD-LABEL: testv4bf16_1:
; CHECK-SD: // %bb.0: // %entry
-; CHECK-SD-NEXT: movi d1, #0000000000000000
+; CHECK-SD-NEXT: movi v1.2d, #0000000000000000
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
-; CHECK-SD-NEXT: dup v1.4h, v1.h[0]
; CHECK-SD-NEXT: mov v1.h[0], v0.h[0]
; CHECK-SD-NEXT: fmov d0, d1
; CHECK-SD-NEXT: ret
@@ -317,7 +314,6 @@ define <4 x i32> @testv4i32_1(<4 x i32> noundef %vec) {
; CHECK-SD-LABEL: testv4i32_1:
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: movi v1.2d, #0000000000000000
-; CHECK-SD-NEXT: dup v1.4s, v1.s[0]
; CHECK-SD-NEXT: mov v1.s[0], v0.s[0]
; CHECK-SD-NEXT: mov v0.16b, v1.16b
; CHECK-SD-NEXT: ret
@@ -412,7 +408,6 @@ define <4 x i16> @testv4i16_1(<4 x i16> noundef %vec) {
; CHECK-SD: // %bb.0: // %entry
; CHECK-SD-NEXT: movi v1.2d, #0000000000000000
; CHECK-SD-NEXT: // kill: def $d0 killed $d0 def $q0
-; CHECK-SD-NEXT: dup v1.4h, v1.h[0]
; CHECK-SD-NEXT: mov v1.h[0], v0.h[0]
; CHECK-SD-NEXT: fmov d0, d1
; CHECK-SD-NEXT: ret
``````````
</details>
https://github.com/llvm/llvm-project/pull/228415
More information about the llvm-commits
mailing list