diff --git a/cranelift/wasm/src/code_translator.rs b/cranelift/wasm/src/code_translator.rs index 5016bb8abb..bb22a333ca 100644 --- a/cranelift/wasm/src/code_translator.rs +++ b/cranelift/wasm/src/code_translator.rs @@ -201,14 +201,26 @@ pub fn translate_operator( state.pop1(); } Operator::Select => { - let (arg1, arg2, cond) = state.pop3(); + let (mut arg1, mut arg2, cond) = state.pop3(); + if builder.func.dfg.value_type(arg1).is_vector() { + arg1 = optionally_bitcast_vector(arg1, I8X16, builder); + } + if builder.func.dfg.value_type(arg2).is_vector() { + arg2 = optionally_bitcast_vector(arg2, I8X16, builder); + } state.push1(builder.ins().select(cond, arg1, arg2)); } Operator::TypedSelect { ty: _ } => { // We ignore the explicit type parameter as it is only needed for // validation, which we require to have been performed before // translation. - let (arg1, arg2, cond) = state.pop3(); + let (mut arg1, mut arg2, cond) = state.pop3(); + if builder.func.dfg.value_type(arg1).is_vector() { + arg1 = optionally_bitcast_vector(arg1, I8X16, builder); + } + if builder.func.dfg.value_type(arg2).is_vector() { + arg2 = optionally_bitcast_vector(arg2, I8X16, builder); + } state.push1(builder.ins().select(cond, arg1, arg2)); } Operator::Nop => { diff --git a/cranelift/wasmtests/pr2559.wat b/cranelift/wasmtests/pr2559.wat new file mode 100644 index 0000000000..8cf50677c8 --- /dev/null +++ b/cranelift/wasmtests/pr2559.wat @@ -0,0 +1,51 @@ +(module + (type (;0;) (func (result v128 v128 v128))) + + (func $main1 (type 0) (result v128 v128 v128) + call $main1 + i8x16.add + call $main1 + i8x16.ge_u + i16x8.ne + i32.const 13 + br_if 0 (;@0;) + i32.const 43 + br_if 0 (;@0;) + i32.const 13 + br_if 0 (;@0;) + i32.const 87 + select + unreachable + i32.const 0 + br_if 0 (;@0;) + i32.const 13 + br_if 0 (;@0;) + i32.const 43 + br_if 0 (;@0;) + ) + (export "main1" (func $main1)) + + (func $main2 (type 0) (result v128 v128 v128) + call $main2 + i8x16.add + call $main2 + i8x16.ge_u + i16x8.ne + i32.const 13 + br_if 0 (;@0;) + i32.const 43 + br_if 0 (;@0;) + i32.const 13 + br_if 0 (;@0;) + i32.const 87 + select (result v128) + unreachable + i32.const 0 + br_if 0 (;@0;) + i32.const 13 + br_if 0 (;@0;) + i32.const 43 + br_if 0 (;@0;) + ) + (export "main2" (func $main2)) +)