about summary refs log tree commit diff
diff options
context:
space:
mode:
authorDianQK <dianqk@dianqk.net>2024-04-06 22:16:10 +0800
committerDianQK <dianqk@dianqk.net>2024-04-07 13:01:54 +0800
commit5acfe772fa811e08046ea849e1b4d84b11e60c34 (patch)
tree0ad08c79d1443fabbc3d1dffd9bc459f8abeee3b
parent87519b258c4708b573bd8d5dc6d775e57c23acac (diff)
downloadrust-5acfe772fa811e08046ea849e1b4d84b11e60c34.tar.gz
rust-5acfe772fa811e08046ea849e1b4d84b11e60c34.zip
Add the test case for #122805
-rw-r--r--tests/codegen/issues/issue-122805.rs35
1 files changed, 35 insertions, 0 deletions
diff --git a/tests/codegen/issues/issue-122805.rs b/tests/codegen/issues/issue-122805.rs
new file mode 100644
index 00000000000..3bfffcd4a96
--- /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) }
+}