diff --git a/compiler/rustc_codegen_llvm/src/intrinsic.rs b/compiler/rustc_codegen_llvm/src/intrinsic.rs index 907517bf6ce95..ac7e850673561 100644 --- a/compiler/rustc_codegen_llvm/src/intrinsic.rs +++ b/compiler/rustc_codegen_llvm/src/intrinsic.rs @@ -1091,15 +1091,13 @@ fn generic_simd_intrinsic<'ll, 'tcx>( if name == sym::simd_bitmask { // The `fn simd_bitmask(vector) -> unsigned integer` intrinsic takes a // vector mask and returns the most significant bit (MSB) of each lane in the form - // of either: - // * an unsigned integer - // * an array of `u8` - // If the vector has less than 8 lanes, a u8 is returned with zeroed trailing bits. + // of an unsigned integer. + // If the vector has less than lanes than the integer has bits, + // the trailing bits are zeroed. // // The bit order of the result depends on the byte endianness, LSB-first for little // endian and MSB-first for big endian. let expected_int_bits = in_len.max(8); - let expected_bytes = expected_int_bits / 8 + ((expected_int_bits % 8 > 0) as u64); // Integer vector : let (i_xn, in_elem_bitwidth) = match in_elem.kind() { @@ -1135,27 +1133,7 @@ fn generic_simd_intrinsic<'ll, 'tcx>( // Zero-extend iN to the bitmask type: return Ok(bx.zext(i_, bx.type_ix(expected_int_bits))); } - ty::Array(elem, len) - if matches!(elem.kind(), ty::Uint(ty::UintTy::U8)) - && len.try_eval_usize(bx.tcx, ty::ParamEnv::reveal_all()) - == Some(expected_bytes) => - { - // Zero-extend iN to the array length: - let ze = bx.zext(i_, bx.type_ix(expected_bytes * 8)); - - // Convert the integer to a byte array - let ptr = bx.alloca(bx.type_ix(expected_bytes * 8), Align::ONE); - bx.store(ze, ptr, Align::ONE); - let array_ty = bx.type_array(bx.type_i8(), expected_bytes); - let ptr = bx.pointercast(ptr, bx.cx.type_ptr_to(array_ty)); - return Ok(bx.load(array_ty, ptr, Align::ONE)); - } - _ => return_error!( - "cannot return `{}`, expected `u{}` or `[u8; {}]`", - ret_ty, - expected_int_bits, - expected_bytes - ), + _ => return_error!("cannot return `{}`, expected `u{}`", ret_ty, expected_int_bits), } } diff --git a/src/test/ui/simd/intrinsic/generic-bitmask.stderr b/src/test/ui/simd/intrinsic/generic-bitmask.stderr index 0de3f8eead86d..1479536a1624c 100644 --- a/src/test/ui/simd/intrinsic/generic-bitmask.stderr +++ b/src/test/ui/simd/intrinsic/generic-bitmask.stderr @@ -1,28 +1,28 @@ -error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u16`, expected `u8` or `[u8; 1]` +error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u16`, expected `u8` --> $DIR/generic-bitmask.rs:53:22 | LL | let _: u16 = simd_bitmask(m2); | ^^^^^^^^^^^^^^^^ -error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u16`, expected `u8` or `[u8; 1]` +error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u16`, expected `u8` --> $DIR/generic-bitmask.rs:56:22 | LL | let _: u16 = simd_bitmask(m8); | ^^^^^^^^^^^^^^^^ -error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u32`, expected `u16` or `[u8; 2]` +error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u32`, expected `u16` --> $DIR/generic-bitmask.rs:59:22 | LL | let _: u32 = simd_bitmask(m16); | ^^^^^^^^^^^^^^^^^ -error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u64`, expected `u32` or `[u8; 4]` +error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u64`, expected `u32` --> $DIR/generic-bitmask.rs:62:22 | LL | let _: u64 = simd_bitmask(m32); | ^^^^^^^^^^^^^^^^^ -error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u128`, expected `u64` or `[u8; 8]` +error[E0511]: invalid monomorphization of `simd_bitmask` intrinsic: cannot return `u128`, expected `u64` --> $DIR/generic-bitmask.rs:65:23 | LL | let _: u128 = simd_bitmask(m64); diff --git a/src/test/ui/simd/simd-bitmask.rs b/src/test/ui/simd/simd-bitmask.rs index 14ee2e741bdfd..f3ab33a73ae8c 100644 --- a/src/test/ui/simd/simd-bitmask.rs +++ b/src/test/ui/simd/simd-bitmask.rs @@ -15,17 +15,13 @@ fn main() { unsafe { let v = Simd::([-1, 0, -1, 0]); let i: u8 = simd_bitmask(v); - let a: [u8; 1] = simd_bitmask(v); assert_eq!(i, 0b0101); - assert_eq!(a, [0b0101]); let v = Simd::([0, 0, -1, -1, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, -1, 0]); let i: u16 = simd_bitmask(v); - let a: [u8; 2] = simd_bitmask(v); assert_eq!(i, 0b0101000000001100); - assert_eq!(a, [0b1100, 0b01010000]); } unsafe {