mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-27 01:04:03 +00:00
c16c22cc9c
The optimized clone method ends up as the following MIR: ``` _2 = copy ((*_1).0: i32); _3 = copy ((*_1).1: u64); _4 = copy ((*_1).2: [i8; 3]); _0 = Foo { a: move _2, b: move _3, c: move _4 }; ``` We can transform this to: ``` _0 = copy (*_1); ```
41 lines
812 B
Rust
41 lines
812 B
Rust
//@ revisions: DEBUGINFO NODEBUGINFO
|
|
//@ compile-flags: -O -Cno-prepopulate-passes
|
|
//@ [DEBUGINFO] compile-flags: -Cdebuginfo=full
|
|
|
|
// From https://github.com/rust-lang/rust/issues/128081.
|
|
// Ensure that we only generate a memcpy instruction.
|
|
|
|
#![crate_type = "lib"]
|
|
|
|
#[derive(Clone)]
|
|
struct SubCloneAndCopy {
|
|
v1: u32,
|
|
v2: u32,
|
|
}
|
|
|
|
#[derive(Clone)]
|
|
struct CloneOnly {
|
|
v1: u8,
|
|
v2: u8,
|
|
v3: u8,
|
|
v4: u8,
|
|
v5: u8,
|
|
v6: u8,
|
|
v7: u8,
|
|
v8: u8,
|
|
v9: u8,
|
|
v_sub: SubCloneAndCopy,
|
|
v_large: [u8; 256],
|
|
}
|
|
|
|
// CHECK-LABEL: define {{.*}}@clone_only(
|
|
#[no_mangle]
|
|
pub fn clone_only(v: &CloneOnly) -> CloneOnly {
|
|
// CHECK-NOT: call {{.*}}clone
|
|
// CHECK-NOT: store i8
|
|
// CHECK-NOT: store i32
|
|
// CHECK: call void @llvm.memcpy
|
|
// CHECK-NEXT: ret void
|
|
v.clone()
|
|
}
|