mirror of
https://github.com/rust-lang/rust.git
synced 2026-05-06 08:36:52 -04:00
82 lines
1.9 KiB
Rust
82 lines
1.9 KiB
Rust
//@ assembly-output: emit-asm
|
|
//@ compile-flags: -Copt-level=3
|
|
|
|
//@ revisions: aarch64
|
|
//@ [aarch64] only-aarch64
|
|
|
|
//@ revisions: linux-x86_64
|
|
//@ [linux-x86_64] compile-flags: --target x86_64-unknown-linux-gnu
|
|
//@ [linux-x86_64] only-x86_64-unknown-linux-gnu
|
|
//@ [linux-x86_64] needs-llvm-components: x86
|
|
|
|
//@ revisions: windows-x86_64-msvc
|
|
//@ [windows-x86_64-msvc] compile-flags: --target x86_64-pc-windows-msvc
|
|
//@ [windows-x86_64-msvc] needs-llvm-components: x86
|
|
//@ [windows-x86_64-msvc] only-x86_64-pc-windows-msvc
|
|
|
|
#![crate_type = "lib"]
|
|
|
|
// Non-overlapping scopes should reuse of the same stack allocation.
|
|
|
|
pub struct WithOffset<T> {
|
|
pub data: T,
|
|
pub offset: usize,
|
|
}
|
|
|
|
#[inline(never)]
|
|
pub fn peak_w(w: &WithOffset<&[u8; 16]>) {
|
|
std::hint::black_box(w);
|
|
}
|
|
|
|
#[inline(never)]
|
|
pub fn use_w(w: WithOffset<&[u8; 16]>) {
|
|
std::hint::black_box(w);
|
|
}
|
|
|
|
// CHECK-LABEL: scoped_two_small_structs
|
|
#[no_mangle]
|
|
pub fn scoped_two_small_structs(buf: [u8; 16]) {
|
|
{
|
|
let w = WithOffset { data: &buf, offset: 0 };
|
|
|
|
peak_w(&w);
|
|
use_w(w);
|
|
}
|
|
{
|
|
let w2 = WithOffset { data: &buf, offset: 1 };
|
|
|
|
peak_w(&w2);
|
|
use_w(w2);
|
|
}
|
|
// linux-x86_64: subq $16, %rsp
|
|
// windows-x86_64-msvc: subq $48, %rsp
|
|
// aarch64: sub sp, sp, #48
|
|
}
|
|
|
|
// CHECK-LABEL: scoped_three_small_structs
|
|
#[no_mangle]
|
|
pub fn scoped_three_small_structs(buf: [u8; 16]) {
|
|
{
|
|
let w = WithOffset { data: &buf, offset: 0 };
|
|
|
|
peak_w(&w);
|
|
use_w(w);
|
|
}
|
|
{
|
|
let w2 = WithOffset { data: &buf, offset: 1 };
|
|
|
|
peak_w(&w2);
|
|
use_w(w2);
|
|
}
|
|
{
|
|
let w3 = WithOffset { data: &buf, offset: 1 };
|
|
|
|
peak_w(&w3);
|
|
use_w(w3);
|
|
}
|
|
// Should be the same stack usage as the two struct version.
|
|
// linux-x86_64: subq $16, %rsp
|
|
// windows-x86_64-msvc: subq $48, %rsp
|
|
// aarch64: sub sp, sp, #48
|
|
}
|