[llvm] [AArch64] computeKnownBitsForTargetNode - add AArch64ISD::MOVIshift support (PR #148634)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 14 06:46:15 PDT 2025


llvmbot wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-aarch64

Author: Simon Pilgrim (RKSimon)

<details>
<summary>Changes</summary>

Fixes #<!-- -->148596

---
Full diff: https://github.com/llvm/llvm-project/pull/148634.diff


5 Files Affected:

- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+7) 
- (modified) llvm/test/CodeGen/AArch64/arm64-zip.ll (+1-1) 
- (modified) llvm/test/CodeGen/AArch64/combine-mul.ll (+1-4) 
- (modified) llvm/test/CodeGen/AArch64/fast-isel-cmp-vec.ll (-3) 
- (modified) llvm/test/CodeGen/AArch64/zext-to-tbl.ll (+35-36) 


``````````diff
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index 55601e6327e98..bde4ba993f69e 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -2600,6 +2600,12 @@ void AArch64TargetLowering::computeKnownBitsForTargetNode(
         APInt(Known.getBitWidth(), Op->getConstantOperandVal(0)));
     break;
   }
+  case AArch64ISD::MOVIshift: {
+    Known = KnownBits::makeConstant(
+        APInt(Known.getBitWidth(), Op->getConstantOperandVal(0)
+                                       << Op->getConstantOperandVal(1)));
+    break;
+  }
   case AArch64ISD::LOADgot:
   case AArch64ISD::ADDlow: {
     if (!Subtarget->isTargetILP32())
@@ -30287,6 +30293,7 @@ bool AArch64TargetLowering::SimplifyDemandedBitsForTargetNode(
 bool AArch64TargetLowering::isTargetCanonicalConstantNode(SDValue Op) const {
   return Op.getOpcode() == AArch64ISD::DUP ||
          Op.getOpcode() == AArch64ISD::MOVI ||
+         Op.getOpcode() == AArch64ISD::MOVIshift ||
          (Op.getOpcode() == ISD::EXTRACT_SUBVECTOR &&
           Op.getOperand(0).getOpcode() == AArch64ISD::DUP) ||
          TargetLowering::isTargetCanonicalConstantNode(Op);
diff --git a/llvm/test/CodeGen/AArch64/arm64-zip.ll b/llvm/test/CodeGen/AArch64/arm64-zip.ll
index 20d0c7f1b7085..9b06620590cda 100644
--- a/llvm/test/CodeGen/AArch64/arm64-zip.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-zip.ll
@@ -454,7 +454,7 @@ define <4 x i32> @shuffle_zip3(<4 x i32> %arg) {
 ; CHECK-NEXT:    zip2.4h v0, v0, v1
 ; CHECK-NEXT:    movi.4s v1, #1
 ; CHECK-NEXT:    zip1.4h v0, v0, v0
-; CHECK-NEXT:    sshll.4s v0, v0, #0
+; CHECK-NEXT:    ushll.4s v0, v0, #0
 ; CHECK-NEXT:    and.16b v0, v0, v1
 ; CHECK-NEXT:    ret
 bb:
diff --git a/llvm/test/CodeGen/AArch64/combine-mul.ll b/llvm/test/CodeGen/AArch64/combine-mul.ll
index c49e5ae6620a9..ff6d1a571a084 100644
--- a/llvm/test/CodeGen/AArch64/combine-mul.ll
+++ b/llvm/test/CodeGen/AArch64/combine-mul.ll
@@ -28,10 +28,7 @@ define <4 x i1> @PR48683_vec(<4 x i32> %x) {
 define <4 x i1> @PR48683_vec_undef(<4 x i32> %x) {
 ; CHECK-LABEL: PR48683_vec_undef:
 ; CHECK:       // %bb.0:
-; CHECK-NEXT:    movi v1.4s, #2
-; CHECK-NEXT:    mul v0.4s, v0.4s, v0.4s
-; CHECK-NEXT:    cmtst v0.4s, v0.4s, v1.4s
-; CHECK-NEXT:    xtn v0.4h, v0.4s
+; CHECK-NEXT:    movi v0.2d, #0000000000000000
 ; CHECK-NEXT:    ret
   %a = mul <4 x i32> %x, %x
   %b = and <4 x i32> %a, <i32 2, i32 2, i32 2, i32 undef>
diff --git a/llvm/test/CodeGen/AArch64/fast-isel-cmp-vec.ll b/llvm/test/CodeGen/AArch64/fast-isel-cmp-vec.ll
index ee2d940b8573a..11f36508c42d0 100644
--- a/llvm/test/CodeGen/AArch64/fast-isel-cmp-vec.ll
+++ b/llvm/test/CodeGen/AArch64/fast-isel-cmp-vec.ll
@@ -26,7 +26,6 @@ define <2 x i32> @icmp_constfold_v2i32(<2 x i32> %a) {
 ; CHECK-LABEL: icmp_constfold_v2i32:
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    movi.2s v0, #1
-; CHECK-NEXT:    and.8b v0, v0, v0
 ; CHECK-NEXT:    ret
   %1 = icmp eq <2 x i32> %a, %a
   br label %bb2
@@ -56,8 +55,6 @@ define <4 x i32> @icmp_constfold_v4i32(<4 x i32> %a) {
 ; CHECK-LABEL: icmp_constfold_v4i32:
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    movi.4h v0, #1
-; CHECK-NEXT:  ; %bb.1: ; %bb2
-; CHECK-NEXT:    and.8b v0, v0, v0
 ; CHECK-NEXT:    ushll.4s v0, v0, #0
 ; CHECK-NEXT:    ret
   %1 = icmp eq <4 x i32> %a, %a
diff --git a/llvm/test/CodeGen/AArch64/zext-to-tbl.ll b/llvm/test/CodeGen/AArch64/zext-to-tbl.ll
index 2a37183c47d51..74a717f1635a3 100644
--- a/llvm/test/CodeGen/AArch64/zext-to-tbl.ll
+++ b/llvm/test/CodeGen/AArch64/zext-to-tbl.ll
@@ -1246,33 +1246,33 @@ define void @zext_v16i4_to_v16i32_in_loop(ptr %src, ptr %dst) {
 ; CHECK-NEXT:    add x8, x8, #16
 ; CHECK-NEXT:    cmp x8, #128
 ; CHECK-NEXT:    ubfx x12, x9, #48, #4
-; CHECK-NEXT:    ubfx x10, x9, #52, #4
-; CHECK-NEXT:    ubfx x14, x9, #32, #4
+; CHECK-NEXT:    lsr x10, x9, #52
+; CHECK-NEXT:    ubfx x13, x9, #32, #4
 ; CHECK-NEXT:    ubfx w15, w9, #16, #4
-; CHECK-NEXT:    ubfx x11, x9, #36, #4
-; CHECK-NEXT:    ubfx w13, w9, #20, #4
+; CHECK-NEXT:    lsr x11, x9, #36
+; CHECK-NEXT:    lsr w14, w9, #20
 ; CHECK-NEXT:    fmov s1, w12
-; CHECK-NEXT:    fmov s2, w14
-; CHECK-NEXT:    ubfx w12, w9, #4, #4
+; CHECK-NEXT:    fmov s2, w13
+; CHECK-NEXT:    lsr w12, w9, #4
 ; CHECK-NEXT:    fmov s3, w15
 ; CHECK-NEXT:    mov.h v1[1], w10
 ; CHECK-NEXT:    and w10, w9, #0xf
 ; CHECK-NEXT:    mov.h v2[1], w11
 ; CHECK-NEXT:    fmov s4, w10
-; CHECK-NEXT:    ubfx x11, x9, #56, #4
-; CHECK-NEXT:    mov.h v3[1], w13
-; CHECK-NEXT:    ubfx x10, x9, #40, #4
+; CHECK-NEXT:    lsr x11, x9, #56
+; CHECK-NEXT:    mov.h v3[1], w14
+; CHECK-NEXT:    lsr x10, x9, #40
 ; CHECK-NEXT:    mov.h v4[1], w12
-; CHECK-NEXT:    ubfx w12, w9, #24, #4
+; CHECK-NEXT:    lsr w12, w9, #24
 ; CHECK-NEXT:    mov.h v1[2], w11
-; CHECK-NEXT:    ubfx w11, w9, #8, #4
+; CHECK-NEXT:    lsr w11, w9, #8
 ; CHECK-NEXT:    mov.h v2[2], w10
 ; CHECK-NEXT:    lsr x10, x9, #60
 ; CHECK-NEXT:    mov.h v3[2], w12
-; CHECK-NEXT:    ubfx x12, x9, #44, #4
+; CHECK-NEXT:    lsr x12, x9, #44
 ; CHECK-NEXT:    mov.h v4[2], w11
 ; CHECK-NEXT:    lsr w11, w9, #28
-; CHECK-NEXT:    ubfx w9, w9, #12, #4
+; CHECK-NEXT:    lsr w9, w9, #12
 ; CHECK-NEXT:    mov.h v1[3], w10
 ; CHECK-NEXT:    mov.h v2[3], w12
 ; CHECK-NEXT:    mov.h v3[3], w11
@@ -1300,38 +1300,37 @@ define void @zext_v16i4_to_v16i32_in_loop(ptr %src, ptr %dst) {
 ; CHECK-BE-NEXT:    ldr x9, [x0, x8]
 ; CHECK-BE-NEXT:    add x8, x8, #16
 ; CHECK-BE-NEXT:    cmp x8, #128
-; CHECK-BE-NEXT:    ubfx w12, w9, #12, #4
+; CHECK-BE-NEXT:    ubfx w11, w9, #12, #4
 ; CHECK-BE-NEXT:    lsr w14, w9, #28
-; CHECK-BE-NEXT:    ubfx w10, w9, #8, #4
+; CHECK-BE-NEXT:    lsr w10, w9, #8
 ; CHECK-BE-NEXT:    ubfx x15, x9, #44, #4
-; CHECK-BE-NEXT:    ubfx w11, w9, #24, #4
-; CHECK-BE-NEXT:    ubfx x13, x9, #40, #4
-; CHECK-BE-NEXT:    fmov s1, w12
-; CHECK-BE-NEXT:    lsr x12, x9, #60
+; CHECK-BE-NEXT:    lsr w12, w9, #24
+; CHECK-BE-NEXT:    lsr x13, x9, #40
+; CHECK-BE-NEXT:    fmov s1, w11
+; CHECK-BE-NEXT:    lsr x11, x9, #60
 ; CHECK-BE-NEXT:    fmov s2, w14
 ; CHECK-BE-NEXT:    fmov s3, w15
-; CHECK-BE-NEXT:    fmov s4, w12
-; CHECK-BE-NEXT:    ubfx w12, w9, #20, #4
+; CHECK-BE-NEXT:    fmov s4, w11
+; CHECK-BE-NEXT:    lsr w11, w9, #20
 ; CHECK-BE-NEXT:    mov v1.h[1], w10
-; CHECK-BE-NEXT:    ubfx x10, x9, #56, #4
-; CHECK-BE-NEXT:    mov v2.h[1], w11
-; CHECK-BE-NEXT:    ubfx w11, w9, #4, #4
+; CHECK-BE-NEXT:    lsr x10, x9, #56
+; CHECK-BE-NEXT:    mov v2.h[1], w12
+; CHECK-BE-NEXT:    lsr w12, w9, #4
 ; CHECK-BE-NEXT:    mov v3.h[1], w13
 ; CHECK-BE-NEXT:    mov v4.h[1], w10
-; CHECK-BE-NEXT:    ubfx x10, x9, #36, #4
-; CHECK-BE-NEXT:    mov v1.h[2], w11
-; CHECK-BE-NEXT:    ubfx x11, x9, #52, #4
-; CHECK-BE-NEXT:    mov v2.h[2], w12
+; CHECK-BE-NEXT:    lsr x10, x9, #36
+; CHECK-BE-NEXT:    mov v1.h[2], w12
+; CHECK-BE-NEXT:    lsr x12, x9, #52
+; CHECK-BE-NEXT:    mov v2.h[2], w11
 ; CHECK-BE-NEXT:    mov v3.h[2], w10
-; CHECK-BE-NEXT:    and w10, w9, #0xf
-; CHECK-BE-NEXT:    ubfx w12, w9, #16, #4
-; CHECK-BE-NEXT:    mov v4.h[2], w11
-; CHECK-BE-NEXT:    ubfx x11, x9, #32, #4
-; CHECK-BE-NEXT:    ubfx x9, x9, #48, #4
-; CHECK-BE-NEXT:    mov v1.h[3], w10
-; CHECK-BE-NEXT:    mov v2.h[3], w12
-; CHECK-BE-NEXT:    add x10, x1, #32
+; CHECK-BE-NEXT:    lsr w10, w9, #16
+; CHECK-BE-NEXT:    lsr x11, x9, #32
+; CHECK-BE-NEXT:    mov v4.h[2], w12
+; CHECK-BE-NEXT:    mov v1.h[3], w9
+; CHECK-BE-NEXT:    lsr x9, x9, #48
+; CHECK-BE-NEXT:    mov v2.h[3], w10
 ; CHECK-BE-NEXT:    mov v3.h[3], w11
+; CHECK-BE-NEXT:    add x10, x1, #32
 ; CHECK-BE-NEXT:    mov v4.h[3], w9
 ; CHECK-BE-NEXT:    add x9, x1, #48
 ; CHECK-BE-NEXT:    ushll v1.4s, v1.4h, #0

``````````

</details>


https://github.com/llvm/llvm-project/pull/148634


More information about the llvm-commits mailing list