diff --git a/src/llvm-project b/src/llvm-project index 0af6c732ec6ca..af8f9eb61a2ad 160000 --- a/src/llvm-project +++ b/src/llvm-project @@ -1 +1 @@ -Subproject commit 0af6c732ec6ca189cd7725e4a7d4290793046e83 +Subproject commit af8f9eb61a2ad4ee1f2d3f46d157b93a47c6a4bf diff --git a/tests/codegen/issues/issue-122805.rs b/tests/codegen/issues/issue-122805.rs new file mode 100644 index 0000000000000..3bfffcd4a9609 --- /dev/null +++ b/tests/codegen/issues/issue-122805.rs @@ -0,0 +1,35 @@ +//@ compile-flags: -O +//@ min-llvm-version: 18.1.3 + +#![crate_type = "lib"] +#![no_std] + +// The code is from https://github.com/rust-lang/rust/issues/122805. +// Ensure we do not generate the shufflevector instruction +// to avoid complicating the code. +// CHECK-LABEL: define{{.*}}void @convert( +// CHECK-NOT: shufflevector +// CHECK: insertelement <8 x i16> +// CHECK-NEXT: insertelement <8 x i16> +// CHECK-NEXT: insertelement <8 x i16> +// CHECK-NEXT: insertelement <8 x i16> +// CHECK-NEXT: insertelement <8 x i16> +// CHECK-NEXT: insertelement <8 x i16> +// CHECK-NEXT: insertelement <8 x i16> +// CHECK-NEXT: insertelement <8 x i16> +// CHECK-NEXT: store <8 x i16> +// CHECK-NEXT: ret void +#[no_mangle] +pub fn convert(value: [u16; 8]) -> [u8; 16] { + let addr16 = [ + value[0].to_be(), + value[1].to_be(), + value[2].to_be(), + value[3].to_be(), + value[4].to_be(), + value[5].to_be(), + value[6].to_be(), + value[7].to_be(), + ]; + unsafe { core::mem::transmute::<_, [u8; 16]>(addr16) } +}