about summary refs log tree commit diff
path: root/tests/codegen
diff options
context:
space:
mode:
authorDianQK <dianqk@dianqk.net>2024-08-21 21:45:47 +0800
committerDianQK <dianqk@dianqk.net>2024-09-14 13:30:35 +0800
commitc16c22cc9c4daf4485c78e789c6e2a4bedea83b4 (patch)
tree691c48b1fb95ed794a49307cb4b170fdea237f0f /tests/codegen
parent23b04c0513472f3728ad482398008e077979e5c4 (diff)
downloadrust-c16c22cc9c4daf4485c78e789c6e2a4bedea83b4.tar.gz
rust-c16c22cc9c4daf4485c78e789c6e2a4bedea83b4.zip
Simplify the canonical clone method to copy
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);
```
Diffstat (limited to 'tests/codegen')
-rw-r--r--tests/codegen/clone_as_copy.rs40
-rw-r--r--tests/codegen/enum/unreachable_enum_default_branch.rs6
2 files changed, 44 insertions, 2 deletions
diff --git a/tests/codegen/clone_as_copy.rs b/tests/codegen/clone_as_copy.rs
new file mode 100644
index 00000000000..36a59ae56b7
--- /dev/null
+++ b/tests/codegen/clone_as_copy.rs
@@ -0,0 +1,40 @@
+//@ 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()
+}
diff --git a/tests/codegen/enum/unreachable_enum_default_branch.rs b/tests/codegen/enum/unreachable_enum_default_branch.rs
index 81a258f2722..76a92496c07 100644
--- a/tests/codegen/enum/unreachable_enum_default_branch.rs
+++ b/tests/codegen/enum/unreachable_enum_default_branch.rs
@@ -28,11 +28,13 @@ pub fn implicit_match(x: Int) -> bool {
 // The code is from https://github.com/rust-lang/rust/issues/110097.
 // We expect it to generate the same optimized code as a full match.
 // CHECK-LABEL: @if_let(
-// CHECK-NEXT:  start:
+// CHECK: start:
+// CHECK-NOT: zext
+// CHECK: select
 // CHECK-NEXT: insertvalue
 // CHECK-NEXT: insertvalue
 // CHECK-NEXT: ret
 #[no_mangle]
 pub fn if_let(val: Result<i32, ()>) -> Result<i32, ()> {
-    if let Ok(x) = val { Ok(x) } else { Err(()) }
+    if let Ok(x) = val { Ok(x * 2) } else { Err(()) }
 }