[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