[llvm] [WebAssembly] Fix chunk order when reconstructing illegal bitmasks (PR #226824)

via llvm-commits llvm-commits at lists.llvm.org
Sun Sep 27 11:57:56 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-webassembly

Author: hanbeom (ParkHanbum)

<details>
<summary>Changes</summary>

Shift each chunk bitmask to its original lane offset before combining it.
This preserves the correct lane-to-bit mapping for widened illegal vector
bitcasts.

Fixes https://github.com/llvm/llvm-project/issues/226741

---

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


3 Files Affected:

- (modified) llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp (+12-6) 
- (modified) llvm/test/CodeGen/WebAssembly/simd-bitmask.ll (+168-123) 
- (modified) llvm/test/CodeGen/WebAssembly/simd-illegal-bitmask.ll (+37-36) 


``````````diff
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
index 1ecd232782679c..6b79ab0a4296df 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyISelLowering.cpp
@@ -3458,17 +3458,23 @@ static SDValue performBitcastCombine(SDNode *N,
       SDValue ExtendedConcatOperandBitmask =
           DAG.getZExtOrTrunc(ConcatOperandBitmask, DL, ReturnVT);
 
-      // Shift the previously reconstructed bits to make room for this chunk.
+      // Shift each chunk's mask to its original lane position before merging it
+      // into the result:
+      //   Result bit index = I * ConcatOperandNumElts + local lane index
+      //
+      // Example: four chunks, each containing 8 mask bits:
+      //   result = M0 | (M1 << 8) | (M2 << 16) | (M3 << 24)
+      //
+      SDValue PositionedChunkBitmask = ExtendedConcatOperandBitmask;
       if (I != 0) {
-        ReconstructedBitmask = DAG.getNode(
-            ISD::SHL, DL, ReturnVT, ReconstructedBitmask,
-            DAG.getShiftAmountConstant(ConcatOperandNumElts, ReturnVT, DL));
+        PositionedChunkBitmask = DAG.getNode(
+            ISD::SHL, DL, ReturnVT, ExtendedConcatOperandBitmask,
+            DAG.getShiftAmountConstant(I * ConcatOperandNumElts, ReturnVT, DL));
       }
 
-      // Merge disjoint partial bitmasks with OR.
       ReconstructedBitmask =
           DAG.getNode(ISD::OR, DL, ReturnVT, ReconstructedBitmask,
-                      ExtendedConcatOperandBitmask);
+                      PositionedChunkBitmask);
     }
 
     return ReconstructedBitmask;
diff --git a/llvm/test/CodeGen/WebAssembly/simd-bitmask.ll b/llvm/test/CodeGen/WebAssembly/simd-bitmask.ll
index 42cdce5833d129..6bca708b6bb4f1 100644
--- a/llvm/test/CodeGen/WebAssembly/simd-bitmask.ll
+++ b/llvm/test/CodeGen/WebAssembly/simd-bitmask.ll
@@ -182,12 +182,12 @@ define i32 @bitmask_v32i8(<32 x i8> %v) {
 ; CHECK-NEXT:    local.tee 2
 ; CHECK-NEXT:    i8x16.eq
 ; CHECK-NEXT:    i8x16.bitmask
-; CHECK-NEXT:    i32.const 16
-; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    local.get 2
 ; CHECK-NEXT:    i8x16.eq
 ; CHECK-NEXT:    i8x16.bitmask
+; CHECK-NEXT:    i32.const 16
+; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    # fallthrough-return
   %cmp = icmp eq <32 x i8> %v, zeroinitializer
@@ -269,10 +269,10 @@ define i32 @manual_bitmask_v32i8(<32 x i8> %v) {
 ; CHECK-NEXT:  # %bb.0:
 ; CHECK-NEXT:    local.get 0
 ; CHECK-NEXT:    i8x16.bitmask
-; CHECK-NEXT:    i32.const 16
-; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    i8x16.bitmask
+; CHECK-NEXT:    i32.const 16
+; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    # fallthrough-return
   %1 = icmp slt <32 x i8> %v, zeroinitializer
@@ -286,23 +286,24 @@ define i64 @manual_bitmask_v64i8(<64 x i8> %v) {
 ; CHECK-NEXT:  # %bb.0:
 ; CHECK-NEXT:    local.get 0
 ; CHECK-NEXT:    i8x16.bitmask
-; CHECK-NEXT:    i32.const 16
-; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i64.extend_i32_u
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    i8x16.bitmask
-; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 32
+; CHECK-NEXT:    i64.const 16
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 2
 ; CHECK-NEXT:    i8x16.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 16
+; CHECK-NEXT:    i64.const 32
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 3
 ; CHECK-NEXT:    i8x16.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
+; CHECK-NEXT:    i64.const 48
+; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    # fallthrough-return
   %1 = icmp slt <64 x i8> %v, zeroinitializer
@@ -320,26 +321,26 @@ define i32 @bitmask_v32i16(<32 x i16> %v) {
 ; CHECK-NEXT:    local.tee 4
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
-; CHECK-NEXT:    i32.const 24
-; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
-; CHECK-NEXT:    i32.const 16
+; CHECK-NEXT:    i32.const 8
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 2
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
-; CHECK-NEXT:    i32.const 8
+; CHECK-NEXT:    i32.const 16
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 3
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
+; CHECK-NEXT:    i32.const 24
+; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    # fallthrough-return
   %cmp = icmp eq <32 x i16> %v, zeroinitializer
@@ -357,54 +358,54 @@ define i32 @bitmask_v32i32(<32 x i32> %v) {
 ; CHECK-NEXT:    local.tee 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
-; CHECK-NEXT:    i32.const 12
-; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
-; CHECK-NEXT:    i32.const 8
+; CHECK-NEXT:    i32.const 4
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 2
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 8
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 3
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 8
+; CHECK-NEXT:    i32.const 12
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 16
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 5
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 8
+; CHECK-NEXT:    i32.const 20
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 6
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 24
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 7
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
+; CHECK-NEXT:    i32.const 28
+; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    # fallthrough-return
   %cmp = icmp eq <32 x i32> %v, zeroinitializer
@@ -422,110 +423,110 @@ define i32 @bitmask_v32i64(<32 x i64> %v) {
 ; CHECK-NEXT:    local.tee 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 6
-; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 2
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 2
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 2
+; CHECK-NEXT:    i32.const 4
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 3
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 6
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 2
+; CHECK-NEXT:    i32.const 8
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 5
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 10
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 6
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 2
+; CHECK-NEXT:    i32.const 12
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 7
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 14
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 2
+; CHECK-NEXT:    i32.const 16
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 9
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 18
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 10
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 2
+; CHECK-NEXT:    i32.const 20
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 11
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 22
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 12
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 2
+; CHECK-NEXT:    i32.const 24
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 13
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.or
-; CHECK-NEXT:    i32.const 4
+; CHECK-NEXT:    i32.const 26
 ; CHECK-NEXT:    i32.shl
+; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 14
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
-; CHECK-NEXT:    i32.const 2
+; CHECK-NEXT:    i32.const 28
 ; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    local.get 15
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
+; CHECK-NEXT:    i32.const 30
+; CHECK-NEXT:    i32.shl
 ; CHECK-NEXT:    i32.or
 ; CHECK-NEXT:    # fallthrough-return
   %cmp = icmp eq <32 x i64> %v, zeroinitializer
@@ -544,14 +545,12 @@ define i64 @bitmask_v64i16(<64 x i16> %v) {
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 24
-; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 16
+; CHECK-NEXT:    i64.const 8
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 2
@@ -559,7 +558,7 @@ define i64 @bitmask_v64i16(<64 x i16> %v) {
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 16
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 3
@@ -567,15 +566,15 @@ define i64 @bitmask_v64i16(<64 x i16> %v) {
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 16
+; CHECK-NEXT:    i64.const 24
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 32
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 5
@@ -583,15 +582,15 @@ define i64 @bitmask_v64i16(<64 x i16> %v) {
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 16
+; CHECK-NEXT:    i64.const 40
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 6
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 48
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 7
@@ -599,6 +598,8 @@ define i64 @bitmask_v64i16(<64 x i16> %v) {
 ; CHECK-NEXT:    i16x8.eq
 ; CHECK-NEXT:    i16x8.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
+; CHECK-NEXT:    i64.const 56
+; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    # fallthrough-return
   %cmp = icmp eq <64 x i16> %v, zeroinitializer
@@ -617,14 +618,12 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 12
-; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 4
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 2
@@ -632,7 +631,7 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 8
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 3
@@ -640,15 +639,15 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 12
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 16
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 5
@@ -656,15 +655,15 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 20
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 6
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 24
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 7
@@ -672,15 +671,15 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 28
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 32
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 9
@@ -688,15 +687,15 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 36
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 10
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 40
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 11
@@ -704,15 +703,15 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 44
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 12
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 48
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 13
@@ -720,15 +719,15 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 8
+; CHECK-NEXT:    i64.const 52
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 14
 ; CHECK-NEXT:    local.get 16
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 56
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 15
@@ -736,6 +735,8 @@ define i64 @bitmask_v64i32(<64 x i32> %v) {
 ; CHECK-NEXT:    i32x4.eq
 ; CHECK-NEXT:    i32x4.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
+; CHECK-NEXT:    i64.const 60
+; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    # fallthrough-return
   %cmp = icmp eq <64 x i32> %v, zeroinitializer
@@ -754,14 +755,12 @@ define i64 @bitmask_v64i64(<64 x i64> %v) {
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 6
-; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    local.get 1
 ; CHECK-NEXT:    local.get 32
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 2
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 2
@@ -769,7 +768,7 @@ define i64 @bitmask_v64i64(<64 x i64> %v) {
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 2
+; CHECK-NEXT:    i64.const 4
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 3
@@ -777,15 +776,15 @@ define i64 @bitmask_v64i64(<64 x i64> %v) {
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 6
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 4
 ; CHECK-NEXT:    local.get 32
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 2
+; CHECK-NEXT:    i64.const 8
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 5
@@ -793,15 +792,15 @@ define i64 @bitmask_v64i64(<64 x i64> %v) {
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 10
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 6
 ; CHECK-NEXT:    local.get 32
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 2
+; CHECK-NEXT:    i64.const 12
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 7
@@ -809,15 +808,15 @@ define i64 @bitmask_v64i64(<64 x i64> %v) {
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT:    i64.const 14
 ; CHECK-NEXT:    i64.shl
+; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 8
 ; CHECK-NEXT:    local.get 32
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.const 2
+; CHECK-NEXT:    i64.const 16
 ; CHECK-NEXT:    i64.shl
 ; CHECK-NEXT:    i64.or
 ; CHECK-NEXT:    local.get 9
@@ -825,15 +824,15 @@ define i64 @bitmask_v64i64(<64 x i64> %v) {
 ; CHECK-NEXT:    i64x2.eq
 ; CHECK-NEXT:    i64x2.bitmask
 ; CHECK-NEXT:    i64.extend_i32_u
-; CHECK-NEXT:    i64.or
-; CHECK-NEXT:    i64.const 4
+; CHECK-NEXT...
[truncated]

``````````

</details>


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


More information about the llvm-commits mailing list