From 5d989da90f75f32f4718a42103e8ce80ba579a9d Mon Sep 17 00:00:00 2001 From: Alexander Dreyzen Date: Tue, 27 Jan 2026 11:30:30 -0800 Subject: [PATCH 1/6] test: make 'append-elements' codegen test robust against newer LLVM IR The test was failing on LLVM 21 because of fragile FileCheck patterns that didn't account for newer variable naming conventions and attributes (like 'nonnull align 1') in memcpy calls. The optimization itself is working correctly; this change just makes the test verify the IR more reliably. --- tests/codegen-llvm/lib-optimizations/append-elements.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/codegen-llvm/lib-optimizations/append-elements.rs b/tests/codegen-llvm/lib-optimizations/append-elements.rs index b8657104d6653..8e1fedb33b2ed 100644 --- a/tests/codegen-llvm/lib-optimizations/append-elements.rs +++ b/tests/codegen-llvm/lib-optimizations/append-elements.rs @@ -9,11 +9,11 @@ //! zero-capacity length flowing into the memcpy arguments. // CHECK-LABEL: @vec_append_with_temp_alloc -// CHECK-SAME: ptr{{.*}}[[DST:%[a-z]+]]{{.*}}ptr{{.*}}[[SRC:%[a-z]+]] +// CHECK-SAME: (ptr {{[^%]+}}%[[DST:[a-z0-9._]+]], ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], #[no_mangle] pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: call void @llvm.memcpy.{{.*}}[[DST]].i{{.*}}[[SRC]] + // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%{{[0-9a-z._]+}}, ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_vec(); dst.extend(&temp); @@ -21,11 +21,11 @@ pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { } // CHECK-LABEL: @string_append_with_temp_alloc -// CHECK-SAME: ptr{{.*}}[[DST:%[a-z]+]]{{.*}}ptr{{.*}}[[SRC:%[a-z]+]] +// CHECK-SAME: (ptr {{[^%]+}}%[[DST:[a-z0-9._]+]], ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], #[no_mangle] pub fn string_append_with_temp_alloc(dst: &mut String, src: &str) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: call void @llvm.memcpy.{{.*}}[[DST]].i{{.*}}[[SRC]] + // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%{{[0-9a-z._]+}}, ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_string(); dst.push_str(&temp); From 93d6eba9726981ded05aa3eb14a600e79c807c4f Mon Sep 17 00:00:00 2001 From: Alexander Dreyzen Date: Tue, 27 Jan 2026 17:09:42 -0800 Subject: [PATCH 2/6] test: remove unused DST capture in 'append-elements' test --- tests/codegen-llvm/lib-optimizations/append-elements.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/codegen-llvm/lib-optimizations/append-elements.rs b/tests/codegen-llvm/lib-optimizations/append-elements.rs index 8e1fedb33b2ed..bc95f622d153d 100644 --- a/tests/codegen-llvm/lib-optimizations/append-elements.rs +++ b/tests/codegen-llvm/lib-optimizations/append-elements.rs @@ -9,7 +9,7 @@ //! zero-capacity length flowing into the memcpy arguments. // CHECK-LABEL: @vec_append_with_temp_alloc -// CHECK-SAME: (ptr {{[^%]+}}%[[DST:[a-z0-9._]+]], ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], +// CHECK-SAME: (ptr {{[^%]+}}%{{[a-z0-9._]+}}, ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], #[no_mangle] pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { // CHECK-NOT: call void @llvm.memcpy @@ -21,7 +21,7 @@ pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { } // CHECK-LABEL: @string_append_with_temp_alloc -// CHECK-SAME: (ptr {{[^%]+}}%[[DST:[a-z0-9._]+]], ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], +// CHECK-SAME: (ptr {{[^%]+}}%{{[a-z0-9._]+}}, ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], #[no_mangle] pub fn string_append_with_temp_alloc(dst: &mut String, src: &str) { // CHECK-NOT: call void @llvm.memcpy From 421b72a8d6151656df6efcd4c1a0d4b973f3bd95 Mon Sep 17 00:00:00 2001 From: Alexander Dreyzen Date: Tue, 27 Jan 2026 17:48:11 -0800 Subject: [PATCH 3/6] test: link DST argument to memcpy in 'append-elements' test --- .../lib-optimizations/append-elements.rs | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/tests/codegen-llvm/lib-optimizations/append-elements.rs b/tests/codegen-llvm/lib-optimizations/append-elements.rs index bc95f622d153d..1f83490751e17 100644 --- a/tests/codegen-llvm/lib-optimizations/append-elements.rs +++ b/tests/codegen-llvm/lib-optimizations/append-elements.rs @@ -9,11 +9,14 @@ //! zero-capacity length flowing into the memcpy arguments. // CHECK-LABEL: @vec_append_with_temp_alloc -// CHECK-SAME: (ptr {{[^%]+}}%{{[a-z0-9._]+}}, ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], +// CHECK-SAME: (ptr {{[^%]+}}%[[DST:[a-z0-9._]+]], ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], #[no_mangle] pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%{{[0-9a-z._]+}}, ptr {{.*}}%[[SRC]] + // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], i64 8 + // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] + // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]] + // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_vec(); dst.extend(&temp); @@ -21,11 +24,14 @@ pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { } // CHECK-LABEL: @string_append_with_temp_alloc -// CHECK-SAME: (ptr {{[^%]+}}%{{[a-z0-9._]+}}, ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], +// CHECK-SAME: (ptr {{[^%]+}}%[[DST:[a-z0-9._]+]], ptr {{[^%]+}}%[[SRC:[a-z0-9._]+]], #[no_mangle] pub fn string_append_with_temp_alloc(dst: &mut String, src: &str) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%{{[0-9a-z._]+}}, ptr {{.*}}%[[SRC]] + // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], i64 8 + // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] + // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]] + // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_string(); dst.push_str(&temp); From f7536170cac323fa99ba9e97b1343538d1f5b44b Mon Sep 17 00:00:00 2001 From: Alexander Dreyzen Date: Tue, 27 Jan 2026 19:09:18 -0800 Subject: [PATCH 4/6] tests: make append-elements.rs codegen test architecture-independent --- tests/codegen-llvm/lib-optimizations/append-elements.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/codegen-llvm/lib-optimizations/append-elements.rs b/tests/codegen-llvm/lib-optimizations/append-elements.rs index 1f83490751e17..7e087dee9a684 100644 --- a/tests/codegen-llvm/lib-optimizations/append-elements.rs +++ b/tests/codegen-llvm/lib-optimizations/append-elements.rs @@ -13,7 +13,7 @@ #[no_mangle] pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], i64 8 + // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{i32|i64}} {{4|8}} // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]] // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] @@ -28,7 +28,7 @@ pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { #[no_mangle] pub fn string_append_with_temp_alloc(dst: &mut String, src: &str) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], i64 8 + // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{i32|i64}} {{4|8}} // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]] // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] From cc09f1df030c5b8ae8f4effd0844d6cda3ec297b Mon Sep 17 00:00:00 2001 From: Alexander Dreyzen Date: Wed, 28 Jan 2026 07:15:30 -0800 Subject: [PATCH 5/6] tests: link dst to memcpy in append-elements using arch-independent regex --- tests/codegen-llvm/lib-optimizations/append-elements.rs | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tests/codegen-llvm/lib-optimizations/append-elements.rs b/tests/codegen-llvm/lib-optimizations/append-elements.rs index 7e087dee9a684..ac78801fbfb03 100644 --- a/tests/codegen-llvm/lib-optimizations/append-elements.rs +++ b/tests/codegen-llvm/lib-optimizations/append-elements.rs @@ -13,9 +13,9 @@ #[no_mangle] pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{i32|i64}} {{4|8}} + // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{.*}} {{4|8}} // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] - // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]] + // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]], {{.*}} // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_vec(); @@ -28,9 +28,9 @@ pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { #[no_mangle] pub fn string_append_with_temp_alloc(dst: &mut String, src: &str) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{i32|i64}} {{4|8}} + // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{.*}} {{4|8}} // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] - // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]] + // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]], {{.*}} // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_string(); From b37a53e3587de6b38d09a374e64e859129cd2c6d Mon Sep 17 00:00:00 2001 From: Alexander Dreyzen Date: Wed, 28 Jan 2026 08:54:44 -0800 Subject: [PATCH 6/6] tests: use robust one-liner FileCheck patterns in append-elements.rs --- .../codegen-llvm/lib-optimizations/append-elements.rs | 10 ++-------- 1 file changed, 2 insertions(+), 8 deletions(-) diff --git a/tests/codegen-llvm/lib-optimizations/append-elements.rs b/tests/codegen-llvm/lib-optimizations/append-elements.rs index ac78801fbfb03..66315b46ba7a6 100644 --- a/tests/codegen-llvm/lib-optimizations/append-elements.rs +++ b/tests/codegen-llvm/lib-optimizations/append-elements.rs @@ -13,10 +13,7 @@ #[no_mangle] pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{.*}} {{4|8}} - // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] - // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]], {{.*}} - // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] + // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}, ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_vec(); dst.extend(&temp); @@ -28,10 +25,7 @@ pub fn vec_append_with_temp_alloc(dst: &mut Vec, src: &[u8]) { #[no_mangle] pub fn string_append_with_temp_alloc(dst: &mut String, src: &str) { // CHECK-NOT: call void @llvm.memcpy - // CHECK: %[[INNER_PTR_ADDR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[DST]], {{.*}} {{4|8}} - // CHECK: %[[INNER_PTR:[0-9a-z._]+]] = load ptr, ptr %[[INNER_PTR_ADDR]] - // CHECK: %[[DST_PTR:[0-9a-z._]+]] = getelementptr {{.*}} ptr %[[INNER_PTR]], {{.*}} - // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}%[[DST_PTR]], ptr {{.*}}%[[SRC]] + // CHECK: call void @llvm.memcpy.{{.*}}ptr {{.*}}, ptr {{.*}}%[[SRC]] // CHECK-NOT: call void @llvm.memcpy let temp = src.to_string(); dst.push_str(&temp);