[llvm] [DAGCombine][AArch64][X86] Adjust profitability check on and(anyext, c) -> zext(and) transform (PR #214749)

via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 7 07:45:53 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 existing fold was using a profitability check that did not work for vector operations. It can be profitable to fold (and (anyext V), c) -> (zext (and V, c)) if it allows the And to work on a narrower type and possibly for the zext to be folded into other operations.

The combine is profitable or equal if the zext is the same cost as a anyext. The old isTruncFree was removed as the value being truncated is a constant. A basic version of isNarrowingProfitable is added for AArch64 to allow vector types to fold providing that the result type is legal.

---

Patch is 40.55 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/214749.diff


16 Files Affected:

- (modified) llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp (+2-2) 
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.cpp (+5) 
- (modified) llvm/lib/Target/AArch64/AArch64ISelLowering.h (+2) 
- (modified) llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll (+6-9) 
- (modified) llvm/test/CodeGen/AArch64/arm64-zip.ll (+5-5) 
- (modified) llvm/test/CodeGen/AArch64/bitcast-extend.ll (+11-12) 
- (modified) llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll (+11-25) 
- (modified) llvm/test/CodeGen/AArch64/extbinopload.ll (+7-9) 
- (modified) llvm/test/CodeGen/AArch64/neon-extadd.ll (+20-29) 
- (modified) llvm/test/CodeGen/AArch64/setcc_knownbits.ll (+4-2) 
- (modified) llvm/test/CodeGen/AArch64/vec3-loads-ext-trunc-stores.ll (+15-29) 
- (modified) llvm/test/CodeGen/AArch64/vselect-constants.ll (+2-2) 
- (modified) llvm/test/CodeGen/AArch64/zext-to-tbl.ll (+47-53) 
- (modified) llvm/test/CodeGen/AArch64/zext.ll (+48-53) 
- (modified) llvm/test/CodeGen/X86/vector-compress.ll (+6-6) 
- (modified) llvm/test/CodeGen/X86/vector-zext.ll (+1-1) 


``````````diff
diff --git a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
index a11e21769954f..137950ef2daf3 100644
--- a/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
+++ b/llvm/lib/CodeGen/SelectionDAG/DAGCombiner.cpp
@@ -7914,9 +7914,9 @@ SDValue DAGCombiner::visitAND(SDNode *N) {
     if (DAG.MaskedValueIsZero(N0Op0, Mask))
       return DAG.getNode(ISD::ZERO_EXTEND, DL, VT, N0Op0);
 
-    // fold (and (any_ext V), c) -> (zero_ext (and (trunc V), c)) if profitable.
+    // fold (and (any_ext V), c) -> (zero_ext (and V, c)) if profitable.
     if (N1C->getAPIntValue().countLeadingZeros() >= (BitWidth - SrcBitWidth) &&
-        TLI.isTruncateFree(VT, SrcVT) && TLI.isZExtFree(SrcVT, VT) &&
+        (TLI.isZExtFree(SrcVT, VT) || VT.isVector()) &&
         TLI.isTypeDesirableForOp(ISD::AND, SrcVT) &&
         TLI.isNarrowingProfitable(N, VT, SrcVT))
       return DAG.getNode(ISD::ZERO_EXTEND, DL, VT,
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
index da29cd751c80e..a19a56a6208fe 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.cpp
@@ -20178,6 +20178,11 @@ ArrayRef<MCPhysReg> AArch64TargetLowering::getRoundingControlRegisters() const {
   return RCRegs;
 }
 
+bool AArch64TargetLowering::isNarrowingProfitable(SDNode *N, EVT SrcVT,
+                                                  EVT DestVT) const {
+  return isTypeLegal(DestVT) && DestVT.isVector();
+}
+
 bool
 AArch64TargetLowering::isDesirableToCommuteWithShift(const SDNode *N,
                                                      CombineLevel Level) const {
diff --git a/llvm/lib/Target/AArch64/AArch64ISelLowering.h b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
index 66a6261d2a991..5f12ae0e8b998 100644
--- a/llvm/lib/Target/AArch64/AArch64ISelLowering.h
+++ b/llvm/lib/Target/AArch64/AArch64ISelLowering.h
@@ -296,6 +296,8 @@ class AArch64TargetLowering : public TargetLowering {
   const MCPhysReg *getScratchRegisters(CallingConv::ID CC) const override;
   ArrayRef<MCPhysReg> getRoundingControlRegisters() const override;
 
+  bool isNarrowingProfitable(SDNode *N, EVT SrcVT, EVT DestVT) const override;
+
   /// Returns false if N is a bit extraction pattern of (X >> C) & Mask.
   bool isDesirableToCommuteWithShift(const SDNode *N,
                                      CombineLevel Level) const override;
diff --git a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll
index 9a7a4f4b316c1..66606ba4bad59 100644
--- a/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll
+++ b/llvm/test/CodeGen/AArch64/aarch64-matrix-umull-smull.ll
@@ -824,7 +824,7 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none
 ; CHECK-SD-NEXT:  .LBB6_10: // %vec.epilog.ph
 ; CHECK-SD-NEXT:    mov w11, w1
 ; CHECK-SD-NEXT:    movi v0.2d, #0000000000000000
-; CHECK-SD-NEXT:    movi v3.2d, #0x000000000000ff
+; CHECK-SD-NEXT:    movi d3, #0x0000ff000000ff
 ; CHECK-SD-NEXT:    sxtb x11, w11
 ; CHECK-SD-NEXT:    fmov d2, x8
 ; CHECK-SD-NEXT:    dup v1.2s, w11
@@ -838,14 +838,11 @@ define i64 @red_mla_dup_ext_u8_s8_s64(ptr noalias noundef readonly captures(none
 ; CHECK-SD-NEXT:    adds x8, x8, #4
 ; CHECK-SD-NEXT:    ushll v4.8h, v4.8b, #0
 ; CHECK-SD-NEXT:    ushll v4.4s, v4.4h, #0
-; CHECK-SD-NEXT:    ushll v5.2d, v4.2s, #0
-; CHECK-SD-NEXT:    ushll2 v4.2d, v4.4s, #0
-; CHECK-SD-NEXT:    and v5.16b, v5.16b, v3.16b
-; CHECK-SD-NEXT:    and v4.16b, v4.16b, v3.16b
-; CHECK-SD-NEXT:    xtn v5.2s, v5.2d
-; CHECK-SD-NEXT:    xtn v4.2s, v4.2d
-; CHECK-SD-NEXT:    smlal v0.2d, v1.2s, v4.2s
-; CHECK-SD-NEXT:    smlal v2.2d, v1.2s, v5.2s
+; CHECK-SD-NEXT:    mov d5, v4.d[1]
+; CHECK-SD-NEXT:    and v4.8b, v4.8b, v3.8b
+; CHECK-SD-NEXT:    smlal v2.2d, v1.2s, v4.2s
+; CHECK-SD-NEXT:    and v5.8b, v5.8b, v3.8b
+; CHECK-SD-NEXT:    smlal v0.2d, v1.2s, v5.2s
 ; CHECK-SD-NEXT:    b.ne .LBB6_11
 ; CHECK-SD-NEXT:  // %bb.12: // %vec.epilog.middle.block
 ; CHECK-SD-NEXT:    add v0.2d, v2.2d, v0.2d
diff --git a/llvm/test/CodeGen/AArch64/arm64-zip.ll b/llvm/test/CodeGen/AArch64/arm64-zip.ll
index cf76b02141758..bf017686ecc22 100644
--- a/llvm/test/CodeGen/AArch64/arm64-zip.ll
+++ b/llvm/test/CodeGen/AArch64/arm64-zip.ll
@@ -433,14 +433,14 @@ define <4 x i32> @shuffle_zip2(<4 x i32> %arg) {
 ; CHECK-SD-LABEL: shuffle_zip2:
 ; CHECK-SD:       // %bb.0: // %bb
 ; CHECK-SD-NEXT:    cmtst.4s v0, v0, v0
-; CHECK-SD-NEXT:    uzp1.8h v1, v0, v0
+; CHECK-SD-NEXT:    movi.4h v1, #1
+; CHECK-SD-NEXT:    uzp1.8h v2, v0, v0
 ; CHECK-SD-NEXT:    xtn.4h v0, v0
-; CHECK-SD-NEXT:    xtn.4h v1, v1
-; CHECK-SD-NEXT:    zip2.4h v0, v0, v1
-; CHECK-SD-NEXT:    movi.4s v1, #1
+; CHECK-SD-NEXT:    xtn.4h v2, v2
+; CHECK-SD-NEXT:    zip2.4h v0, v0, v2
 ; CHECK-SD-NEXT:    zip1.4h v0, v0, v0
+; CHECK-SD-NEXT:    and.8b v0, v0, v1
 ; CHECK-SD-NEXT:    ushll.4s v0, v0, #0
-; CHECK-SD-NEXT:    and.16b v0, v0, v1
 ; CHECK-SD-NEXT:    ret
 ;
 ; CHECK-GI-LABEL: shuffle_zip2:
diff --git a/llvm/test/CodeGen/AArch64/bitcast-extend.ll b/llvm/test/CodeGen/AArch64/bitcast-extend.ll
index 23cfe5a2f399f..d41f2b3f07311 100644
--- a/llvm/test/CodeGen/AArch64/bitcast-extend.ll
+++ b/llvm/test/CodeGen/AArch64/bitcast-extend.ll
@@ -25,10 +25,9 @@ define <4 x i32> @z_i32_v4i32(i32 %x) {
 ; CHECK-SD-LABEL: z_i32_v4i32:
 ; CHECK-SD:       // %bb.0:
 ; CHECK-SD-NEXT:    fmov s0, w0
-; CHECK-SD-NEXT:    movi v1.2d, #0x0000ff000000ff
 ; CHECK-SD-NEXT:    zip1 v0.8b, v0.8b, v0.8b
+; CHECK-SD-NEXT:    bic v0.4h, #255, lsl #8
 ; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
-; CHECK-SD-NEXT:    and v0.16b, v0.16b, v1.16b
 ; CHECK-SD-NEXT:    ret
 ;
 ; CHECK-GI-LABEL: z_i32_v4i32:
@@ -61,16 +60,16 @@ define <4 x i32> @z_i32_v4i32(i32 %x) {
 define <4 x i64> @z_i32_v4i64(i32 %x) {
 ; CHECK-SD-LABEL: z_i32_v4i64:
 ; CHECK-SD:       // %bb.0:
-; CHECK-SD-NEXT:    fmov s0, w0
-; CHECK-SD-NEXT:    movi v1.2d, #0x000000000000ff
-; CHECK-SD-NEXT:    mov b2, v0.b[0]
-; CHECK-SD-NEXT:    mov b3, v0.b[2]
-; CHECK-SD-NEXT:    mov v2.b[4], v0.b[1]
-; CHECK-SD-NEXT:    mov v3.b[4], v0.b[3]
-; CHECK-SD-NEXT:    ushll v0.2d, v2.2s, #0
-; CHECK-SD-NEXT:    ushll v2.2d, v3.2s, #0
-; CHECK-SD-NEXT:    and v0.16b, v0.16b, v1.16b
-; CHECK-SD-NEXT:    and v1.16b, v2.16b, v1.16b
+; CHECK-SD-NEXT:    fmov s1, w0
+; CHECK-SD-NEXT:    movi d0, #0x0000ff000000ff
+; CHECK-SD-NEXT:    mov b2, v1.b[0]
+; CHECK-SD-NEXT:    mov b3, v1.b[2]
+; CHECK-SD-NEXT:    mov v2.b[4], v1.b[1]
+; CHECK-SD-NEXT:    mov v3.b[4], v1.b[3]
+; CHECK-SD-NEXT:    and v1.8b, v2.8b, v0.8b
+; CHECK-SD-NEXT:    and v2.8b, v3.8b, v0.8b
+; CHECK-SD-NEXT:    ushll v0.2d, v1.2s, #0
+; CHECK-SD-NEXT:    ushll v1.2d, v2.2s, #0
 ; CHECK-SD-NEXT:    ret
 ;
 ; CHECK-GI-LABEL: z_i32_v4i64:
diff --git a/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll b/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll
index a4f20905a85c2..9eb143604f4c4 100644
--- a/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll
+++ b/llvm/test/CodeGen/AArch64/complex-deinterleaving-crash.ll
@@ -35,7 +35,7 @@ define i32 @check_deinterleaving_has_deinterleave(ptr %a) {
 ; CHECK-LABEL: check_deinterleaving_has_deinterleave:
 ; CHECK:       // %bb.0: // %entry
 ; CHECK-NEXT:    movi v0.2d, #0000000000000000
-; CHECK-NEXT:    movi v2.4s, #1
+; CHECK-NEXT:    movi v2.16b, #1
 ; CHECK-NEXT:    add x8, x0, #16
 ; CHECK-NEXT:    movi v1.2d, #0000000000000000
 ; CHECK-NEXT:    movi v4.2d, #0000000000000000
@@ -52,34 +52,20 @@ define i32 @check_deinterleaving_has_deinterleave(ptr %a) {
 ; CHECK-NEXT:    add x8, x8, #32
 ; CHECK-NEXT:    cmeq v17.16b, v17.16b, #0
 ; CHECK-NEXT:    cmeq v18.16b, v18.16b, #0
+; CHECK-NEXT:    and v17.16b, v17.16b, v2.16b
+; CHECK-NEXT:    and v18.16b, v18.16b, v2.16b
 ; CHECK-NEXT:    ushll2 v19.8h, v17.16b, #0
 ; CHECK-NEXT:    ushll v17.8h, v17.8b, #0
 ; CHECK-NEXT:    ushll2 v20.8h, v18.16b, #0
 ; CHECK-NEXT:    ushll v18.8h, v18.8b, #0
-; CHECK-NEXT:    ushll v21.4s, v19.4h, #0
-; CHECK-NEXT:    ushll2 v19.4s, v19.8h, #0
-; CHECK-NEXT:    ushll v22.4s, v17.4h, #0
-; CHECK-NEXT:    ushll2 v17.4s, v17.8h, #0
-; CHECK-NEXT:    ushll2 v23.4s, v20.8h, #0
-; CHECK-NEXT:    ushll v24.4s, v18.4h, #0
-; CHECK-NEXT:    ushll2 v18.4s, v18.8h, #0
-; CHECK-NEXT:    ushll v20.4s, v20.4h, #0
-; CHECK-NEXT:    and v21.16b, v21.16b, v2.16b
-; CHECK-NEXT:    and v19.16b, v19.16b, v2.16b
-; CHECK-NEXT:    and v22.16b, v22.16b, v2.16b
-; CHECK-NEXT:    and v17.16b, v17.16b, v2.16b
-; CHECK-NEXT:    and v23.16b, v23.16b, v2.16b
-; CHECK-NEXT:    and v24.16b, v24.16b, v2.16b
-; CHECK-NEXT:    and v18.16b, v18.16b, v2.16b
-; CHECK-NEXT:    and v20.16b, v20.16b, v2.16b
-; CHECK-NEXT:    add v5.4s, v5.4s, v19.4s
-; CHECK-NEXT:    add v3.4s, v3.4s, v21.4s
-; CHECK-NEXT:    add v1.4s, v1.4s, v22.4s
-; CHECK-NEXT:    add v4.4s, v4.4s, v17.4s
-; CHECK-NEXT:    add v16.4s, v16.4s, v23.4s
-; CHECK-NEXT:    add v6.4s, v6.4s, v24.4s
-; CHECK-NEXT:    add v7.4s, v7.4s, v20.4s
-; CHECK-NEXT:    add v0.4s, v0.4s, v18.4s
+; CHECK-NEXT:    uaddw2 v5.4s, v5.4s, v19.8h
+; CHECK-NEXT:    uaddw v3.4s, v3.4s, v19.4h
+; CHECK-NEXT:    uaddw2 v4.4s, v4.4s, v17.8h
+; CHECK-NEXT:    uaddw v1.4s, v1.4s, v17.4h
+; CHECK-NEXT:    uaddw2 v16.4s, v16.4s, v20.8h
+; CHECK-NEXT:    uaddw v7.4s, v7.4s, v20.4h
+; CHECK-NEXT:    uaddw2 v0.4s, v0.4s, v18.8h
+; CHECK-NEXT:    uaddw v6.4s, v6.4s, v18.4h
 ; CHECK-NEXT:    b.ne .LBB1_1
 ; CHECK-NEXT:  // %bb.2: // %middle.block
 ; CHECK-NEXT:    add v0.4s, v0.4s, v4.4s
diff --git a/llvm/test/CodeGen/AArch64/extbinopload.ll b/llvm/test/CodeGen/AArch64/extbinopload.ll
index d18cff51c6101..2641bca482bfd 100644
--- a/llvm/test/CodeGen/AArch64/extbinopload.ll
+++ b/llvm/test/CodeGen/AArch64/extbinopload.ll
@@ -1365,15 +1365,13 @@ define <4 x i32> @atomic(ptr %p) {
 ; CHECK-LABEL: atomic:
 ; CHECK:       // %bb.0:
 ; CHECK-NEXT:    ldar w8, [x0]
-; CHECK-NEXT:    movi v0.2d, #0x0000ff000000ff
-; CHECK-NEXT:    ldr s1, [x0, #4]
-; CHECK-NEXT:    fmov s2, w8
-; CHECK-NEXT:    ushll v1.8h, v1.8b, #0
-; CHECK-NEXT:    zip1 v2.8b, v2.8b, v0.8b
-; CHECK-NEXT:    ushll v1.4s, v1.4h, #3
-; CHECK-NEXT:    ushll v2.4s, v2.4h, #0
-; CHECK-NEXT:    and v0.16b, v2.16b, v0.16b
-; CHECK-NEXT:    add v0.4s, v0.4s, v1.4s
+; CHECK-NEXT:    ldr s0, [x0, #4]
+; CHECK-NEXT:    fmov s1, w8
+; CHECK-NEXT:    zip1 v1.8b, v1.8b, v0.8b
+; CHECK-NEXT:    ushll v0.8h, v0.8b, #0
+; CHECK-NEXT:    ushll v0.4s, v0.4h, #3
+; CHECK-NEXT:    bic v1.4h, #255, lsl #8
+; CHECK-NEXT:    uaddw v0.4s, v0.4s, v1.4h
 ; CHECK-NEXT:    ret
   %l1b = load atomic float, ptr %p acquire, align 4
   %l1 = bitcast float %l1b to <4 x i8>
diff --git a/llvm/test/CodeGen/AArch64/neon-extadd.ll b/llvm/test/CodeGen/AArch64/neon-extadd.ll
index 01fdfa1ef2eb8..f4d170edd5c82 100644
--- a/llvm/test/CodeGen/AArch64/neon-extadd.ll
+++ b/llvm/test/CodeGen/AArch64/neon-extadd.ll
@@ -1372,25 +1372,24 @@ define <16 x i32> @i12(<16 x i12> %s0, <16 x i12> %s1) {
 ; CHECK-SD-NEXT:    ldr w9, [sp, #40]
 ; CHECK-SD-NEXT:    fmov s1, w4
 ; CHECK-SD-NEXT:    ldr w10, [sp, #128]
-; CHECK-SD-NEXT:    fmov s3, w0
+; CHECK-SD-NEXT:    fmov s0, w0
 ; CHECK-SD-NEXT:    ldr w11, [sp, #72]
-; CHECK-SD-NEXT:    fmov s0, w8
+; CHECK-SD-NEXT:    fmov s3, w8
 ; CHECK-SD-NEXT:    ldr w8, [sp]
-; CHECK-SD-NEXT:    movi v16.4s, #15, msl #8
 ; CHECK-SD-NEXT:    fmov s5, w10
 ; CHECK-SD-NEXT:    ldr w10, [sp, #104]
 ; CHECK-SD-NEXT:    mov v1.h[1], w5
 ; CHECK-SD-NEXT:    fmov s2, w8
 ; CHECK-SD-NEXT:    ldr w8, [sp, #8]
-; CHECK-SD-NEXT:    mov v3.h[1], w1
-; CHECK-SD-NEXT:    mov v0.h[1], w9
+; CHECK-SD-NEXT:    mov v0.h[1], w1
+; CHECK-SD-NEXT:    mov v3.h[1], w9
 ; CHECK-SD-NEXT:    ldr w9, [sp, #48]
 ; CHECK-SD-NEXT:    mov v2.h[1], w8
 ; CHECK-SD-NEXT:    ldr w8, [sp, #160]
 ; CHECK-SD-NEXT:    mov v1.h[2], w6
-; CHECK-SD-NEXT:    mov v3.h[2], w2
+; CHECK-SD-NEXT:    mov v0.h[2], w2
 ; CHECK-SD-NEXT:    fmov s4, w8
-; CHECK-SD-NEXT:    mov v0.h[2], w9
+; CHECK-SD-NEXT:    mov v3.h[2], w9
 ; CHECK-SD-NEXT:    ldr w9, [sp, #168]
 ; CHECK-SD-NEXT:    ldr w8, [sp, #64]
 ; CHECK-SD-NEXT:    mov v1.h[3], w7
@@ -1398,7 +1397,7 @@ define <16 x i32> @i12(<16 x i12> %s0, <16 x i12> %s1) {
 ; CHECK-SD-NEXT:    ldr w9, [sp, #96]
 ; CHECK-SD-NEXT:    fmov s6, w8
 ; CHECK-SD-NEXT:    ldr w8, [sp, #136]
-; CHECK-SD-NEXT:    mov v3.h[3], w3
+; CHECK-SD-NEXT:    mov v0.h[3], w3
 ; CHECK-SD-NEXT:    fmov s7, w9
 ; CHECK-SD-NEXT:    ldr w9, [sp, #16]
 ; CHECK-SD-NEXT:    mov v6.h[1], w11
@@ -1409,42 +1408,34 @@ define <16 x i32> @i12(<16 x i12> %s0, <16 x i12> %s1) {
 ; CHECK-SD-NEXT:    ldr w11, [sp, #144]
 ; CHECK-SD-NEXT:    mov v7.h[1], w10
 ; CHECK-SD-NEXT:    ldr w10, [sp, #112]
-; CHECK-SD-NEXT:    ushll v1.4s, v1.4h, #0
+; CHECK-SD-NEXT:    bic v1.4h, #240, lsl #8
 ; CHECK-SD-NEXT:    mov v4.h[2], w9
 ; CHECK-SD-NEXT:    ldr w9, [sp, #56]
-; CHECK-SD-NEXT:    ushll v3.4s, v3.4h, #0
+; CHECK-SD-NEXT:    bic v0.4h, #240, lsl #8
 ; CHECK-SD-NEXT:    mov v6.h[2], w8
 ; CHECK-SD-NEXT:    ldr w8, [sp, #24]
 ; CHECK-SD-NEXT:    mov v5.h[2], w11
 ; CHECK-SD-NEXT:    ldr w11, [sp, #120]
-; CHECK-SD-NEXT:    mov v0.h[3], w9
+; CHECK-SD-NEXT:    mov v3.h[3], w9
 ; CHECK-SD-NEXT:    ldr w9, [sp, #152]
 ; CHECK-SD-NEXT:    mov v7.h[2], w10
 ; CHECK-SD-NEXT:    ldr w10, [sp, #88]
 ; CHECK-SD-NEXT:    mov v2.h[3], w8
 ; CHECK-SD-NEXT:    ldr w8, [sp, #184]
-; CHECK-SD-NEXT:    and v1.16b, v1.16b, v16.16b
 ; CHECK-SD-NEXT:    mov v6.h[3], w10
 ; CHECK-SD-NEXT:    mov v5.h[3], w9
 ; CHECK-SD-NEXT:    mov v4.h[3], w8
-; CHECK-SD-NEXT:    ushll v0.4s, v0.4h, #0
+; CHECK-SD-NEXT:    bic v3.4h, #240, lsl #8
 ; CHECK-SD-NEXT:    mov v7.h[3], w11
-; CHECK-SD-NEXT:    ushll v2.4s, v2.4h, #0
-; CHECK-SD-NEXT:    ushll v6.4s, v6.4h, #0
-; CHECK-SD-NEXT:    ushll v5.4s, v5.4h, #0
-; CHECK-SD-NEXT:    and v17.16b, v0.16b, v16.16b
-; CHECK-SD-NEXT:    ushll v4.4s, v4.4h, #0
-; CHECK-SD-NEXT:    and v2.16b, v2.16b, v16.16b
-; CHECK-SD-NEXT:    and v0.16b, v3.16b, v16.16b
-; CHECK-SD-NEXT:    ushll v7.4s, v7.4h, #0
-; CHECK-SD-NEXT:    and v3.16b, v6.16b, v16.16b
-; CHECK-SD-NEXT:    and v5.16b, v5.16b, v16.16b
-; CHECK-SD-NEXT:    and v4.16b, v4.16b, v16.16b
-; CHECK-SD-NEXT:    and v6.16b, v7.16b, v16.16b
-; CHECK-SD-NEXT:    add v0.4s, v0.4s, v3.4s
-; CHECK-SD-NEXT:    add v2.4s, v2.4s, v5.4s
-; CHECK-SD-NEXT:    add v3.4s, v17.4s, v4.4s
-; CHECK-SD-NEXT:    add v1.4s, v1.4s, v6.4s
+; CHECK-SD-NEXT:    bic v2.4h, #240, lsl #8
+; CHECK-SD-NEXT:    bic v6.4h, #240, lsl #8
+; CHECK-SD-NEXT:    bic v5.4h, #240, lsl #8
+; CHECK-SD-NEXT:    bic v4.4h, #240, lsl #8
+; CHECK-SD-NEXT:    bic v7.4h, #240, lsl #8
+; CHECK-SD-NEXT:    uaddl v0.4s, v0.4h, v6.4h
+; CHECK-SD-NEXT:    uaddl v2.4s, v2.4h, v5.4h
+; CHECK-SD-NEXT:    uaddl v3.4s, v3.4h, v4.4h
+; CHECK-SD-NEXT:    uaddl v1.4s, v1.4h, v7.4h
 ; CHECK-SD-NEXT:    ret
 ;
 ; CHECK-GI-LABEL: i12:
diff --git a/llvm/test/CodeGen/AArch64/setcc_knownbits.ll b/llvm/test/CodeGen/AArch64/setcc_knownbits.ll
index 4dd2a896cd81c..008e5c6f6f859 100644
--- a/llvm/test/CodeGen/AArch64/setcc_knownbits.ll
+++ b/llvm/test/CodeGen/AArch64/setcc_knownbits.ll
@@ -78,11 +78,13 @@ define i1 @lshr_ctlz_undef_cmpeq_one_i64(i64 %in) {
 define i32 @PR17487(i1 %tobool) {
 ; CHECK-SD-LABEL: PR17487:
 ; CHECK-SD:       // %bb.0:
-; CHECK-SD-NEXT:    dup v0.2s, w0
+; CHECK-SD-NEXT:    movi v0.2s, #1
+; CHECK-SD-NEXT:    dup v1.2s, w0
 ; CHECK-SD-NEXT:    mov w8, #1 // =0x1
+; CHECK-SD-NEXT:    and v0.8b, v1.8b, v0.8b
 ; CHECK-SD-NEXT:    dup v1.2d, x8
 ; CHECK-SD-NEXT:    ushll v0.2d, v0.2s, #0
-; CHECK-SD-NEXT:    bic v0.16b, v1.16b, v0.16b
+; CHECK-SD-NEXT:    eor v0.16b, v0.16b, v1.16b
 ; CHECK-SD-NEXT:    mov x8, v0.d[1]
 ; CHECK-SD-NEXT:    cmp x8, #1
 ; CHECK-SD-NEXT:    cset w0, ne
diff --git a/llvm/test/CodeGen/AArch64/vec3-loads-ext-trunc-stores.ll b/llvm/test/CodeGen/AArch64/vec3-loads-ext-trunc-stores.ll
index 85af93eeadbdf..538dbf94608c7 100644
--- a/llvm/test/CodeGen/AArch64/vec3-loads-ext-trunc-stores.ll
+++ b/llvm/test/CodeGen/AArch64/vec3-loads-ext-trunc-stores.ll
@@ -40,12 +40,11 @@ define <4 x i32> @load_v3i8_to_4xi32(ptr %src) {
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    ldrb w8, [x0, #2]
 ; CHECK-NEXT:    ldrh w9, [x0]
-; CHECK-NEXT:    movi.2d v1, #0x0000ff000000ff
 ; CHECK-NEXT:    orr w8, w9, w8, lsl #16
 ; CHECK-NEXT:    fmov s0, w8
 ; CHECK-NEXT:    zip1.8b v0, v0, v0
+; CHECK-NEXT:    bic.4h v0, #255, lsl #8
 ; CHECK-NEXT:    ushll.4s v0, v0, #0
-; CHECK-NEXT:    and.16b v0, v0, v1
 ; CHECK-NEXT:    ret
 ;
 ; BE-LABEL: load_v3i8_to_4xi32:
@@ -53,7 +52,6 @@ define <4 x i32> @load_v3i8_to_4xi32(ptr %src) {
 ; BE-NEXT:    sub sp, sp, #16
 ; BE-NEXT:    .cfi_def_cfa_offset 16
 ; BE-NEXT:    ldrh w8, [x0]
-; BE-NEXT:    movi v1.2d, #0x0000ff000000ff
 ; BE-NEXT:    strh w8, [sp, #12]
 ; BE-NEXT:    ldr s0, [sp, #12]
 ; BE-NEXT:    ldrsb w8, [x0, #2]
@@ -61,8 +59,8 @@ define <4 x i32> @load_v3i8_to_4xi32(ptr %src) {
 ; BE-NEXT:    ushll v0.8h, v0.8b, #0
 ; BE-NEXT:    mov v0.h[1], v0.h[1]
 ; BE-NEXT:    mov v0.h[2], w8
+; BE-NEXT:    bic v0.4h, #255, lsl #8
 ; BE-NEXT:    ushll v0.4s, v0.4h, #0
-; BE-NEXT:    and v0.16b, v0.16b, v1.16b
 ; BE-NEXT:    rev64 v0.4s, v0.4s
 ; BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
 ; BE-NEXT:    add sp, sp, #16
@@ -78,12 +76,11 @@ define <4 x i32> @load_v3i8_to_4xi32_align_2(ptr %src) {
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    ldrb w8, [x0, #2]
 ; CHECK-NEXT:    ldrh w9, [x0]
-; CHECK-NEXT:    movi.2d v1, #0x0000ff000000ff
 ; CHECK-NEXT:    orr w8, w9, w8, lsl #16
 ; CHECK-NEXT:    fmov s0, w8
 ; CHECK-NEXT:    zip1.8b v0, v0, v0
+; CHECK-NEXT:    bic.4h v0, #255, lsl #8
 ; CHECK-NEXT:    ushll.4s v0, v0, #0
-; CHECK-NEXT:    and.16b v0, v0, v1
 ; CHECK-NEXT:    ret
 ;
 ; BE-LABEL: load_v3i8_to_4xi32_align_2:
@@ -91,7 +88,6 @@ define <4 x i32> @load_v3i8_to_4xi32_align_2(ptr %src) {
 ; BE-NEXT:    sub sp, sp, #16
 ; BE-NEXT:    .cfi_def_cfa_offset 16
 ; BE-NEXT:    ldrh w8, [x0]
-; BE-NEXT:    movi v1.2d, #0x0000ff000000ff
 ; BE-NEXT:    strh w8, [sp, #12]
 ; BE-NEXT:    ldr s0, [sp, #12]
 ; BE-NEXT:    ldrsb w8, [x0, #2]
@@ -99,8 +95,8 @@ define <4 x i32> @load_v3i8_to_4xi32_align_2(ptr %src) {
 ; BE-NEXT:    ushll v0.8h, v0.8b, #0
 ; BE-NEXT:    mov v0.h[1], v0.h[1]
 ; BE-NEXT:    mov v0.h[2], w8
+; BE-NEXT:    bic v0.4h, #255, lsl #8
 ; BE-NEXT:    ushll v0.4s, v0.4h, #0
-; BE-NEXT:    and v0.16b, v0.16b, v1.16b
 ; BE-NEXT:    rev64 v0.4s, v0.4s
 ; BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
 ; BE-NEXT:    add sp, sp, #16
@@ -115,20 +111,18 @@ define <4 x i32> @load_v3i8_to_4xi32_align_4(ptr %src) {
 ; CHECK-LABEL: load_v3i8_to_4xi32_align_4:
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    ldr s0, [x0]
-; CHECK-NEXT:    movi.2d v1, #0x0000ff000000ff
 ; CHECK-NEXT:    zip1.8b v0, v0, v0
+; CHECK-NEXT:    bic.4h v0, #255, lsl #8
 ; CHECK-NEXT:    ushll.4s v0, v0, #0
-; CHECK-NEXT:    and.16b v0, v0, v1
 ; CHECK-NEXT:    ret
 ;
 ; BE-LABEL: load_v3i8_to_4xi32_align_4:
 ; BE:       // %bb.0:
 ; BE-NEXT:    ldr s0, [x0]
-; BE-NEXT:    movi v1.2d, #0x0000ff000000ff
 ; BE-NEXT:    rev32 v0.8b, v0.8b
 ; BE-NEXT:    zip1 v0.8b, v0.8b, v0.8b
+; BE-NEXT:    bic v0.4h, #255, lsl #8
 ; BE-NEXT:    ushll v0.4s, v0.4h, #0
-; BE-NEXT:    and v0.16b, v0.16b, v1.16b
 ; BE-NEXT:    rev64 v0.4s, v0.4s
 ; BE-NEXT:    ext v0.16b, v0.16b, v0.16b, #8
 ; BE-NEXT:    ret
@@ -143,12 +137,11 @@ define <4 x i32> @load_v3i8_to_4xi32_const_offset_1(ptr %src) {
 ; CHECK:       ; %bb.0:
 ; CHECK-NEXT:    ldrb w8, [x0, #3]
 ; CHECK-NEXT:    ldurh w9, [x0, #1]
-; CHECK-NEXT:    movi.2d v1, #0x0000ff000000ff
 ; CHECK-NEXT:    orr w8, w9, w8, lsl #16
 ; CHECK-NEXT:    fmov s0, w8
 ; CHECK-NEXT:    zip1.8b v0, v0, v0
+; CHECK-NEXT:    bic.4h v0, #255, lsl #8
 ; CHECK-NEXT:    ushll.4s v0, v0, #0
-; CHECK-NEXT:    and.16b v0, v0, v1
 ; CHECK-NEXT:    ret
 ;
 ; BE-LABEL: load_v3i8_to_4xi32_const_offset_1:
@@ -156,7 +149,6 @@ define <4 x i32> @load_v3i8_to_4xi32_const_offset_1(ptr %src) {
 ; BE-NEXT:    sub sp, sp, #16
 ; BE-NEXT:    .cfi_def_cfa_offset 16
 ; BE-NEXT:    ldurh w8, [x0, #1]
-; BE-NEXT:    movi v1.2d, #0x0000ff000000ff
 ; BE-NEXT:    strh w8, [sp, #12]
 ; BE-NEXT:    ldr s0, [sp, #12]
 ; BE-NEXT:    ldrsb w8, [x0, #3]
@@ -164,8 +156,8 @@ define <4 x i32> @load_v3i8_to_4xi32_const_offset_1(ptr %src) {
 ; BE-NEXT:    ushll v0.8h, v0.8b, #0
 ; BE-NEXT:    mov v0.h[1], v0.h[1]
 ; BE-NEXT:    mov v0.h[2], w8
+; BE-NEXT:    bic v0.4h, #255, lsl ...
[truncated]

``````````

</details>


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


More information about the llvm-commits mailing list