From 02397c808e975b4e843d595713f03a9b442d352e Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 22 Dec 2022 20:18:30 +0900 Subject: [PATCH 1/2] Add regression test for #86106 Signed-off-by: Yuki Okushi --- src/test/codegen/issue-86106.rs | 56 +++++++++++++++++++++++++++++++++ 1 file changed, 56 insertions(+) create mode 100644 src/test/codegen/issue-86106.rs diff --git a/src/test/codegen/issue-86106.rs b/src/test/codegen/issue-86106.rs new file mode 100644 index 0000000000000..e81cab9f1df71 --- /dev/null +++ b/src/test/codegen/issue-86106.rs @@ -0,0 +1,56 @@ +// min-llvm-version: 15.0 +// compile-flags: -C opt-level=3 -C target-cpu=native + +// The below two functions ensure that both `String::new()` and `"".to_string()` +// produce the identical code. + +#![crate_type = "lib"] + +// CHECK-LABEL: @string_new = unnamed_addr alias void (ptr), ptr @empty_to_string +// CHECK: define void @empty_to_string +#[no_mangle] +pub fn string_new() -> String { + String::new() +} + +#[no_mangle] +pub fn empty_to_string() -> String { + // CHECK-NOT: load i8 + // CHECK: store i64 + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store ptr + // CHECK-NEXT: getelementptr + // CHECK-NOT: store i8 + // CHECK-NEXT: store i64 + // CHECK-NEXT: ret void + "".to_string() +} + +// The below two functions ensure that both `vec![]` and `vec![].clone()` +// produce the identical code. + +// CHECK-LABEL: @empty_vec +#[no_mangle] +pub fn empty_vec() -> Vec { + // CHECK: store i64 + // CHECK-NOT: load i8 + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store ptr + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store i64 + // CHECK-NEXT: ret void + vec![] +} + +// CHECK-LABEL: @empty_vec_clone +#[no_mangle] +pub fn empty_vec_clone() -> Vec { + // CHECK: store i64 + // CHECK-NOT: load i8 + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store ptr + // CHECK-NEXT: getelementptr + // CHECK-NEXT: store i64 + // CHECK-NEXT: ret void + vec![].clone() +} From 3b16aea1237617578451d947a87f057fcc1250b3 Mon Sep 17 00:00:00 2001 From: Yuki Okushi Date: Thu, 22 Dec 2022 20:45:36 +0900 Subject: [PATCH 2/2] Apply review suggestions Signed-off-by: Yuki Okushi --- src/test/codegen/issue-86106.rs | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/src/test/codegen/issue-86106.rs b/src/test/codegen/issue-86106.rs index e81cab9f1df71..e647dbe2514db 100644 --- a/src/test/codegen/issue-86106.rs +++ b/src/test/codegen/issue-86106.rs @@ -1,5 +1,5 @@ // min-llvm-version: 15.0 -// compile-flags: -C opt-level=3 -C target-cpu=native +// compile-flags: -C opt-level=3 // The below two functions ensure that both `String::new()` and `"".to_string()` // produce the identical code. @@ -7,21 +7,20 @@ #![crate_type = "lib"] // CHECK-LABEL: @string_new = unnamed_addr alias void (ptr), ptr @empty_to_string -// CHECK: define void @empty_to_string #[no_mangle] pub fn string_new() -> String { String::new() } +// CHECK-LABEL: define void @empty_to_string #[no_mangle] pub fn empty_to_string() -> String { // CHECK-NOT: load i8 - // CHECK: store i64 + // CHECK: store i{{32|64}} // CHECK-NEXT: getelementptr // CHECK-NEXT: store ptr // CHECK-NEXT: getelementptr - // CHECK-NOT: store i8 - // CHECK-NEXT: store i64 + // CHECK-NEXT: store i{{32|64}} // CHECK-NEXT: ret void "".to_string() } @@ -32,12 +31,12 @@ pub fn empty_to_string() -> String { // CHECK-LABEL: @empty_vec #[no_mangle] pub fn empty_vec() -> Vec { - // CHECK: store i64 + // CHECK: store i{{32|64}} // CHECK-NOT: load i8 // CHECK-NEXT: getelementptr // CHECK-NEXT: store ptr // CHECK-NEXT: getelementptr - // CHECK-NEXT: store i64 + // CHECK-NEXT: store i{{32|64}} // CHECK-NEXT: ret void vec![] } @@ -45,12 +44,12 @@ pub fn empty_vec() -> Vec { // CHECK-LABEL: @empty_vec_clone #[no_mangle] pub fn empty_vec_clone() -> Vec { - // CHECK: store i64 + // CHECK: store i{{32|64}} // CHECK-NOT: load i8 // CHECK-NEXT: getelementptr // CHECK-NEXT: store ptr // CHECK-NEXT: getelementptr - // CHECK-NEXT: store i64 + // CHECK-NEXT: store i{{32|64}} // CHECK-NEXT: ret void vec![].clone() }