about summary refs log tree commit diff
path: root/src/test/codegen
diff options
context:
space:
mode:
authorJonas Schievink <jonasschievink@gmail.com>2020-09-26 16:37:13 +0200
committerJonas Schievink <jonasschievink@gmail.com>2020-09-26 17:08:55 +0200
commitcc2ba3bd2753ec94adc93ec4aa9d8d093129cd2d (patch)
tree3df9b7f78be26ed2b856e541fc69991430d270b0 /src/test/codegen
parent4c5acc4ed72f2cd6cf4d2c4ca682d52a117a98d0 (diff)
downloadrust-cc2ba3bd2753ec94adc93ec4aa9d8d093129cd2d.tar.gz
rust-cc2ba3bd2753ec94adc93ec4aa9d8d093129cd2d.zip
Add a test for 128-bit return values
Diffstat (limited to 'src/test/codegen')
-rw-r--r--src/test/codegen/return-value-in-reg.rs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/test/codegen/return-value-in-reg.rs b/src/test/codegen/return-value-in-reg.rs
new file mode 100644
index 00000000000..4bc0136c5e3
--- /dev/null
+++ b/src/test/codegen/return-value-in-reg.rs
@@ -0,0 +1,32 @@
+//! This test checks that types of up to 128 bits are returned by-value instead of via out-pointer.
+
+// compile-flags: -C no-prepopulate-passes -O
+// only-x86_64
+
+#![crate_type = "lib"]
+
+pub struct S {
+    a: u64,
+    b: u32,
+    c: u32,
+}
+
+// CHECK: define i128 @modify(%S* noalias nocapture dereferenceable(16) %s)
+#[no_mangle]
+pub fn modify(s: S) -> S {
+    S { a: s.a + s.a, b: s.b + s.b, c: s.c + s.c }
+}
+
+#[repr(packed)]
+pub struct TooBig {
+    a: u64,
+    b: u32,
+    c: u32,
+    d: u8,
+}
+
+// CHECK: define void @m_big(%TooBig* [[ATTRS:.*sret.*]], %TooBig* [[ATTRS2:.*]] %s)
+#[no_mangle]
+pub fn m_big(s: TooBig) -> TooBig {
+    TooBig { a: s.a + s.a, b: s.b + s.b, c: s.c + s.c, d: s.d + s.d }
+}