[llvm] [WebAssembly] Handle wide mask reductions in performSETCCCombine (PR #189358)
Sam Parker via llvm-commits
llvm-commits at lists.llvm.org
Wed Apr 1 05:24:13 PDT 2026
================
@@ -144,5 +144,1104 @@ entry:
ret i64 %0
}
+define i32 @all_true_big_v32i16(<32 x i16> %v) {
+; CHECK-LABEL: all_true_big_v32i16:
+; CHECK: .functype all_true_big_v32i16 (v128, v128, v128, v128) -> (i32)
+; CHECK-NEXT: # %bb.0:
+; CHECK-NEXT: v128.const $push22=, 0, 0, 0, 0, 0, 0, 0, 0
+; CHECK-NEXT: local.tee $push21=, $4=, $pop22
+; CHECK-NEXT: i16x8.eq $push8=, $0, $pop21
+; CHECK-NEXT: i16x8.eq $push7=, $1, $4
+; CHECK-NEXT: i8x16.shuffle $push9=, $pop8, $pop7, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
+; CHECK-NEXT: i32.const $push3=, 7
+; CHECK-NEXT: i8x16.shl $push10=, $pop9, $pop3
+; CHECK-NEXT: i32.const $push20=, 7
+; CHECK-NEXT: i8x16.shr_s $push11=, $pop10, $pop20
+; CHECK-NEXT: i8x16.all_true $push12=, $pop11
+; CHECK-NEXT: i16x8.eq $push1=, $2, $4
+; CHECK-NEXT: i16x8.eq $push0=, $3, $4
+; CHECK-NEXT: i8x16.shuffle $push2=, $pop1, $pop0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
+; CHECK-NEXT: i32.const $push19=, 7
+; CHECK-NEXT: i8x16.shl $push4=, $pop2, $pop19
+; CHECK-NEXT: i32.const $push18=, 7
+; CHECK-NEXT: i8x16.shr_s $push5=, $pop4, $pop18
+; CHECK-NEXT: i8x16.all_true $push6=, $pop5
+; CHECK-NEXT: i32.and $push13=, $pop12, $pop6
+; CHECK-NEXT: i32.const $push14=, -1
+; CHECK-NEXT: i32.xor $push15=, $pop13, $pop14
+; CHECK-NEXT: i32.const $push16=, 1
+; CHECK-NEXT: i32.and $push17=, $pop15, $pop16
+; CHECK-NEXT: return $pop17
+ %1 = icmp eq <32 x i16> %v, zeroinitializer
+ %2 = bitcast <32 x i1> %1 to i32
+ %3 = icmp ne i32 %2, -1
+ %conv3 = zext i1 %3 to i32
+ ret i32 %conv3
+}
+
+define i64 @all_true_big_v64i16(<64 x i16> %v) {
+; CHECK-LABEL: all_true_big_v64i16:
+; CHECK: .functype all_true_big_v64i16 (v128, v128, v128, v128, v128, v128, v128, v128) -> (i64)
+; CHECK-NEXT: # %bb.0:
+; CHECK-NEXT: v128.const $push41=, 0, 0, 0, 0, 0, 0, 0, 0
+; CHECK-NEXT: local.tee $push40=, $8=, $pop41
+; CHECK-NEXT: i16x8.eq $push8=, $0, $pop40
+; CHECK-NEXT: i16x8.eq $push7=, $1, $8
+; CHECK-NEXT: i8x16.shuffle $push9=, $pop8, $pop7, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
+; CHECK-NEXT: i32.const $push3=, 7
+; CHECK-NEXT: i8x16.shl $push10=, $pop9, $pop3
+; CHECK-NEXT: i32.const $push39=, 7
+; CHECK-NEXT: i8x16.shr_s $push11=, $pop10, $pop39
+; CHECK-NEXT: i8x16.all_true $push12=, $pop11
+; CHECK-NEXT: i16x8.eq $push1=, $2, $8
+; CHECK-NEXT: i16x8.eq $push0=, $3, $8
+; CHECK-NEXT: i8x16.shuffle $push2=, $pop1, $pop0, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
+; CHECK-NEXT: i32.const $push38=, 7
+; CHECK-NEXT: i8x16.shl $push4=, $pop2, $pop38
+; CHECK-NEXT: i32.const $push37=, 7
+; CHECK-NEXT: i8x16.shr_s $push5=, $pop4, $pop37
+; CHECK-NEXT: i8x16.all_true $push6=, $pop5
+; CHECK-NEXT: i32.and $push13=, $pop12, $pop6
+; CHECK-NEXT: i16x8.eq $push15=, $4, $8
+; CHECK-NEXT: i16x8.eq $push14=, $5, $8
+; CHECK-NEXT: i8x16.shuffle $push16=, $pop15, $pop14, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
+; CHECK-NEXT: i32.const $push36=, 7
+; CHECK-NEXT: i8x16.shl $push17=, $pop16, $pop36
+; CHECK-NEXT: i32.const $push35=, 7
+; CHECK-NEXT: i8x16.shr_s $push18=, $pop17, $pop35
+; CHECK-NEXT: i8x16.all_true $push19=, $pop18
+; CHECK-NEXT: i32.and $push20=, $pop13, $pop19
+; CHECK-NEXT: i16x8.eq $push22=, $6, $8
+; CHECK-NEXT: i16x8.eq $push21=, $7, $8
+; CHECK-NEXT: i8x16.shuffle $push23=, $pop22, $pop21, 0, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30
+; CHECK-NEXT: i32.const $push34=, 7
+; CHECK-NEXT: i8x16.shl $push24=, $pop23, $pop34
+; CHECK-NEXT: i32.const $push33=, 7
+; CHECK-NEXT: i8x16.shr_s $push25=, $pop24, $pop33
+; CHECK-NEXT: i8x16.all_true $push26=, $pop25
+; CHECK-NEXT: i32.and $push27=, $pop20, $pop26
+; CHECK-NEXT: i32.const $push28=, -1
+; CHECK-NEXT: i32.xor $push29=, $pop27, $pop28
+; CHECK-NEXT: i64.extend_i32_u $push30=, $pop29
+; CHECK-NEXT: i64.const $push31=, 1
+; CHECK-NEXT: i64.and $push32=, $pop30, $pop31
+; CHECK-NEXT: return $pop32
+ %1 = icmp eq <64 x i16> %v, zeroinitializer
+ %2 = bitcast <64 x i1> %1 to i64
+ %3 = icmp ne i64 %2, -1
+ %conv3 = zext i1 %3 to i64
+ ret i64 %conv3
+}
+
+define i32 @all_true_big_v32i32(<32 x i32> %v) {
----------------
sparker-arm wrote:
The bug is in `performBitcastCombine`, right? So I'm struggling to see how that couldn't be fixed without this change... It looks like we're trying to produce a `setcc` with a mismatched type. So, if we check the type of each of the `Concat->ops`, ensuring they've got 16 elements, before producing a bunch of `setcc` then I think that fixes the problem.
https://github.com/llvm/llvm-project/pull/189358
More information about the llvm-commits
mailing list