diff options
author | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
---|---|---|
committer | Daniel Baumann <daniel.baumann@progress-linux.org> | 2024-04-17 12:19:03 +0000 |
commit | 64d98f8ee037282c35007b64c2649055c56af1db (patch) | |
tree | 5492bcf97fce41ee1c0b1cc2add283f3e66cdab0 /src/test/codegen | |
parent | Adding debian version 1.67.1+dfsg1-1. (diff) | |
download | rustc-64d98f8ee037282c35007b64c2649055c56af1db.tar.xz rustc-64d98f8ee037282c35007b64c2649055c56af1db.zip |
Merging upstream version 1.68.2+dfsg1.
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'src/test/codegen')
334 files changed, 0 insertions, 14242 deletions
diff --git a/src/test/codegen/README.md b/src/test/codegen/README.md deleted file mode 100644 index 8f2daaafc..000000000 --- a/src/test/codegen/README.md +++ /dev/null @@ -1,24 +0,0 @@ -The files here use the LLVM FileCheck framework, documented at -<https://llvm.org/docs/CommandGuide/FileCheck.html>. - -One extension worth noting is the use of revisions as custom prefixes for -FileCheck. If your codegen test has different behavior based on the chosen -target or different compiler flags that you want to exercise, you can use a -revisions annotation, like so: - -```rust -// revisions: aaa bbb -// [bbb] compile-flags: --flags-for-bbb -``` - -After specifying those variations, you can write different expected, or -explicitly *unexpected* output by using `<prefix>-SAME:` and `<prefix>-NOT:`, -like so: - -```rust -// CHECK: expected code -// aaa-SAME: emitted-only-for-aaa -// aaa-NOT: emitted-only-for-bbb -// bbb-NOT: emitted-only-for-aaa -// bbb-SAME: emitted-only-for-bbb -``` diff --git a/src/test/codegen/abi-efiapi.rs b/src/test/codegen/abi-efiapi.rs deleted file mode 100644 index 9061d7432..000000000 --- a/src/test/codegen/abi-efiapi.rs +++ /dev/null @@ -1,33 +0,0 @@ -// Checks if the correct annotation for the efiapi ABI is passed to llvm. - -// revisions:x86_64 i686 aarch64 arm riscv -//[x86_64] compile-flags: --target x86_64-unknown-uefi -//[x86_64] needs-llvm-components: aarch64 arm riscv -//[i686] compile-flags: --target i686-unknown-linux-musl -//[i686] needs-llvm-components: aarch64 arm riscv -//[aarch64] compile-flags: --target aarch64-unknown-none -//[aarch64] needs-llvm-components: aarch64 arm riscv -//[arm] compile-flags: --target armv7r-none-eabi -//[arm] needs-llvm-components: aarch64 arm riscv -//[riscv] compile-flags: --target riscv64gc-unknown-none-elf -//[riscv] needs-llvm-components: aarch64 arm riscv -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(no_core, lang_items, abi_efiapi)] -#![no_core] - -#[lang="sized"] -trait Sized { } -#[lang="freeze"] -trait Freeze { } -#[lang="copy"] -trait Copy { } - -//x86_64: define win64cc void @has_efiapi -//i686: define void @has_efiapi -//aarch64: define dso_local void @has_efiapi -//arm: define dso_local arm_aapcscc void @has_efiapi -//riscv: define dso_local void @has_efiapi -#[no_mangle] -pub extern "efiapi" fn has_efiapi() {} diff --git a/src/test/codegen/abi-main-signature-16bit-c-int.rs b/src/test/codegen/abi-main-signature-16bit-c-int.rs deleted file mode 100644 index 4ed491dfb..000000000 --- a/src/test/codegen/abi-main-signature-16bit-c-int.rs +++ /dev/null @@ -1,25 +0,0 @@ -// Checks the signature of the implicitly generated native main() -// entry point. It must match C's `int main(int, char **)`. - -// This test is for targets with 16bit c_int only. -// ignore-aarch64 -// ignore-arm -// ignore-asmjs -// ignore-hexagon -// ignore-mips -// ignore-mips64 -// ignore-powerpc -// ignore-powerpc64 -// ignore-riscv64 -// ignore-s390x -// ignore-sparc -// ignore-sparc64 -// ignore-wasm32 -// ignore-x86 -// ignore-x86_64 -// ignore-xcore - -fn main() { -} - -// CHECK: define i16 @main(i16, i8**) diff --git a/src/test/codegen/abi-main-signature-32bit-c-int.rs b/src/test/codegen/abi-main-signature-32bit-c-int.rs deleted file mode 100644 index 7f22ddcfc..000000000 --- a/src/test/codegen/abi-main-signature-32bit-c-int.rs +++ /dev/null @@ -1,10 +0,0 @@ -// Checks the signature of the implicitly generated native main() -// entry point. It must match C's `int main(int, char **)`. - -// This test is for targets with 32bit c_int only. -// ignore-msp430 - -fn main() { -} - -// CHECK: define{{( hidden)?}} i32 @main(i32{{( %0)?}}, {{i8\*\*|ptr}}{{( %1)?}}) diff --git a/src/test/codegen/abi-repr-ext.rs b/src/test/codegen/abi-repr-ext.rs deleted file mode 100644 index 23ade3c72..000000000 --- a/src/test/codegen/abi-repr-ext.rs +++ /dev/null @@ -1,57 +0,0 @@ -// compile-flags: -O - -// revisions:x86_64 i686 aarch64-apple aarch64-windows aarch64-linux arm riscv - -//[x86_64] compile-flags: --target x86_64-unknown-uefi -//[x86_64] needs-llvm-components: x86 -//[i686] compile-flags: --target i686-unknown-linux-musl -//[i686] needs-llvm-components: x86 -//[aarch64-windows] compile-flags: --target aarch64-pc-windows-msvc -//[aarch64-windows] needs-llvm-components: aarch64 -//[aarch64-linux] compile-flags: --target aarch64-unknown-linux-gnu -//[aarch64-linux] needs-llvm-components: aarch64 -//[aarch64-apple] compile-flags: --target aarch64-apple-darwin -//[aarch64-apple] needs-llvm-components: aarch64 -//[arm] compile-flags: --target armv7r-none-eabi -//[arm] needs-llvm-components: arm -//[riscv] compile-flags: --target riscv64gc-unknown-none-elf -//[riscv] needs-llvm-components: riscv - -// See bottom of file for a corresponding C source file that is meant to yield -// equivalent declarations. -#![feature(no_core, lang_items)] -#![crate_type = "lib"] -#![no_std] -#![no_core] - -#[lang="sized"] trait Sized { } -#[lang="freeze"] trait Freeze { } -#[lang="copy"] trait Copy { } - -#[repr(i8)] -pub enum Type { - Type1 = 0, - Type2 = 1 -} - -// To accommodate rust#97800, one might consider writing the below as: -// -// `define{{( dso_local)?}} noundef{{( signext)?}} i8 @test()` -// -// but based on rust#80556, it seems important to actually check for the -// presence of the `signext` for those targets where we expect it. - -// CHECK: define{{( dso_local)?}} noundef -// x86_64-SAME: signext -// aarch64-apple-SAME: signext -// aarch64-windows-NOT: signext -// aarch64-linux-NOT: signext -// arm-SAME: signext -// riscv-SAME: signext -// CHECK-SAME: i8 @test() - - -#[no_mangle] -pub extern "C" fn test() -> Type { - Type::Type1 -} diff --git a/src/test/codegen/abi-sysv64.rs b/src/test/codegen/abi-sysv64.rs deleted file mode 100644 index dfc312279..000000000 --- a/src/test/codegen/abi-sysv64.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Checks if the correct annotation for the sysv64 ABI is passed to -// llvm. Also checks that the abi-sysv64 feature gate allows usage -// of the sysv64 abi. -// -// needs-llvm-components: x86 -// compile-flags: -C no-prepopulate-passes --target=x86_64-unknown-linux-gnu - -#![crate_type = "lib"] -#![no_core] -#![feature(abi_x86_interrupt, no_core, lang_items)] - -#[lang = "sized"] -trait Sized {} -#[lang = "copy"] -trait Copy {} -impl Copy for i64 {} - -// CHECK: define x86_64_sysvcc i64 @has_sysv64_abi -#[no_mangle] -pub extern "sysv64" fn has_sysv64_abi(a: i64) -> i64 { - a -} diff --git a/src/test/codegen/abi-x86-interrupt.rs b/src/test/codegen/abi-x86-interrupt.rs deleted file mode 100644 index d612f603e..000000000 --- a/src/test/codegen/abi-x86-interrupt.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Checks if the correct annotation for the x86-interrupt ABI is passed to -// llvm. Also checks that the abi_x86_interrupt feature gate allows usage -// of the x86-interrupt abi. - -// needs-llvm-components: x86 -// compile-flags: -C no-prepopulate-passes --target=x86_64-unknown-linux-gnu - -#![crate_type = "lib"] -#![no_core] -#![feature(abi_x86_interrupt, no_core, lang_items)] - -#[lang = "sized"] -trait Sized {} -#[lang = "copy"] -trait Copy {} -impl Copy for i64 {} - -// CHECK: define x86_intrcc i64 @has_x86_interrupt_abi -#[no_mangle] -pub extern "x86-interrupt" fn has_x86_interrupt_abi(a: i64) -> i64 { - a -} diff --git a/src/test/codegen/abi-x86_64_sysv.rs b/src/test/codegen/abi-x86_64_sysv.rs deleted file mode 100644 index 84e06023e..000000000 --- a/src/test/codegen/abi-x86_64_sysv.rs +++ /dev/null @@ -1,29 +0,0 @@ -// only-x86_64 - -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -pub struct S24 { - a: i8, - b: i8, - c: i8, -} - -pub struct S48 { - a: i16, - b: i16, - c: i8, -} - -// CHECK: i24 @struct_24_bits(i24 -#[no_mangle] -pub extern "sysv64" fn struct_24_bits(a: S24) -> S24 { - a -} - -// CHECK: i48 @struct_48_bits(i48 -#[no_mangle] -pub extern "sysv64" fn struct_48_bits(a: S48) -> S48 { - a -} diff --git a/src/test/codegen/adjustments.rs b/src/test/codegen/adjustments.rs deleted file mode 100644 index 39880c934..000000000 --- a/src/test/codegen/adjustments.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -// Hack to get the correct size for the length part in slices -// CHECK: @helper([[USIZE:i[0-9]+]] %_1) -#[no_mangle] -pub fn helper(_: usize) { -} - -// CHECK-LABEL: @no_op_slice_adjustment -#[no_mangle] -pub fn no_op_slice_adjustment(x: &[u8]) -> &[u8] { - // We used to generate an extra alloca and memcpy for the block's trailing expression value, so - // check that we copy directly to the return value slot -// CHECK: %0 = insertvalue { {{\[0 x i8\]\*|ptr}}, [[USIZE]] } undef, {{\[0 x i8\]\*|ptr}} %x.0, 0 -// CHECK: %1 = insertvalue { {{\[0 x i8\]\*|ptr}}, [[USIZE]] } %0, [[USIZE]] %x.1, 1 -// CHECK: ret { {{\[0 x i8\]\*|ptr}}, [[USIZE]] } %1 - { x } -} - -// CHECK-LABEL: @no_op_slice_adjustment2 -#[no_mangle] -pub fn no_op_slice_adjustment2(x: &[u8]) -> &[u8] { - // We used to generate an extra alloca and memcpy for the function's return value, so check - // that there's no memcpy (the slice is written to sret_slot element-wise) -// CHECK-NOT: call void @llvm.memcpy. - no_op_slice_adjustment(x) -} diff --git a/src/test/codegen/align-enum.rs b/src/test/codegen/align-enum.rs deleted file mode 100644 index 70f09ace0..000000000 --- a/src/test/codegen/align-enum.rs +++ /dev/null @@ -1,34 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Z mir-opt-level=0 -// - -#![crate_type = "lib"] - -#[repr(align(64))] -pub enum Align64 { - A(u32), - B(u32), -} -// CHECK: %Align64 = type { i32, [15 x i32] } - -pub struct Nested64 { - a: u8, - b: Align64, - c: u16, -} - -// CHECK-LABEL: @align64 -#[no_mangle] -pub fn align64(a: u32) -> Align64 { -// CHECK: %a64 = alloca %Align64, align 64 -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 64 %{{.*}}, {{i8\*|ptr}} align 64 %{{.*}}, i{{[0-9]+}} 64, i1 false) - let a64 = Align64::A(a); - a64 -} - -// CHECK-LABEL: @nested64 -#[no_mangle] -pub fn nested64(a: u8, b: u32, c: u16) -> Nested64 { -// CHECK: %n64 = alloca %Nested64, align 64 - let n64 = Nested64 { a, b: Align64::B(b), c }; - n64 -} diff --git a/src/test/codegen/align-fn.rs b/src/test/codegen/align-fn.rs deleted file mode 100644 index c5886cf28..000000000 --- a/src/test/codegen/align-fn.rs +++ /dev/null @@ -1,9 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Z mir-opt-level=0 - -#![crate_type = "lib"] -#![feature(fn_align)] - -// CHECK: align 16 -#[no_mangle] -#[repr(align(16))] -pub fn fn_align() {} diff --git a/src/test/codegen/align-struct.rs b/src/test/codegen/align-struct.rs deleted file mode 100644 index a2f47354b..000000000 --- a/src/test/codegen/align-struct.rs +++ /dev/null @@ -1,71 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Z mir-opt-level=0 -// - -#![crate_type = "lib"] - -#[repr(align(64))] -pub struct Align64(i32); -// CHECK: %Align64 = type { i32, [15 x i32] } - -pub struct Nested64 { - a: Align64, - b: i32, - c: i32, - d: i8, -} -// CHECK: %Nested64 = type { %Align64, i32, i32, i8, [55 x i8] } - -pub enum Enum4 { - A(i32), - B(i32), -} -// No Aggregate type, and hence nothing in LLVM IR. - -pub enum Enum64 { - A(Align64), - B(i32), -} -// CHECK: %Enum64 = type { i32, [31 x i32] } -// CHECK: %"Enum64::A" = type { [8 x i64], %Align64 } - -// CHECK-LABEL: @align64 -#[no_mangle] -pub fn align64(i : i32) -> Align64 { -// CHECK: %a64 = alloca %Align64, align 64 -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 64 %{{.*}}, {{i8\*|ptr}} align 64 %{{.*}}, i{{[0-9]+}} 64, i1 false) - let a64 = Align64(i); - a64 -} - -// For issue 54028: make sure that we are specifying the correct alignment for fields of aligned -// structs -// CHECK-LABEL: @align64_load -#[no_mangle] -pub fn align64_load(a: Align64) -> i32 { -// CHECK: {{%.*}} = load i32, {{i32\*|ptr}} {{%.*}}, align 64 - a.0 -} - -// CHECK-LABEL: @nested64 -#[no_mangle] -pub fn nested64(a: Align64, b: i32, c: i32, d: i8) -> Nested64 { -// CHECK: %n64 = alloca %Nested64, align 64 - let n64 = Nested64 { a, b, c, d }; - n64 -} - -// CHECK-LABEL: @enum4 -#[no_mangle] -pub fn enum4(a: i32) -> Enum4 { -// CHECK: %e4 = alloca { i32, i32 }, align 4 - let e4 = Enum4::A(a); - e4 -} - -// CHECK-LABEL: @enum64 -#[no_mangle] -pub fn enum64(a: Align64) -> Enum64 { -// CHECK: %e64 = alloca %Enum64, align 64 - let e64 = Enum64::A(a); - e64 -} diff --git a/src/test/codegen/alloc-optimisation.rs b/src/test/codegen/alloc-optimisation.rs deleted file mode 100644 index c3ffaeb95..000000000 --- a/src/test/codegen/alloc-optimisation.rs +++ /dev/null @@ -1,13 +0,0 @@ -// -// no-system-llvm -// compile-flags: -O -#![crate_type="lib"] - -#[no_mangle] -pub fn alloc_test(data: u32) { - // CHECK-LABEL: @alloc_test - // CHECK-NEXT: start: - // CHECK-NEXT: ret void - let x = Box::new(data); - drop(x); -} diff --git a/src/test/codegen/array-clone.rs b/src/test/codegen/array-clone.rs deleted file mode 100644 index 0d42963bc..000000000 --- a/src/test/codegen/array-clone.rs +++ /dev/null @@ -1,15 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @array_clone -#[no_mangle] -pub fn array_clone(a: &[u8; 2]) -> [u8; 2] { - // CHECK-NOT: getelementptr - // CHECK-NOT: load i8 - // CHECK-NOT: zext - // CHECK-NOT: shl - // CHECK: load i16 - // CHECK-NEXT: ret i16 - a.clone() -} diff --git a/src/test/codegen/array-equality.rs b/src/test/codegen/array-equality.rs deleted file mode 100644 index cd5e82a92..000000000 --- a/src/test/codegen/array-equality.rs +++ /dev/null @@ -1,74 +0,0 @@ -// compile-flags: -O -// only-x86_64 - -#![crate_type = "lib"] - -// CHECK-LABEL: @array_eq_value -#[no_mangle] -pub fn array_eq_value(a: [u16; 3], b: [u16; 3]) -> bool { - // CHECK-NEXT: start: - // CHECK-NEXT: %2 = icmp eq i48 %0, %1 - // CHECK-NEXT: ret i1 %2 - a == b -} - -// CHECK-LABEL: @array_eq_ref -#[no_mangle] -pub fn array_eq_ref(a: &[u16; 3], b: &[u16; 3]) -> bool { - // CHECK: start: - // CHECK: load i48, {{i48\*|ptr}} %{{.+}}, align 2 - // CHECK: load i48, {{i48\*|ptr}} %{{.+}}, align 2 - // CHECK: icmp eq i48 - // CHECK-NEXT: ret - a == b -} - -// CHECK-LABEL: @array_eq_value_still_passed_by_pointer -#[no_mangle] -pub fn array_eq_value_still_passed_by_pointer(a: [u16; 9], b: [u16; 9]) -> bool { - // CHECK-NEXT: start: - // CHECK: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}({{i8\*|ptr}} {{.*}} dereferenceable(18) %{{.+}}, {{i8\*|ptr}} {{.*}} dereferenceable(18) %{{.+}}, i64 18) - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[CMP]], 0 - // CHECK-NEXT: ret i1 %[[EQ]] - a == b -} - -// CHECK-LABEL: @array_eq_long -#[no_mangle] -pub fn array_eq_long(a: &[u16; 1234], b: &[u16; 1234]) -> bool { - // CHECK-NEXT: start: - // CHECK: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}({{i8\*|ptr}} {{.*}} dereferenceable(2468) %{{.+}}, {{i8\*|ptr}} {{.*}} dereferenceable(2468) %{{.+}}, i64 2468) - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[CMP]], 0 - // CHECK-NEXT: ret i1 %[[EQ]] - a == b -} - -// CHECK-LABEL: @array_eq_zero_short(i48 -#[no_mangle] -pub fn array_eq_zero_short(x: [u16; 3]) -> bool { - // CHECK-NEXT: start: - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i48 %0, 0 - // CHECK-NEXT: ret i1 %[[EQ]] - x == [0; 3] -} - -// CHECK-LABEL: @array_eq_zero_mid( -#[no_mangle] -pub fn array_eq_zero_mid(x: [u16; 8]) -> bool { - // CHECK-NEXT: start: - // CHECK: %[[LOAD:.+]] = load i128, - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i128 %[[LOAD]], 0 - // CHECK-NEXT: ret i1 %[[EQ]] - x == [0; 8] -} - -// CHECK-LABEL: @array_eq_zero_long( -#[no_mangle] -pub fn array_eq_zero_long(x: [u16; 1234]) -> bool { - // CHECK-NEXT: start: - // CHECK-NOT: alloca - // CHECK: %[[CMP:.+]] = tail call i32 @{{bcmp|memcmp}}( - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[CMP]], 0 - // CHECK-NEXT: ret i1 %[[EQ]] - x == [0; 1234] -} diff --git a/src/test/codegen/asm-clobber_abi.rs b/src/test/codegen/asm-clobber_abi.rs deleted file mode 100644 index f70caea2f..000000000 --- a/src/test/codegen/asm-clobber_abi.rs +++ /dev/null @@ -1,36 +0,0 @@ -// compile-flags: -O -// only-x86_64 - -#![crate_type = "rlib"] - -use std::arch::asm; - -// CHECK-LABEL: @clobber_sysv64 -// CHECK: ={ax},={cx},={dx},={si},={di},={r8},={r9},={r10},={r11},={xmm0},={xmm1},={xmm2},={xmm3},={xmm4},={xmm5},={xmm6},={xmm7},={xmm8},={xmm9},={xmm10},={xmm11},={xmm12},={xmm13},={xmm14},={xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{k0},~{k1},~{k2},~{k3},~{k4},~{k5},~{k6},~{k7},~{st},~{st(1)},~{st(2)},~{st(3)},~{st(4)},~{st(5)},~{st(6)},~{st(7)},~{tmm0},~{tmm1},~{tmm2},~{tmm3},~{tmm4},~{tmm5},~{tmm6},~{tmm7},~{dirflag},~{fpsr},~{flags},~{memory} -#[no_mangle] -pub unsafe fn clobber_sysv64() { - asm!("", clobber_abi("sysv64")); -} - -// CHECK-LABEL: @clobber_win64 -// CHECK: ={ax},={cx},={dx},={r8},={r9},={r10},={r11},={xmm0},={xmm1},={xmm2},={xmm3},={xmm4},={xmm5},={xmm6},={xmm7},={xmm8},={xmm9},={xmm10},={xmm11},={xmm12},={xmm13},={xmm14},={xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{k0},~{k1},~{k2},~{k3},~{k4},~{k5},~{k6},~{k7},~{st},~{st(1)},~{st(2)},~{st(3)},~{st(4)},~{st(5)},~{st(6)},~{st(7)},~{tmm0},~{tmm1},~{tmm2},~{tmm3},~{tmm4},~{tmm5},~{tmm6},~{tmm7},~{dirflag},~{fpsr},~{flags},~{memory} -#[no_mangle] -pub unsafe fn clobber_win64() { - asm!("", clobber_abi("win64")); -} - -// CHECK-LABEL: @clobber_sysv64 -// CHECK: =&{dx},={ax},={cx},={si},={di},={r8},={r9},={r10},={r11},={xmm0},={xmm1},={xmm2},={xmm3},={xmm4},={xmm5},={xmm6},={xmm7},={xmm8},={xmm9},={xmm10},={xmm11},={xmm12},={xmm13},={xmm14},={xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{k0},~{k1},~{k2},~{k3},~{k4},~{k5},~{k6},~{k7},~{st},~{st(1)},~{st(2)},~{st(3)},~{st(4)},~{st(5)},~{st(6)},~{st(7)},~{tmm0},~{tmm1},~{tmm2},~{tmm3},~{tmm4},~{tmm5},~{tmm6},~{tmm7},~{dirflag},~{fpsr},~{flags},~{memory} -#[no_mangle] -pub unsafe fn clobber_sysv64_edx() { - let foo: i32; - asm!("", out("edx") foo, clobber_abi("sysv64")); -} - -// CHECK-LABEL: @clobber_win64 -// CHECK: =&{dx},={ax},={cx},={r8},={r9},={r10},={r11},={xmm0},={xmm1},={xmm2},={xmm3},={xmm4},={xmm5},={xmm6},={xmm7},={xmm8},={xmm9},={xmm10},={xmm11},={xmm12},={xmm13},={xmm14},={xmm15},~{xmm16},~{xmm17},~{xmm18},~{xmm19},~{xmm20},~{xmm21},~{xmm22},~{xmm23},~{xmm24},~{xmm25},~{xmm26},~{xmm27},~{xmm28},~{xmm29},~{xmm30},~{xmm31},~{k0},~{k1},~{k2},~{k3},~{k4},~{k5},~{k6},~{k7},~{st},~{st(1)},~{st(2)},~{st(3)},~{st(4)},~{st(5)},~{st(6)},~{st(7)},~{tmm0},~{tmm1},~{tmm2},~{tmm3},~{tmm4},~{tmm5},~{tmm6},~{tmm7},~{dirflag},~{fpsr},~{flags},~{memory} -#[no_mangle] -pub unsafe fn clobber_win64_edx() { - let foo: i32; - asm!("", out("edx") foo, clobber_abi("win64")); -} diff --git a/src/test/codegen/asm-clobbers.rs b/src/test/codegen/asm-clobbers.rs deleted file mode 100644 index 2ef10a283..000000000 --- a/src/test/codegen/asm-clobbers.rs +++ /dev/null @@ -1,20 +0,0 @@ -// compile-flags: -O -// only-x86_64 - -#![crate_type = "rlib"] - -use std::arch::asm; - -// CHECK-LABEL: @x87_clobber -// CHECK: ~{st},~{st(1)},~{st(2)},~{st(3)},~{st(4)},~{st(5)},~{st(6)},~{st(7)} -#[no_mangle] -pub unsafe fn x87_clobber() { - asm!("foo", out("st") _); -} - -// CHECK-LABEL: @mmx_clobber -// CHECK: ~{st},~{st(1)},~{st(2)},~{st(3)},~{st(4)},~{st(5)},~{st(6)},~{st(7)} -#[no_mangle] -pub unsafe fn mmx_clobber() { - asm!("bar", out("mm0") _, out("mm1") _); -} diff --git a/src/test/codegen/asm-may_unwind.rs b/src/test/codegen/asm-may_unwind.rs deleted file mode 100644 index c97933035..000000000 --- a/src/test/codegen/asm-may_unwind.rs +++ /dev/null @@ -1,39 +0,0 @@ -// compile-flags: -O -// only-x86_64 - -#![crate_type = "rlib"] -#![feature(asm_unwind)] - -use std::arch::asm; - -#[no_mangle] -pub extern "C" fn panicky() {} - -struct Foo; - -impl Drop for Foo { - fn drop(&mut self) { - println!(); - } -} - -// CHECK-LABEL: @asm_may_unwind -#[no_mangle] -pub unsafe fn asm_may_unwind() { - let _m = Foo; - // CHECK: invoke void asm sideeffect alignstack inteldialect unwind "" - asm!("", options(may_unwind)); -} - -// CHECK-LABEL: @asm_with_result_may_unwind -#[no_mangle] -pub unsafe fn asm_with_result_may_unwind() -> u64 { - let _m = Foo; - let res: u64; - // CHECK: [[RES:%[0-9]+]] = invoke i64 asm sideeffect alignstack inteldialect unwind - // CHECK-NEXT: to label %[[NORMALBB:[a-b0-9]+]] - asm!("mov {}, 1", out(reg) res, options(may_unwind)); - // CHECK: [[NORMALBB]]: - // CHECK: ret i64 [[RES:%[0-9]+]] - res -} diff --git a/src/test/codegen/asm-multiple-options.rs b/src/test/codegen/asm-multiple-options.rs deleted file mode 100644 index 1ae37d627..000000000 --- a/src/test/codegen/asm-multiple-options.rs +++ /dev/null @@ -1,54 +0,0 @@ -// compile-flags: -O -// only-x86_64 - -#![crate_type = "rlib"] - -use std::arch::asm; - -// CHECK-LABEL: @pure -// CHECK-NOT: asm -// CHECK: ret void -#[no_mangle] -pub unsafe fn pure(x: i32) { - let y: i32; - asm!("", out("ax") y, in("cx") x, options(pure), options(nomem)); -} - -pub static mut VAR: i32 = 0; -pub static mut DUMMY_OUTPUT: i32 = 0; - -// CHECK-LABEL: @readonly -// CHECK: call i32 asm -// CHECK: ret i32 1 -#[no_mangle] -pub unsafe fn readonly() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options(pure), options(readonly)); - VAR -} - -// CHECK-LABEL: @nomem -// CHECK-NOT: store -// CHECK: call i32 asm -// CHECK: store -// CHECK: ret i32 2 -#[no_mangle] -pub unsafe fn nomem() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options(pure), options(nomem)); - VAR = 2; - VAR -} - -// CHECK-LABEL: @not_nomem -// CHECK: store -// CHECK: call i32 asm -// CHECK: store -// CHECK: ret i32 2 -#[no_mangle] -pub unsafe fn not_nomem() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options(pure), options(readonly)); - VAR = 2; - VAR -} diff --git a/src/test/codegen/asm-options.rs b/src/test/codegen/asm-options.rs deleted file mode 100644 index 963b60cfe..000000000 --- a/src/test/codegen/asm-options.rs +++ /dev/null @@ -1,104 +0,0 @@ -// compile-flags: -O -// only-x86_64 - -#![crate_type = "rlib"] - -use std::arch::asm; - -// CHECK-LABEL: @pure -// CHECK-NOT: asm -// CHECK: ret void -#[no_mangle] -pub unsafe fn pure(x: i32) { - let y: i32; - asm!("", out("ax") y, in("cx") x, options(pure, nomem)); -} - -// CHECK-LABEL: @noreturn -// CHECK: call void asm -// CHECK-NEXT: unreachable -#[no_mangle] -pub unsafe fn noreturn() { - asm!("", options(noreturn)); -} - -pub static mut VAR: i32 = 0; -pub static mut DUMMY_OUTPUT: i32 = 0; - -// CHECK-LABEL: @readonly -// CHECK: call i32 asm -// CHECK: ret i32 1 -#[no_mangle] -pub unsafe fn readonly() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options(pure, readonly)); - VAR -} - -// CHECK-LABEL: @not_readonly -// CHECK: call i32 asm -// CHECK: ret i32 % -#[no_mangle] -pub unsafe fn not_readonly() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options()); - VAR -} - -// CHECK-LABEL: @nomem -// CHECK-NOT: store -// CHECK: call i32 asm -// CHECK: store -// CHECK: ret i32 2 -#[no_mangle] -pub unsafe fn nomem() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options(pure, nomem)); - VAR = 2; - VAR -} - -// CHECK-LABEL: @nomem_nopure -// CHECK-NOT: store -// CHECK: call i32 asm -// CHECK: store -// CHECK: ret i32 2 -#[no_mangle] -pub unsafe fn nomem_nopure() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options(nomem)); - VAR = 2; - VAR -} - -// CHECK-LABEL: @not_nomem -// CHECK: store -// CHECK: call i32 asm -// CHECK: store -// CHECK: ret i32 2 -#[no_mangle] -pub unsafe fn not_nomem() -> i32 { - VAR = 1; - asm!("", out("ax") DUMMY_OUTPUT, options(pure, readonly)); - VAR = 2; - VAR -} - -// CHECK-LABEL: @dont_remove_nonpure -// CHECK: call void asm -// CHECK: call void asm -// CHECK: call void asm -// CHECK: ret void -#[no_mangle] -pub unsafe fn dont_remove_nonpure() { - asm!("", options()); - asm!("", options(nomem)); - asm!("", options(readonly)); -} - -// CHECK-LABEL: @raw -// CHECK: call void asm sideeffect inteldialect "{} {}", ""() -#[no_mangle] -pub unsafe fn raw() { - asm!("{} {}", options(nostack, nomem, preserves_flags, raw)); -} diff --git a/src/test/codegen/asm-powerpc-clobbers.rs b/src/test/codegen/asm-powerpc-clobbers.rs deleted file mode 100644 index 10b20ba6b..000000000 --- a/src/test/codegen/asm-powerpc-clobbers.rs +++ /dev/null @@ -1,47 +0,0 @@ -// revisions: powerpc powerpc64 powerpc64le -//[powerpc] compile-flags: --target powerpc-unknown-linux-gnu -//[powerpc] needs-llvm-components: powerpc -//[powerpc64] compile-flags: --target powerpc64-unknown-linux-gnu -//[powerpc64] needs-llvm-components: powerpc -//[powerpc64le] compile-flags: --target powerpc64le-unknown-linux-gnu -//[powerpc64le] needs-llvm-components: powerpc - -#![crate_type = "rlib"] -#![feature(no_core, rustc_attrs, lang_items, asm_experimental_arch)] -#![no_core] - -#[lang = "sized"] -trait Sized {} - -#[rustc_builtin_macro] -macro_rules! asm { - () => {}; -} - -// CHECK-LABEL: @cr_clobber -// CHECK: call void asm sideeffect "", "~{cr}"() -#[no_mangle] -pub unsafe fn cr_clobber() { - asm!("", out("cr") _, options(nostack, nomem)); -} - -// CHECK-LABEL: @cr0_clobber -// CHECK: call void asm sideeffect "", "~{cr0}"() -#[no_mangle] -pub unsafe fn cr0_clobber() { - asm!("", out("cr0") _, options(nostack, nomem)); -} - -// CHECK-LABEL: @cr5_clobber -// CHECK: call void asm sideeffect "", "~{cr5}"() -#[no_mangle] -pub unsafe fn cr5_clobber() { - asm!("", out("cr5") _, options(nostack, nomem)); -} - -// CHECK-LABEL: @xer_clobber -// CHECK: call void asm sideeffect "", "~{xer}"() -#[no_mangle] -pub unsafe fn xer_clobber() { - asm!("", out("xer") _, options(nostack, nomem)); -} diff --git a/src/test/codegen/asm-sanitize-llvm.rs b/src/test/codegen/asm-sanitize-llvm.rs deleted file mode 100644 index 6dcacd08c..000000000 --- a/src/test/codegen/asm-sanitize-llvm.rs +++ /dev/null @@ -1,34 +0,0 @@ -// FIXME(nagisa): remove the flags below once all targets support `asm!`. -// compile-flags: --target x86_64-unknown-linux-gnu -// needs-llvm-components: x86 - -// Verify we sanitize the special tokens for the LLVM inline-assembly, ensuring people won't -// inadvertently rely on the LLVM-specific syntax and features. -#![no_core] -#![feature(no_core, lang_items, rustc_attrs)] -#![crate_type = "rlib"] -#![allow(named_asm_labels)] - -#[rustc_builtin_macro] -macro_rules! asm { - () => {}; -} - -#[lang = "sized"] -trait Sized {} -#[lang = "copy"] -trait Copy {} - -pub unsafe fn we_escape_dollar_signs() { - // CHECK: call void asm sideeffect alignstack inteldialect "banana$$:" - asm!( - r"banana$:", - ) -} - -pub unsafe fn we_escape_escapes_too() { - // CHECK: call void asm sideeffect alignstack inteldialect "banana\{{(\\|5C)}}36:" - asm!( - r"banana\36:", - ) -} diff --git a/src/test/codegen/asm-target-clobbers.rs b/src/test/codegen/asm-target-clobbers.rs deleted file mode 100644 index ac30e18ec..000000000 --- a/src/test/codegen/asm-target-clobbers.rs +++ /dev/null @@ -1,29 +0,0 @@ -// only-x86_64 -// revisions: base avx512 -// [avx512]compile-flags: -C target-feature=+avx512f - -#![crate_type = "rlib"] - -use std::arch::asm; - -// CHECK-LABEL: @amx_clobber -// base: call void asm sideeffect inteldialect "", "~{tmm0}"() -#[no_mangle] -pub unsafe fn amx_clobber() { - asm!("", out("tmm0") _, options(nostack, nomem, preserves_flags)); -} - -// CHECK-LABEL: @avx512_clobber -// base: call void asm sideeffect inteldialect "", "~{xmm31}"() -// avx512: call float asm sideeffect inteldialect "", "=&{xmm31}"() -#[no_mangle] -pub unsafe fn avx512_clobber() { - asm!("", out("zmm31") _, options(nostack, nomem, preserves_flags)); -} - -// CHECK-LABEL: @eax_clobber -// CHECK: call i32 asm sideeffect inteldialect "", "=&{ax}"() -#[no_mangle] -pub unsafe fn eax_clobber() { - asm!("", out("eax") _, options(nostack, nomem, preserves_flags)); -} diff --git a/src/test/codegen/async-fn-debug-awaitee-field.rs b/src/test/codegen/async-fn-debug-awaitee-field.rs deleted file mode 100644 index bc2686158..000000000 --- a/src/test/codegen/async-fn-debug-awaitee-field.rs +++ /dev/null @@ -1,25 +0,0 @@ -// This test makes sure that the generator field capturing the awaitee in a `.await` expression -// is called "__awaitee" in debuginfo. This name must not be changed since debuggers and debugger -// extensions rely on the field having this name. - -// ignore-tidy-linelength -// compile-flags: -C debuginfo=2 --edition=2018 - -async fn foo() {} - -async fn async_fn_test() { - foo().await; -} - -// NONMSVC: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "{async_fn_env#0}", scope: [[GEN_SCOPE:![0-9]*]], -// MSVC: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "enum2$<async_fn_debug_awaitee_field::async_fn_test::async_fn_env$0>", -// NONMSVC: [[GEN_SCOPE:!.*]] = !DINamespace(name: "async_fn_test", -// CHECK: [[SUSPEND_STRUCT:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend0", scope: [[GEN]], -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "__awaitee", scope: [[SUSPEND_STRUCT]], {{.*}}, baseType: [[AWAITEE_TYPE:![0-9]*]], -// NONMSVC: [[AWAITEE_TYPE]] = !DICompositeType(tag: DW_TAG_structure_type, name: "{async_fn_env#0}", scope: [[AWAITEE_SCOPE:![0-9]*]], -// MSVC: [[AWAITEE_TYPE]] = !DICompositeType(tag: DW_TAG_union_type, name: "enum2$<async_fn_debug_awaitee_field::foo::async_fn_env$0>", -// NONMSVC: [[AWAITEE_SCOPE]] = !DINamespace(name: "foo", - -fn main() { - let _fn = async_fn_test(); -} diff --git a/src/test/codegen/async-fn-debug-msvc.rs b/src/test/codegen/async-fn-debug-msvc.rs deleted file mode 100644 index 73c652c9d..000000000 --- a/src/test/codegen/async-fn-debug-msvc.rs +++ /dev/null @@ -1,54 +0,0 @@ -// Verify debuginfo for generators: -// - Each variant points to the file and line of its yield point -// - The discriminants are marked artificial -// - Other fields are not marked artificial -// -// -// compile-flags: -C debuginfo=2 --edition=2018 -// only-msvc - -async fn foo() {} -async fn async_fn_test() { - foo().await; - let s = String::from("foo"); - foo().await; -} - -// FIXME: No way to reliably check the filename. - -// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "enum2$<async_fn_debug_msvc::async_fn_test::async_fn_env$0>", -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant0", scope: [[GEN]], -// For brevity, we only check the struct name and members of the last variant. -// CHECK-SAME: file: [[FILE:![0-9]*]], line: 11, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant1", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 15, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant2", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 15, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant3", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 12, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant4", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 14, -// CHECK-SAME: baseType: [[VARIANT_WRAPPER:![0-9]*]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "value", scope: [[VARIANT_WRAPPER]], file: !2, baseType: [[VARIANT:![0-9]*]], -// CHECK: [[VARIANT]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[VARIANT]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "tag", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial - -fn main() { - let _dummy = async_fn_test(); -} diff --git a/src/test/codegen/async-fn-debug.rs b/src/test/codegen/async-fn-debug.rs deleted file mode 100644 index 9f6058a71..000000000 --- a/src/test/codegen/async-fn-debug.rs +++ /dev/null @@ -1,58 +0,0 @@ -// Verify debuginfo for async fn: -// - Each variant points to the file and line of its yield point -// - The discriminants are marked artificial -// - Other fields are not marked artificial -// -// -// compile-flags: -C debuginfo=2 --edition=2018 -// ignore-msvc - -async fn foo() {} -async fn async_fn_test() { - foo().await; - let s = String::from("foo"); - foo().await; -} - -// FIXME: No way to reliably check the filename. - -// CHECK-DAG: [[ASYNC_FN:!.*]] = !DINamespace(name: "async_fn_test" -// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "{async_fn_env#0}", scope: [[ASYNC_FN]] -// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: discriminator: [[DISC:![0-9]*]] -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE:![0-9]*]], line: 11, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DICompositeType(tag: DW_TAG_structure_type, name: "Unresumed", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 15, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 15, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 12, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 14, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[GEN]], -// CHECK-SAME: flags: DIFlagArtificial - -fn main() { - let _dummy = async_fn_test(); -} diff --git a/src/test/codegen/atomic-operations.rs b/src/test/codegen/atomic-operations.rs deleted file mode 100644 index d2bc618df..000000000 --- a/src/test/codegen/atomic-operations.rs +++ /dev/null @@ -1,83 +0,0 @@ -// Code generation of atomic operations. -// compile-flags: -O -#![crate_type = "lib"] - -use std::sync::atomic::{AtomicI32, Ordering::*}; - -// CHECK-LABEL: @compare_exchange -#[no_mangle] -pub fn compare_exchange(a: &AtomicI32) { - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 10 monotonic monotonic - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 11 monotonic acquire - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 12 monotonic seq_cst - let _ = a.compare_exchange(0, 10, Relaxed, Relaxed); - let _ = a.compare_exchange(0, 11, Relaxed, Acquire); - let _ = a.compare_exchange(0, 12, Relaxed, SeqCst); - - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 20 release monotonic - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 21 release acquire - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 22 release seq_cst - let _ = a.compare_exchange(0, 20, Release, Relaxed); - let _ = a.compare_exchange(0, 21, Release, Acquire); - let _ = a.compare_exchange(0, 22, Release, SeqCst); - - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 30 acquire monotonic - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 31 acquire acquire - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 32 acquire seq_cst - let _ = a.compare_exchange(0, 30, Acquire, Relaxed); - let _ = a.compare_exchange(0, 31, Acquire, Acquire); - let _ = a.compare_exchange(0, 32, Acquire, SeqCst); - - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 40 acq_rel monotonic - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 41 acq_rel acquire - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 42 acq_rel seq_cst - let _ = a.compare_exchange(0, 40, AcqRel, Relaxed); - let _ = a.compare_exchange(0, 41, AcqRel, Acquire); - let _ = a.compare_exchange(0, 42, AcqRel, SeqCst); - - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 50 seq_cst monotonic - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 51 seq_cst acquire - // CHECK: cmpxchg {{i32\*|ptr}} %{{.*}}, i32 0, i32 52 seq_cst seq_cst - let _ = a.compare_exchange(0, 50, SeqCst, Relaxed); - let _ = a.compare_exchange(0, 51, SeqCst, Acquire); - let _ = a.compare_exchange(0, 52, SeqCst, SeqCst); -} - -// CHECK-LABEL: @compare_exchange_weak -#[no_mangle] -pub fn compare_exchange_weak(w: &AtomicI32) { - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 10 monotonic monotonic - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 11 monotonic acquire - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 12 monotonic seq_cst - let _ = w.compare_exchange_weak(1, 10, Relaxed, Relaxed); - let _ = w.compare_exchange_weak(1, 11, Relaxed, Acquire); - let _ = w.compare_exchange_weak(1, 12, Relaxed, SeqCst); - - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 20 release monotonic - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 21 release acquire - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 22 release seq_cst - let _ = w.compare_exchange_weak(1, 20, Release, Relaxed); - let _ = w.compare_exchange_weak(1, 21, Release, Acquire); - let _ = w.compare_exchange_weak(1, 22, Release, SeqCst); - - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 30 acquire monotonic - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 31 acquire acquire - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 32 acquire seq_cst - let _ = w.compare_exchange_weak(1, 30, Acquire, Relaxed); - let _ = w.compare_exchange_weak(1, 31, Acquire, Acquire); - let _ = w.compare_exchange_weak(1, 32, Acquire, SeqCst); - - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 40 acq_rel monotonic - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 41 acq_rel acquire - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 42 acq_rel seq_cst - let _ = w.compare_exchange_weak(1, 40, AcqRel, Relaxed); - let _ = w.compare_exchange_weak(1, 41, AcqRel, Acquire); - let _ = w.compare_exchange_weak(1, 42, AcqRel, SeqCst); - - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 50 seq_cst monotonic - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 51 seq_cst acquire - // CHECK: cmpxchg weak {{i32\*|ptr}} %{{.*}}, i32 1, i32 52 seq_cst seq_cst - let _ = w.compare_exchange_weak(1, 50, SeqCst, Relaxed); - let _ = w.compare_exchange_weak(1, 51, SeqCst, Acquire); - let _ = w.compare_exchange_weak(1, 52, SeqCst, SeqCst); -} diff --git a/src/test/codegen/autovectorize-f32x4.rs b/src/test/codegen/autovectorize-f32x4.rs deleted file mode 100644 index 6b09c8fc9..000000000 --- a/src/test/codegen/autovectorize-f32x4.rs +++ /dev/null @@ -1,32 +0,0 @@ -// compile-flags: -C opt-level=3 -// only-x86_64 -#![crate_type = "lib"] - -// CHECK-LABEL: @auto_vectorize_direct -#[no_mangle] -pub fn auto_vectorize_direct(a: [f32; 4], b: [f32; 4]) -> [f32; 4] { -// CHECK: load <4 x float> -// CHECK: load <4 x float> -// CHECK: fadd <4 x float> -// CHECK: store <4 x float> - [ - a[0] + b[0], - a[1] + b[1], - a[2] + b[2], - a[3] + b[3], - ] -} - -// CHECK-LABEL: @auto_vectorize_loop -#[no_mangle] -pub fn auto_vectorize_loop(a: [f32; 4], b: [f32; 4]) -> [f32; 4] { -// CHECK: load <4 x float> -// CHECK: load <4 x float> -// CHECK: fadd <4 x float> -// CHECK: store <4 x float> - let mut c = [0.0; 4]; - for i in 0..4 { - c[i] = a[i] + b[i]; - } - c -} diff --git a/src/test/codegen/auxiliary/extern_decl.rs b/src/test/codegen/auxiliary/extern_decl.rs deleted file mode 100644 index edc483518..000000000 --- a/src/test/codegen/auxiliary/extern_decl.rs +++ /dev/null @@ -1,11 +0,0 @@ -// Auxiliary crate that exports a function and static. Both always -// evaluate to `71`. We force mutability on the static to prevent -// it from being inlined as constant. - -#![crate_type = "lib"] - -#[no_mangle] -pub fn extern_fn() -> u8 { unsafe { extern_static } } - -#[no_mangle] -pub static mut extern_static: u8 = 71; diff --git a/src/test/codegen/auxiliary/nounwind.rs b/src/test/codegen/auxiliary/nounwind.rs deleted file mode 100644 index 73c5aee33..000000000 --- a/src/test/codegen/auxiliary/nounwind.rs +++ /dev/null @@ -1,3 +0,0 @@ -#[no_mangle] -pub fn bar() { -} diff --git a/src/test/codegen/auxiliary/static_dllimport_aux.rs b/src/test/codegen/auxiliary/static_dllimport_aux.rs deleted file mode 100644 index afb0dc42f..000000000 --- a/src/test/codegen/auxiliary/static_dllimport_aux.rs +++ /dev/null @@ -1,13 +0,0 @@ -use std::sync::atomic::{AtomicPtr, Ordering}; - -#[inline(always)] -pub fn memrchr() { - fn detect() {} - - static CROSS_CRATE_STATIC_ITEM: AtomicPtr<()> = AtomicPtr::new(detect as *mut ()); - - unsafe { - let fun = CROSS_CRATE_STATIC_ITEM.load(Ordering::SeqCst); - std::mem::transmute::<*mut (), fn()>(fun)() - } -} diff --git a/src/test/codegen/auxiliary/thread_local_aux.rs b/src/test/codegen/auxiliary/thread_local_aux.rs deleted file mode 100644 index bebaa7754..000000000 --- a/src/test/codegen/auxiliary/thread_local_aux.rs +++ /dev/null @@ -1,5 +0,0 @@ -#![crate_type = "lib"] - -use std::cell::Cell; - -thread_local!(pub static A: Cell<u64> = const { Cell::new(0) }); diff --git a/src/test/codegen/avr/avr-func-addrspace.rs b/src/test/codegen/avr/avr-func-addrspace.rs deleted file mode 100644 index cbbcfad3e..000000000 --- a/src/test/codegen/avr/avr-func-addrspace.rs +++ /dev/null @@ -1,89 +0,0 @@ -// compile-flags: -O --target=avr-unknown-gnu-atmega328 --crate-type=rlib -// needs-llvm-components: avr - -// This test validates that function pointers can be stored in global variables -// and called upon. It ensures that Rust emits function pointers in the correct -// address space to LLVM so that an assertion error relating to casting is -// not triggered. -// -// It also validates that functions can be called through function pointers -// through traits. - -#![feature(no_core, lang_items, unboxed_closures, arbitrary_self_types)] -#![crate_type = "lib"] -#![no_core] - -#[lang = "sized"] -pub trait Sized { } -#[lang = "copy"] -pub trait Copy { } -#[lang = "receiver"] -pub trait Receiver { } -#[lang = "tuple_trait"] -pub trait Tuple { } - -pub struct Result<T, E> { _a: T, _b: E } - -impl Copy for usize {} -impl Copy for &usize {} - -#[lang = "drop_in_place"] -pub unsafe fn drop_in_place<T: ?Sized>(_: *mut T) {} - -#[lang = "fn_once"] -pub trait FnOnce<Args: Tuple> { - #[lang = "fn_once_output"] - type Output; - - extern "rust-call" fn call_once(self, args: Args) -> Self::Output; -} - -#[lang = "fn_mut"] -pub trait FnMut<Args: Tuple> : FnOnce<Args> { - extern "rust-call" fn call_mut(&mut self, args: Args) -> Self::Output; -} - -#[lang = "fn"] -pub trait Fn<Args: Tuple>: FnOnce<Args> { - /// Performs the call operation. - extern "rust-call" fn call(&self, args: Args) -> Self::Output; -} - -pub static mut STORAGE_FOO: fn(&usize, &mut u32) -> Result<(), ()> = arbitrary_black_box; -pub static mut STORAGE_BAR: u32 = 12; - -fn arbitrary_black_box(ptr: &usize, _: &mut u32) -> Result<(), ()> { - let raw_ptr = ptr as *const usize; - let _v: usize = unsafe { *raw_ptr }; - loop {} -} - -#[inline(never)] -#[no_mangle] -fn call_through_fn_trait(a: &mut impl Fn<(), Output=()>) { - (*a)() -} - -#[inline(never)] -fn update_bar_value() { - unsafe { - STORAGE_BAR = 88; - } -} - -// CHECK: define dso_local void @test(){{.+}}addrspace(1) -#[no_mangle] -pub extern "C" fn test() { - let mut buf = 7; - - // A call through the Fn trait must use address space 1. - // - // CHECK: call{{.+}}addrspace(1) void @call_through_fn_trait() - call_through_fn_trait(&mut update_bar_value); - - // A call through a global variable must use address space 1. - // CHECK: load {{.*}}addrspace(1){{.+}}FOO - unsafe { - STORAGE_FOO(&1, &mut buf); - } -} diff --git a/src/test/codegen/binary-search-index-no-bound-check.rs b/src/test/codegen/binary-search-index-no-bound-check.rs deleted file mode 100644 index c1766a4a4..000000000 --- a/src/test/codegen/binary-search-index-no-bound-check.rs +++ /dev/null @@ -1,38 +0,0 @@ -// compile-flags: -O -// ignore-debug: the debug assertions get in the way -#![crate_type = "lib"] - -// Make sure no bounds checks are emitted when slicing or indexing -// with an index from `binary_search`. - -// CHECK-LABEL: @binary_search_index_no_bounds_check -#[no_mangle] -pub fn binary_search_index_no_bounds_check(s: &[u8]) -> u8 { - // CHECK-NOT: panic - // CHECK-NOT: slice_index_len_fail - if let Ok(idx) = s.binary_search(&b'\\') { - s[idx] - } else { - 42 - } -} - -// Similarly, check that `partition_point` is known to return a valid fencepost. - -// CHECK-LABEL: @unknown_split -#[no_mangle] -pub fn unknown_split(x: &[i32], i: usize) -> (&[i32], &[i32]) { - // This just makes sure that the subsequent function is looking for the - // absence of something that might actually be there. - - // CHECK: call core::panicking::panic - x.split_at(i) -} - -// CHECK-LABEL: @partition_point_split_no_bounds_check -#[no_mangle] -pub fn partition_point_split_no_bounds_check(x: &[i32], needle: i32) -> (&[i32], &[i32]) { - // CHECK-NOT: call core::panicking::panic - let i = x.partition_point(|p| p < &needle); - x.split_at(i) -} diff --git a/src/test/codegen/bool-cmp.rs b/src/test/codegen/bool-cmp.rs deleted file mode 100644 index 5090f7c37..000000000 --- a/src/test/codegen/bool-cmp.rs +++ /dev/null @@ -1,18 +0,0 @@ -// This is a test for optimal Ord trait implementation for bool. -// See <https://github.com/rust-lang/rust/issues/66780> for more info. - -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] - -use std::cmp::Ordering; - -// CHECK-LABEL: @cmp_bool -#[no_mangle] -pub fn cmp_bool(a: bool, b: bool) -> Ordering { -// LLVM 10 produces (zext a) + (sext b), but the final lowering is (zext a) - (zext b). -// CHECK: zext i1 -// CHECK: {{z|s}}ext i1 -// CHECK: {{sub|add}} nsw - a.cmp(&b) -} diff --git a/src/test/codegen/box-maybe-uninit-llvm14.rs b/src/test/codegen/box-maybe-uninit-llvm14.rs deleted file mode 100644 index bd1a6599c..000000000 --- a/src/test/codegen/box-maybe-uninit-llvm14.rs +++ /dev/null @@ -1,26 +0,0 @@ -// compile-flags: -O - -// Once we're done with llvm 14 and earlier, this test can be deleted. - -#![crate_type="lib"] - -use std::mem::MaybeUninit; - -// Boxing a `MaybeUninit` value should not copy junk from the stack -#[no_mangle] -pub fn box_uninitialized() -> Box<MaybeUninit<usize>> { - // CHECK-LABEL: @box_uninitialized - // CHECK-NOT: store - // CHECK-NOT: alloca - // CHECK-NOT: memcpy - // CHECK-NOT: memset - Box::new(MaybeUninit::uninit()) -} - -// FIXME: add a test for a bigger box. Currently broken, see -// https://github.com/rust-lang/rust/issues/58201. - -// Hide the LLVM 15+ `allocalign` attribute in the declaration of __rust_alloc -// from the CHECK-NOT above. We don't check the attributes here because we can't rely -// on all of them being set until LLVM 15. -// CHECK: declare noalias{{.*}} @__rust_alloc(i{{[0-9]+}}, i{{[0-9]+.*}}) diff --git a/src/test/codegen/box-maybe-uninit.rs b/src/test/codegen/box-maybe-uninit.rs deleted file mode 100644 index e105e26f1..000000000 --- a/src/test/codegen/box-maybe-uninit.rs +++ /dev/null @@ -1,25 +0,0 @@ -// compile-flags: -O -// min-llvm-version: 15.0 -#![crate_type="lib"] - -use std::mem::MaybeUninit; - -// Boxing a `MaybeUninit` value should not copy junk from the stack -#[no_mangle] -pub fn box_uninitialized() -> Box<MaybeUninit<usize>> { - // CHECK-LABEL: @box_uninitialized - // CHECK-NOT: store - // CHECK-NOT: alloca - // CHECK-NOT: memcpy - // CHECK-NOT: memset - Box::new(MaybeUninit::uninit()) -} - -// FIXME: add a test for a bigger box. Currently broken, see -// https://github.com/rust-lang/rust/issues/58201. - -// Hide the `allocalign` attribute in the declaration of __rust_alloc -// from the CHECK-NOT above, and also verify the attributes got set reasonably. -// CHECK: declare noalias ptr @__rust_alloc(i{{[0-9]+}}, i{{[0-9]+}} allocalign) unnamed_addr [[RUST_ALLOC_ATTRS:#[0-9]+]] - -// CHECK-DAG: attributes [[RUST_ALLOC_ATTRS]] = { {{.*}} allockind("alloc,uninitialized,aligned") allocsize(0) uwtable "alloc-family"="__rust_alloc" {{.*}} } diff --git a/src/test/codegen/bpf-alu32.rs b/src/test/codegen/bpf-alu32.rs deleted file mode 100644 index c68bffd03..000000000 --- a/src/test/codegen/bpf-alu32.rs +++ /dev/null @@ -1,11 +0,0 @@ -// only-bpf -#![crate_type = "lib"] -#![feature(bpf_target_feature)] -#![no_std] - -#[no_mangle] -#[target_feature(enable = "alu32")] -// CHECK: define i8 @foo(i8 returned %arg) unnamed_addr #0 { -pub unsafe fn foo(arg: u8) -> u8 { - arg -} diff --git a/src/test/codegen/branch-protection.rs b/src/test/codegen/branch-protection.rs deleted file mode 100644 index 994c71b26..000000000 --- a/src/test/codegen/branch-protection.rs +++ /dev/null @@ -1,45 +0,0 @@ -// Test that the correct module flags are emitted with different branch protection flags. - -// revisions: BTI PACRET LEAF BKEY NONE -// needs-llvm-components: aarch64 -// [BTI] compile-flags: -Z branch-protection=bti -// [PACRET] compile-flags: -Z branch-protection=pac-ret -// [LEAF] compile-flags: -Z branch-protection=pac-ret,leaf -// [BKEY] compile-flags: -Z branch-protection=pac-ret,b-key -// compile-flags: --target aarch64-unknown-linux-gnu - -#![crate_type = "lib"] -#![feature(no_core, lang_items)] -#![no_core] - -#[lang="sized"] -trait Sized { } - -// A basic test function. -pub fn test() { -} - -// BTI: !"branch-target-enforcement", i32 1 -// BTI: !"sign-return-address", i32 0 -// BTI: !"sign-return-address-all", i32 0 -// BTI: !"sign-return-address-with-bkey", i32 0 - -// PACRET: !"branch-target-enforcement", i32 0 -// PACRET: !"sign-return-address", i32 1 -// PACRET: !"sign-return-address-all", i32 0 -// PACRET: !"sign-return-address-with-bkey", i32 0 - -// LEAF: !"branch-target-enforcement", i32 0 -// LEAF: !"sign-return-address", i32 1 -// LEAF: !"sign-return-address-all", i32 1 -// LEAF: !"sign-return-address-with-bkey", i32 0 - -// BKEY: !"branch-target-enforcement", i32 0 -// BKEY: !"sign-return-address", i32 1 -// BKEY: !"sign-return-address-all", i32 0 -// BKEY: !"sign-return-address-with-bkey", i32 1 - -// NONE-NOT: branch-target-enforcement -// NONE-NOT: sign-return-address -// NONE-NOT: sign-return-address-all -// NONE-NOT: sign-return-address-with-bkey diff --git a/src/test/codegen/c-variadic-copy.rs b/src/test/codegen/c-variadic-copy.rs deleted file mode 100644 index 4c61c4fcf..000000000 --- a/src/test/codegen/c-variadic-copy.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Tests that `VaListImpl::clone` gets inlined into a call to `llvm.va_copy` - -#![crate_type = "lib"] -#![feature(c_variadic)] -#![no_std] -use core::ffi::VaList; - -extern "C" { - fn foreign_c_variadic_1(_: VaList, ...); -} - -pub unsafe extern "C" fn clone_variadic(ap: VaList) { - let mut ap2 = ap.clone(); - // CHECK: call void @llvm.va_copy - foreign_c_variadic_1(ap2.as_va_list(), 42i32); -} diff --git a/src/test/codegen/c-variadic-opt.rs b/src/test/codegen/c-variadic-opt.rs deleted file mode 100644 index 969dce80f..000000000 --- a/src/test/codegen/c-variadic-opt.rs +++ /dev/null @@ -1,30 +0,0 @@ -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] -#![feature(c_variadic)] -#![no_std] -use core::ffi::VaList; - -extern "C" { - fn vprintf(fmt: *const i8, ap: VaList) -> i32; -} - -// Ensure that `va_start` and `va_end` are properly injected even -// when the "spoofed" `VaListImpl` is not used. -#[no_mangle] -pub unsafe extern "C" fn c_variadic_no_use(fmt: *const i8, mut ap: ...) -> i32 { - // CHECK: call void @llvm.va_start - vprintf(fmt, ap.as_va_list()) - // CHECK: call void @llvm.va_end -} - -// Check that `VaListImpl::clone` gets inlined into a direct call to `llvm.va_copy` -#[no_mangle] -pub unsafe extern "C" fn c_variadic_clone(fmt: *const i8, mut ap: ...) -> i32 { - // CHECK: call void @llvm.va_start - let mut ap2 = ap.clone(); - // CHECK: call void @llvm.va_copy - let res = vprintf(fmt, ap2.as_va_list()); - res - // CHECK: call void @llvm.va_end -} diff --git a/src/test/codegen/c-variadic.rs b/src/test/codegen/c-variadic.rs deleted file mode 100644 index a5be56c47..000000000 --- a/src/test/codegen/c-variadic.rs +++ /dev/null @@ -1,72 +0,0 @@ -// ignore-wasm32-bare compiled with panic=abort by default -// compile-flags: -C no-prepopulate-passes -// - -#![crate_type = "lib"] -#![feature(c_variadic)] -#![feature(c_unwind)] -#![no_std] -use core::ffi::VaList; - -extern "C" { - fn foreign_c_variadic_0(_: i32, ...); - fn foreign_c_variadic_1(_: VaList, ...); -} - -pub unsafe extern "C" fn use_foreign_c_variadic_0() { - // Ensure that we correctly call foreign C-variadic functions. - // CHECK: call void (i32, ...) @foreign_c_variadic_0([[PARAM:i32( signext)?]] 0) - foreign_c_variadic_0(0); - // CHECK: call void (i32, ...) @foreign_c_variadic_0([[PARAM]] 0, [[PARAM]] 42) - foreign_c_variadic_0(0, 42i32); - // CHECK: call void (i32, ...) @foreign_c_variadic_0([[PARAM]] 0, [[PARAM]] 42, [[PARAM]] 1024) - foreign_c_variadic_0(0, 42i32, 1024i32); - // CHECK: call void (i32, ...) @foreign_c_variadic_0([[PARAM]] 0, [[PARAM]] 42, [[PARAM]] 1024, [[PARAM]] 0) - foreign_c_variadic_0(0, 42i32, 1024i32, 0i32); -} - -// Ensure that we do not remove the `va_list` passed to the foreign function when -// removing the "spoofed" `VaListImpl` that is used by Rust defined C-variadics. -pub unsafe extern "C" fn use_foreign_c_variadic_1_0(ap: VaList) { - // CHECK: call void ({{.*}}, ...) @foreign_c_variadic_1({{.*}} %ap) - foreign_c_variadic_1(ap); -} - -pub unsafe extern "C" fn use_foreign_c_variadic_1_1(ap: VaList) { - // CHECK: call void ({{.*}}, ...) @foreign_c_variadic_1({{.*}} %ap, [[PARAM]] 42) - foreign_c_variadic_1(ap, 42i32); -} -pub unsafe extern "C" fn use_foreign_c_variadic_1_2(ap: VaList) { - // CHECK: call void ({{.*}}, ...) @foreign_c_variadic_1({{.*}} %ap, [[PARAM]] 2, [[PARAM]] 42) - foreign_c_variadic_1(ap, 2i32, 42i32); -} - -pub unsafe extern "C" fn use_foreign_c_variadic_1_3(ap: VaList) { - // CHECK: call void ({{.*}}, ...) @foreign_c_variadic_1({{.*}} %ap, [[PARAM]] 2, [[PARAM]] 42, [[PARAM]] 0) - foreign_c_variadic_1(ap, 2i32, 42i32, 0i32); -} - -// Ensure that `va_start` and `va_end` are properly injected. -#[no_mangle] -pub unsafe extern "C" fn c_variadic(n: i32, mut ap: ...) -> i32 { - // CHECK: call void @llvm.va_start - let mut sum = 0; - for _ in 0..n { - sum += ap.arg::<i32>(); - } - sum - // CHECK: call void @llvm.va_end -} - -// Ensure that we generate the correct `call` signature when calling a Rust -// defined C-variadic. -pub unsafe fn test_c_variadic_call() { - // CHECK: call [[RET:(signext )?i32]] (i32, ...) @c_variadic([[PARAM]] 0) - c_variadic(0); - // CHECK: call [[RET]] (i32, ...) @c_variadic([[PARAM]] 0, [[PARAM]] 42) - c_variadic(0, 42i32); - // CHECK: call [[RET]] (i32, ...) @c_variadic([[PARAM]] 0, [[PARAM]] 42, [[PARAM]] 1024) - c_variadic(0, 42i32, 1024i32); - // CHECK: call [[RET]] (i32, ...) @c_variadic([[PARAM]] 0, [[PARAM]] 42, [[PARAM]] 1024, [[PARAM]] 0) - c_variadic(0, 42i32, 1024i32, 0i32); -} diff --git a/src/test/codegen/call-llvm-intrinsics.rs b/src/test/codegen/call-llvm-intrinsics.rs deleted file mode 100644 index 998099c23..000000000 --- a/src/test/codegen/call-llvm-intrinsics.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -// ignore-riscv64 - -#![feature(link_llvm_intrinsics)] -#![crate_type = "lib"] - -struct A; - -impl Drop for A { - fn drop(&mut self) { - println!("A"); - } -} - -extern "C" { - #[link_name = "llvm.sqrt.f32"] - fn sqrt(x: f32) -> f32; -} - -pub fn do_call() { - let _a = A; - - unsafe { - // Ensure that we `call` LLVM intrinsics instead of trying to `invoke` them - // CHECK: call float @llvm.sqrt.f32(float 4.000000e+00 - sqrt(4.0); - } -} diff --git a/src/test/codegen/call-metadata.rs b/src/test/codegen/call-metadata.rs deleted file mode 100644 index 1c30c08d3..000000000 --- a/src/test/codegen/call-metadata.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Checks that range metadata gets emitted on calls to functions returning a -// scalar value. - -// compile-flags: -O -C no-prepopulate-passes - -#![crate_type = "lib"] - -pub fn test() { - // CHECK: call noundef i8 @some_true(), !range [[R0:![0-9]+]] - // CHECK: [[R0]] = !{i8 0, i8 3} - some_true(); -} - -#[no_mangle] -fn some_true() -> Option<bool> { - Some(true) -} diff --git a/src/test/codegen/catch-unwind.rs b/src/test/codegen/catch-unwind.rs deleted file mode 100644 index 3ea3a24bf..000000000 --- a/src/test/codegen/catch-unwind.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -O - -// On x86 the closure is inlined in foo() producing something like -// define i32 @foo() [...] { -// tail call void @bar() [...] -// ret i32 0 -// } -// On riscv the closure is another function, placed before fn foo so CHECK can't -// find it -// ignore-riscv64 FIXME - -#![crate_type = "lib"] -#![feature(c_unwind)] - -extern "C" { - fn bar(); -} - -// CHECK-LABEL: @foo -#[no_mangle] -pub unsafe fn foo() -> i32 { - // CHECK: call void @bar - // CHECK: ret i32 0 - std::panic::catch_unwind(|| { - bar(); - 0 - }) - .unwrap() -} diff --git a/src/test/codegen/cdylib-external-inline-fns.rs b/src/test/codegen/cdylib-external-inline-fns.rs deleted file mode 100644 index 9118afd43..000000000 --- a/src/test/codegen/cdylib-external-inline-fns.rs +++ /dev/null @@ -1,43 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "cdylib"] - -// CHECK: define{{( dso_local)?}} void @a() -#[no_mangle] -#[inline] -pub extern "C" fn a() {} - -// CHECK: define{{( dso_local)?}} void @b() -#[export_name = "b"] -#[inline] -pub extern "C" fn b() {} - -// CHECK: define{{( dso_local)?}} void @c() -#[no_mangle] -#[inline] -extern "C" fn c() {} - -// CHECK: define{{( dso_local)?}} void @d() -#[export_name = "d"] -#[inline] -extern "C" fn d() {} - -// CHECK: define{{( dso_local)?}} void @e() -#[no_mangle] -#[inline(always)] -pub extern "C" fn e() {} - -// CHECK: define{{( dso_local)?}} void @f() -#[export_name = "f"] -#[inline(always)] -pub extern "C" fn f() {} - -// CHECK: define{{( dso_local)?}} void @g() -#[no_mangle] -#[inline(always)] -extern "C" fn g() {} - -// CHECK: define{{( dso_local)?}} void @h() -#[export_name = "h"] -#[inline(always)] -extern "C" fn h() {} diff --git a/src/test/codegen/cf-protection.rs b/src/test/codegen/cf-protection.rs deleted file mode 100644 index ccbc863f5..000000000 --- a/src/test/codegen/cf-protection.rs +++ /dev/null @@ -1,38 +0,0 @@ -// Test that the correct module flags are emitted with different control-flow protection flags. - -// revisions: undefined none branch return full -// needs-llvm-components: x86 -// [undefined] compile-flags: -// [none] compile-flags: -Z cf-protection=none -// [branch] compile-flags: -Z cf-protection=branch -// [return] compile-flags: -Z cf-protection=return -// [full] compile-flags: -Z cf-protection=full -// compile-flags: --target x86_64-unknown-linux-gnu - -#![crate_type = "lib"] -#![feature(no_core, lang_items)] -#![no_core] - -#[lang="sized"] -trait Sized { } - -// A basic test function. -pub fn test() { -} - -// undefined-NOT: !"cf-protection-branch" -// undefined-NOT: !"cf-protection-return" - -// none-NOT: !"cf-protection-branch" -// none-NOT: !"cf-protection-return" - -// branch-NOT: !"cf-protection-return" -// branch: !"cf-protection-branch", i32 1 -// branch-NOT: !"cf-protection-return" - -// return-NOT: !"cf-protection-branch" -// return: !"cf-protection-return", i32 1 -// return-NOT: !"cf-protection-branch" - -// full: !"cf-protection-branch", i32 1 -// full: !"cf-protection-return", i32 1 diff --git a/src/test/codegen/cfguard-checks.rs b/src/test/codegen/cfguard-checks.rs deleted file mode 100644 index 571a2654b..000000000 --- a/src/test/codegen/cfguard-checks.rs +++ /dev/null @@ -1,11 +0,0 @@ -// compile-flags: -C control-flow-guard=checks -// only-msvc - -#![crate_type = "lib"] - -// A basic test function. -pub fn test() { -} - -// Ensure the module flag cfguard=2 is present -// CHECK: !"cfguard", i32 2 diff --git a/src/test/codegen/cfguard-disabled.rs b/src/test/codegen/cfguard-disabled.rs deleted file mode 100644 index c3f8f4116..000000000 --- a/src/test/codegen/cfguard-disabled.rs +++ /dev/null @@ -1,11 +0,0 @@ -// compile-flags: -C control-flow-guard=no -// only-msvc - -#![crate_type = "lib"] - -// A basic test function. -pub fn test() { -} - -// Ensure the module flag cfguard is not present -// CHECK-NOT: !"cfguard" diff --git a/src/test/codegen/cfguard-nochecks.rs b/src/test/codegen/cfguard-nochecks.rs deleted file mode 100644 index 3847c3e81..000000000 --- a/src/test/codegen/cfguard-nochecks.rs +++ /dev/null @@ -1,11 +0,0 @@ -// compile-flags: -C control-flow-guard=nochecks -// only-msvc - -#![crate_type = "lib"] - -// A basic test function. -pub fn test() { -} - -// Ensure the module flag cfguard=1 is present -// CHECK: !"cfguard", i32 1 diff --git a/src/test/codegen/cfguard-non-msvc.rs b/src/test/codegen/cfguard-non-msvc.rs deleted file mode 100644 index 6278a951e..000000000 --- a/src/test/codegen/cfguard-non-msvc.rs +++ /dev/null @@ -1,11 +0,0 @@ -// compile-flags: -C control-flow-guard -// ignore-msvc - -#![crate_type = "lib"] - -// A basic test function. -pub fn test() { -} - -// Ensure the cfguard module flag is not added for non-MSVC targets. -// CHECK-NOT: !"cfguard" diff --git a/src/test/codegen/codemodels.rs b/src/test/codegen/codemodels.rs deleted file mode 100644 index 2328f5feb..000000000 --- a/src/test/codegen/codemodels.rs +++ /dev/null @@ -1,20 +0,0 @@ -// only-x86_64 - -// revisions: NOMODEL MODEL-SMALL MODEL-KERNEL MODEL-MEDIUM MODEL-LARGE -//[NOMODEL] compile-flags: -//[MODEL-SMALL] compile-flags: -C code-model=small -//[MODEL-KERNEL] compile-flags: -C code-model=kernel -//[MODEL-MEDIUM] compile-flags: -C code-model=medium -//[MODEL-LARGE] compile-flags: -C code-model=large - -#![crate_type = "lib"] - -// MODEL-SMALL: !llvm.module.flags = !{{{.*}}} -// MODEL-SMALL: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 1} -// MODEL-KERNEL: !llvm.module.flags = !{{{.*}}} -// MODEL-KERNEL: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 2} -// MODEL-MEDIUM: !llvm.module.flags = !{{{.*}}} -// MODEL-MEDIUM: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 3} -// MODEL-LARGE: !llvm.module.flags = !{{{.*}}} -// MODEL-LARGE: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 4} -// NOMODEL-NOT: Code Model diff --git a/src/test/codegen/coercions.rs b/src/test/codegen/coercions.rs deleted file mode 100644 index d645ca6b1..000000000 --- a/src/test/codegen/coercions.rs +++ /dev/null @@ -1,19 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -static X: i32 = 5; - -// CHECK-LABEL: @raw_ptr_to_raw_ptr_noop -// CHECK-NOT: alloca -#[no_mangle] -pub fn raw_ptr_to_raw_ptr_noop() -> *const i32{ - &X as *const i32 -} - -// CHECK-LABEL: @reference_to_raw_ptr_noop -// CHECK-NOT: alloca -#[no_mangle] -pub fn reference_to_raw_ptr_noop() -> *const i32 { - &X -} diff --git a/src/test/codegen/cold-call-declare-and-call.rs b/src/test/codegen/cold-call-declare-and-call.rs deleted file mode 100644 index 71d49478b..000000000 --- a/src/test/codegen/cold-call-declare-and-call.rs +++ /dev/null @@ -1,18 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(rust_cold_cc)] - -// wasm marks the definition as `dso_local`, so allow that as optional. - -// CHECK: define{{( dso_local)?}} coldcc void @this_should_never_happen(i16 -// CHECK: call coldcc void @this_should_never_happen(i16 - -#[no_mangle] -pub extern "rust-cold" fn this_should_never_happen(x: u16) {} - -pub fn do_things(x: u16) { - if x == 12345 { - this_should_never_happen(54321); - } -} diff --git a/src/test/codegen/consts.rs b/src/test/codegen/consts.rs deleted file mode 100644 index 260d9de86..000000000 --- a/src/test/codegen/consts.rs +++ /dev/null @@ -1,56 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// min-llvm-version: 14.0 - -#![crate_type = "lib"] - -// Below, these constants are defined as enum variants that by itself would -// have a lower alignment than the enum type. Ensure that we mark them -// correctly with the higher alignment of the enum. - -// CHECK: @STATIC = {{.*}}, align 4 - -// This checks the constants from inline_enum_const -// CHECK: @alloc12 = {{.*}}, align 2 - -// This checks the constants from {low,high}_align_const, they share the same -// constant, but the alignment differs, so the higher one should be used -// CHECK: [[LOW_HIGH:@alloc[0-9]+]] = {{.*}}, align 4 - -#[derive(Copy, Clone)] -// repr(i16) is required for the {low,high}_align_const test -#[repr(i16)] -pub enum E<A, B> { - A(A), - B(B), -} - -#[no_mangle] -pub static STATIC: E<i16, i32> = E::A(0); - -// CHECK-LABEL: @static_enum_const -#[no_mangle] -pub fn static_enum_const() -> E<i16, i32> { - STATIC -} - -// CHECK-LABEL: @inline_enum_const -#[no_mangle] -pub fn inline_enum_const() -> E<i8, i16> { - *&E::A(0) -} - -// CHECK-LABEL: @low_align_const -#[no_mangle] -pub fn low_align_const() -> E<i16, [i16; 3]> { - // Check that low_align_const and high_align_const use the same constant - // CHECK: memcpy.{{.+}}({{i8\*|ptr}} align 2 %{{[0-9]+}}, {{i8\*|ptr}} align 2 {{.*}}[[LOW_HIGH]]{{.*}}, i{{(32|64)}} 8, i1 false) - *&E::A(0) -} - -// CHECK-LABEL: @high_align_const -#[no_mangle] -pub fn high_align_const() -> E<i16, i32> { - // Check that low_align_const and high_align_const use the same constant - // CHECK: memcpy.{{.+}}({{i8\*|ptr}} align 4 %{{[0-9]+}}, {{i8\*|ptr}} align 4 {{.*}}[[LOW_HIGH]]{{.*}}, i{{(32|64)}} 8, i1 false) - *&E::A(0) -} diff --git a/src/test/codegen/dealloc-no-unwind.rs b/src/test/codegen/dealloc-no-unwind.rs deleted file mode 100644 index 3812ef44f..000000000 --- a/src/test/codegen/dealloc-no-unwind.rs +++ /dev/null @@ -1,22 +0,0 @@ -// no-system-llvm -// compile-flags: -O - -#![crate_type="lib"] - -struct A; - -impl Drop for A { - fn drop(&mut self) { - extern "C" { fn foo(); } - unsafe { foo(); } - } -} - -#[no_mangle] -pub fn a(a: Box<i32>) { - // CHECK-LABEL: define{{.*}}void @a - // CHECK: call void @__rust_dealloc - // CHECK-NEXT: call void @foo - let _a = A; - drop(a); -} diff --git a/src/test/codegen/debug-alignment.rs b/src/test/codegen/debug-alignment.rs deleted file mode 100644 index f6c1062e0..000000000 --- a/src/test/codegen/debug-alignment.rs +++ /dev/null @@ -1,8 +0,0 @@ -// Verifies that DWARF alignment is specified properly. -// -// compile-flags: -C debuginfo=2 -#![crate_type = "lib"] - -// CHECK: !DIGlobalVariable -// CHECK: align: 32 -pub static A: u32 = 1; diff --git a/src/test/codegen/debug-column-msvc.rs b/src/test/codegen/debug-column-msvc.rs deleted file mode 100644 index aad8b372a..000000000 --- a/src/test/codegen/debug-column-msvc.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Verify that no column information is emitted for MSVC targets -// -// only-msvc -// compile-flags: -C debuginfo=2 - -// CHECK-NOT: !DILexicalBlock({{.*}}column: {{.*}}) -// CHECK-NOT: !DILocation({{.*}}column: {{.*}}) - -pub fn add(a: u32, b: u32) -> u32 { - a + b -} - -fn main() { - let c = add(1, 2); - println!("{}", c); -} diff --git a/src/test/codegen/debug-column.rs b/src/test/codegen/debug-column.rs deleted file mode 100644 index e61642b8e..000000000 --- a/src/test/codegen/debug-column.rs +++ /dev/null @@ -1,24 +0,0 @@ -// Verify that debuginfo column numbers are 1-based byte offsets. -// -// ignore-windows -// compile-flags: -C debuginfo=2 - -fn main() { - unsafe { - // Column numbers are 1-based. Regression test for #65437. - // CHECK: call void @giraffe(), !dbg [[A:!.*]] - giraffe(); - - // Column numbers use byte offests. Regression test for #67360 - // CHECK: call void @turtle(), !dbg [[B:!.*]] -/* ż */ turtle(); - - // CHECK: [[A]] = !DILocation(line: 10, column: 9, - // CHECK: [[B]] = !DILocation(line: 14, column: 10, - } -} - -extern "C" { - fn giraffe(); - fn turtle(); -} diff --git a/src/test/codegen/debug-compile-unit-path.rs b/src/test/codegen/debug-compile-unit-path.rs deleted file mode 100644 index 3661be046..000000000 --- a/src/test/codegen/debug-compile-unit-path.rs +++ /dev/null @@ -1,9 +0,0 @@ -// compile-flags: -g --remap-path-prefix={{cwd}}=/cwd/ --remap-path-prefix={{src-base}}=/base/ -// -// -// Ensure that we remap the compile unit directory and that we set it to the compilers current -// working directory and not something else. -#![crate_type="rlib"] - -// CHECK-DAG: [[FILE:![0-9]*]] = !DIFile(filename: "/base/debug-compile-unit-path.rs{{.*}}", directory: "/cwd/") -// CHECK-DAG: {{![0-9]*}} = distinct !DICompileUnit({{.*}}file: [[FILE]] diff --git a/src/test/codegen/debug-linkage-name.rs b/src/test/codegen/debug-linkage-name.rs deleted file mode 100644 index 9011a7da5..000000000 --- a/src/test/codegen/debug-linkage-name.rs +++ /dev/null @@ -1,42 +0,0 @@ -// Verifies that linkage name is omitted when it is -// the same as variable / function name. -// -// compile-flags: -C no-prepopulate-passes -// compile-flags: -C debuginfo=2 -#![crate_type = "lib"] - -pub mod xyz { - // CHECK: !DIGlobalVariable(name: "A", - // CHECK: linkageName: - // CHECK-SAME: line: 12, - pub static A: u32 = 1; - - // CHECK: !DIGlobalVariable(name: "B", - // CHECK-NOT: linkageName: - // CHECK-SAME: line: 18, - #[no_mangle] - pub static B: u32 = 2; - - // CHECK: !DIGlobalVariable(name: "C", - // CHECK-NOT: linkageName: - // CHECK-SAME: line: 24, - #[export_name = "C"] - pub static C: u32 = 2; - - // CHECK: !DISubprogram(name: "e", - // CHECK: linkageName: - // CHECK-SAME: line: 29, - pub extern "C" fn e() {} - - // CHECK: !DISubprogram(name: "f", - // CHECK-NOT: linkageName: - // CHECK-SAME: line: 35, - #[no_mangle] - pub extern "C" fn f() {} - - // CHECK: !DISubprogram(name: "g", - // CHECK-NOT: linkageName: - // CHECK-SAME: line: 41, - #[export_name = "g"] - pub extern "C" fn g() {} -} diff --git a/src/test/codegen/debug-vtable.rs b/src/test/codegen/debug-vtable.rs deleted file mode 100644 index bdd312878..000000000 --- a/src/test/codegen/debug-vtable.rs +++ /dev/null @@ -1,107 +0,0 @@ -// This test checks the debuginfo for the expected 3 vtables is generated for correct names and number -// of entries. - -// Use the v0 symbol mangling scheme to codegen order independent of rustc version. -// Unnamed items like shims are generated in lexicographical order of their symbol name and in the -// legacy mangling scheme rustc version and generic parameters are both hashed into a single part -// of the name, thus randomizing item order with respect to rustc version. - -// compile-flags: -Cdebuginfo=2 -Copt-level=0 -Csymbol-mangling-version=v0 -// ignore-tidy-linelength - -// NONMSVC: ![[USIZE:[0-9]+]] = !DIBasicType(name: "usize" -// MSVC: ![[USIZE:[0-9]+]] = !DIDerivedType(tag: DW_TAG_typedef, name: "usize" -// NONMSVC: ![[PTR:[0-9]+]] = !DIDerivedType(tag: DW_TAG_pointer_type, name: "*const ()" -// MSVC: ![[PTR:[0-9]+]] = !DIDerivedType(tag: DW_TAG_pointer_type, name: "ptr_const$<tuple$<> >" - -// NONMSVC: !DIGlobalVariable(name: "<debug_vtable::Foo as debug_vtable::SomeTrait>::{vtable}" -// MSVC: !DIGlobalVariable(name: "impl$<debug_vtable::Foo, debug_vtable::SomeTrait>::vtable$" - -// NONMSVC: ![[VTABLE_TY0:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "<debug_vtable::Foo as debug_vtable::SomeTrait>::{vtable_type}", {{.*}} size: {{320|160}}, align: {{64|32}}, flags: DIFlagArtificial, {{.*}} vtableHolder: ![[FOO_TYPE:[0-9]+]], -// MSVC: ![[VTABLE_TY0:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "impl$<debug_vtable::Foo, debug_vtable::SomeTrait>::vtable_type$", {{.*}} size: {{320|160}}, align: {{64|32}}, flags: DIFlagArtificial, {{.*}} vtableHolder: ![[FOO_TYPE:[0-9]+]], -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "drop_in_place", scope: ![[VTABLE_TY0]], {{.*}} baseType: ![[PTR]], size: {{64|32}}, align: {{64|32}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "size", scope: ![[VTABLE_TY0]], {{.*}} baseType: ![[USIZE]], size: {{64|32}}, align: {{64|32}}, offset: {{64|32}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "align", scope: ![[VTABLE_TY0]], {{.*}} baseType: ![[USIZE]], size: {{64|32}}, align: {{64|32}}, offset: {{128|64}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "__method3", scope: ![[VTABLE_TY0]], {{.*}} baseType: ![[PTR]], size: {{64|32}}, align: {{64|32}}, offset: {{192|96}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "__method4", scope: ![[VTABLE_TY0]], {{.*}} baseType: ![[PTR]], size: {{64|32}}, align: {{64|32}}, offset: {{256|128}}) -// CHECK: ![[FOO_TYPE]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Foo", - -// NONMSVC: !DIGlobalVariable(name: "<debug_vtable::Foo as debug_vtable::SomeTraitWithGenerics<u64, i8>>::{vtable}" -// MSVC: !DIGlobalVariable(name: "impl$<debug_vtable::Foo, debug_vtable::SomeTraitWithGenerics<u64,i8> >::vtable$" - -// NONMSVC: ![[VTABLE_TY1:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "<debug_vtable::Foo as debug_vtable::SomeTraitWithGenerics<u64, i8>>::{vtable_type}", {{.*}}, size: {{256|128}}, align: {{64|32}}, flags: DIFlagArtificial, {{.*}}, vtableHolder: ![[FOO_TYPE]], -// MSVC: ![[VTABLE_TY1:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "impl$<debug_vtable::Foo, debug_vtable::SomeTraitWithGenerics<u64,i8> >::vtable_type$", {{.*}}, size: {{256|128}}, align: {{64|32}}, flags: DIFlagArtificial, {{.*}}, vtableHolder: ![[FOO_TYPE]], -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "drop_in_place", scope: ![[VTABLE_TY1]], {{.*}} baseType: ![[PTR]], size: {{64|32}}, align: {{64|32}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "size", scope: ![[VTABLE_TY1]], {{.*}} baseType: ![[USIZE]], size: {{64|32}}, align: {{64|32}}, offset: {{64|32}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "align", scope: ![[VTABLE_TY1]], {{.*}} baseType: ![[USIZE]], size: {{64|32}}, align: {{64|32}}, offset: {{128|64}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "__method3", scope: ![[VTABLE_TY1]], {{.*}} baseType: ![[PTR]], size: {{64|32}}, align: {{64|32}}, offset: {{192|96}}) - -// NONMSVC: !DIGlobalVariable(name: "<debug_vtable::Foo as _>::{vtable}" -// MSVC: !DIGlobalVariable(name: "impl$<debug_vtable::Foo, _>::vtable$" - -// NONMSVC: ![[VTABLE_TY2:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "<debug_vtable::Foo as _>::{vtable_type}", {{.*}}, size: {{192|96}}, align: {{64|32}}, flags: DIFlagArtificial, {{.*}}, vtableHolder: ![[FOO_TYPE]], -// MSVC: ![[VTABLE_TY2:[0-9]+]] = !DICompositeType(tag: DW_TAG_structure_type, name: "impl$<debug_vtable::Foo, _>::vtable_type$", {{.*}}, size: {{192|96}}, align: {{64|32}}, flags: DIFlagArtificial, {{.*}}, vtableHolder: ![[FOO_TYPE]], -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "drop_in_place", scope: ![[VTABLE_TY2]], {{.*}}, baseType: ![[PTR]], size: {{64|32}}, align: {{64|32}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "size", scope: ![[VTABLE_TY2]], {{.*}}, baseType: ![[USIZE]], size: {{64|32}}, align: {{64|32}}, offset: {{64|32}}) -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "align", scope: ![[VTABLE_TY2]], {{.*}}, baseType: ![[USIZE]], size: {{64|32}}, align: {{64|32}}, offset: {{128|64}}) - -// NONMSVC: !DIGlobalVariable(name: "<debug_vtable::bar::{closure_env#0} as core::ops::function::FnOnce<(core::option::Option<&dyn core::ops::function::Fn<(), Output=()>>)>>::{vtable}" -// MSVC: !DIGlobalVariable(name: "impl$<debug_vtable::bar::closure_env$0, core::ops::function::FnOnce<tuple$<enum2$<core::option::Option<ref$<dyn$<core::ops::function::Fn<tuple$<>,assoc$<Output,tuple$<> > > > > > > > > >::vtable$" - -// NONMSVC: !DIGlobalVariable(name: "<debug_vtable::generic_closure::{closure_env#0}<bool> as core::ops::function::FnOnce<()>>::{vtable}" -// MSVC: !DIGlobalVariable(name: "impl$<debug_vtable::generic_closure::closure_env$0<bool>, core::ops::function::FnOnce<tuple$<> > >::vtable$ - -// NONMSVC: !DIGlobalVariable(name: "<debug_vtable::generic_closure::{closure_env#0}<u32> as core::ops::function::FnOnce<()>>::{vtable}" -// MSVC: !DIGlobalVariable(name: "impl$<debug_vtable::generic_closure::closure_env$0<u32>, core::ops::function::FnOnce<tuple$<> > >::vtable$ - -#![crate_type = "lib"] - -// Force emission for debuginfo for usize and *const() early.. -pub static mut XYZ: Option<(usize, *const ())> = None; - -pub struct Foo; - -pub trait SomeTrait { - fn method1(&self) -> u32; - fn method2(&self) -> u32; -} - -impl SomeTrait for Foo { - fn method1(&self) -> u32 { - 1 - } - fn method2(&self) -> u32 { - 2 - } -} - -pub trait SomeTraitWithGenerics<T, U> { - fn method1(&self) -> (T, U); -} - -impl SomeTraitWithGenerics<u64, i8> for Foo { - fn method1(&self) -> (u64, i8) { - (1, 2) - } -} - -pub fn foo(x: &Foo) -> (u32, (u64, i8), &dyn Send) { - let y: &dyn SomeTrait = x; - let z: &dyn SomeTraitWithGenerics<u64, i8> = x; - (y.method1(), z.method1(), x as &dyn Send) -} - -// Constructing the debuginfo name for the FnOnce vtable below initially caused an ICE on MSVC -// because the trait type contains a late bound region that needed to be erased before the type -// layout for the niche enum `Option<&dyn Fn()>` could be computed. -pub fn bar() -> Box<dyn FnOnce(Option<&dyn Fn()>)> { - Box::new(|_x: Option<&dyn Fn()>| {}) -} - -fn generic_closure<T: 'static>(x: T) -> Box<dyn FnOnce() -> T> { - Box::new(move || x) -} - -pub fn instantiate_generic_closures() -> (Box<dyn FnOnce() -> u32>, Box<dyn FnOnce() -> bool>) { - (generic_closure(1u32), generic_closure(false)) -} diff --git a/src/test/codegen/debuginfo-generic-closure-env-names.rs b/src/test/codegen/debuginfo-generic-closure-env-names.rs deleted file mode 100644 index b29f8b4a0..000000000 --- a/src/test/codegen/debuginfo-generic-closure-env-names.rs +++ /dev/null @@ -1,89 +0,0 @@ -// This test checks that we get proper type names for closure environments and -// async-fn environments in debuginfo, especially making sure that generic arguments -// of the enclosing functions don't get lost. -// -// Unfortunately, the order that debuginfo gets emitted into LLVM IR becomes a bit hard -// to predict once async fns are involved, so DAG allows any order. -// -// Note that the test does not check async-fns when targeting MSVC because debuginfo for -// those does not follow the enum-fallback encoding yet and thus is incomplete. - -// ignore-tidy-linelength - -// Use the v0 symbol mangling scheme to codegen order independent of rustc version. -// Unnamed items like shims are generated in lexicographical order of their symbol name and in the -// legacy mangling scheme rustc version and generic parameters are both hashed into a single part -// of the name, thus randomizing item order with respect to rustc version. - -// compile-flags: -Cdebuginfo=2 --edition 2021 -Copt-level=0 -Csymbol-mangling-version=v0 - -// non_generic_closure() -// NONMSVC: !DICompositeType(tag: DW_TAG_structure_type, name: "{closure_env#0}", scope: ![[non_generic_closure_NAMESPACE:[0-9]+]], -// MSVC: !DICompositeType(tag: DW_TAG_structure_type, name: "closure_env$0", scope: ![[non_generic_closure_NAMESPACE:[0-9]+]], -// CHECK: ![[non_generic_closure_NAMESPACE]] = !DINamespace(name: "non_generic_closure" - -// CHECK: ![[function_containing_closure_NAMESPACE:[0-9]+]] = !DINamespace(name: "function_containing_closure" -// CHECK: ![[generic_async_function_NAMESPACE:[0-9]+]] = !DINamespace(name: "generic_async_function" -// CHECK: ![[generic_async_block_NAMESPACE:[0-9]+]] = !DINamespace(name: "generic_async_block" - -// function_containing_closure<u32>() -// NONMSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "{closure_env#0}<u32>", scope: ![[function_containing_closure_NAMESPACE]] -// MSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "closure_env$0<u32>", scope: ![[function_containing_closure_NAMESPACE]] - -// generic_async_function<Foo>() -// NONMSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "{async_fn_env#0}<debuginfo_generic_closure_env_names::Foo>", scope: ![[generic_async_function_NAMESPACE]] - -// generic_async_function<u32>() -// NONMSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "{async_fn_env#0}<u32>", scope: ![[generic_async_function_NAMESPACE]] - -// generic_async_block<Foo>() -// NONMSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "{async_block_env#0}<debuginfo_generic_closure_env_names::Foo>", scope: ![[generic_async_block_NAMESPACE]] - -// generic_async_block<u32>() -// NONMSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "{async_block_env#0}<u32>", scope: ![[generic_async_block_NAMESPACE]] - -// function_containing_closure<Foo>() -// NONMSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "{closure_env#0}<debuginfo_generic_closure_env_names::Foo>", scope: ![[function_containing_closure_NAMESPACE]] -// MSVC-DAG: !DICompositeType(tag: DW_TAG_structure_type, name: "closure_env$0<debuginfo_generic_closure_env_names::Foo>", scope: ![[function_containing_closure_NAMESPACE]] - - -#![crate_type = "lib"] -use std::future::Future; - -pub struct Foo; - -pub fn non_generic_closure(x: Foo) -> Box<dyn FnOnce() -> Foo> { - return Box::new(move || x); -} - -fn function_containing_closure<T: 'static>(x: T) -> impl FnOnce() -> T { - // This static only exists to trigger generating the namespace debuginfo for - // `function_containing_closure` at a predictable, early point, which makes - // writing the FileCheck tests above simpler. - static _X: u8 = 0; - - return move || x; -} - -async fn generic_async_function<T: 'static>(x: T) -> T { - static _X: u8 = 0; // Same as above - x -} - -fn generic_async_block<T: 'static>(x: T) -> impl Future<Output=T> { - static _X: u8 = 0; // Same as above - async move { - x - } -} - -pub fn instantiate_generics() { - let _closure_u32 = function_containing_closure(7u32); - let _closure_foo = function_containing_closure(Foo); - - let _async_fn_u32 = generic_async_function(42u32); - let _async_fn_foo = generic_async_function(Foo); - - let _async_block_u32 = generic_async_block(64u32); - let _async_block_foo = generic_async_block(Foo); -} diff --git a/src/test/codegen/deduced-param-attrs.rs b/src/test/codegen/deduced-param-attrs.rs deleted file mode 100644 index 153046eef..000000000 --- a/src/test/codegen/deduced-param-attrs.rs +++ /dev/null @@ -1,60 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] -#![allow(incomplete_features)] -#![feature(unsized_locals, unsized_fn_params)] - -use std::cell::Cell; -use std::hint; - -// Check to make sure that we can deduce the `readonly` attribute from function bodies for -// parameters passed indirectly. - -pub struct BigStruct { - blah: [i32; 1024], -} - -pub struct BigCellContainer { - blah: [Cell<i32>; 1024], -} - -// The by-value parameter for this big struct can be marked readonly. -// -// CHECK: @use_big_struct_immutably({{.*}} readonly {{.*}} %big_struct) -#[no_mangle] -pub fn use_big_struct_immutably(big_struct: BigStruct) { - hint::black_box(&big_struct); -} - -// The by-value parameter for this big struct can't be marked readonly, because we mutate it. -// -// CHECK-NOT: @use_big_struct_mutably({{.*}} readonly {{.*}} %big_struct) -#[no_mangle] -pub fn use_big_struct_mutably(mut big_struct: BigStruct) { - big_struct.blah[987] = 654; - hint::black_box(&big_struct); -} - -// The by-value parameter for this big struct can't be marked readonly, because it contains -// UnsafeCell. -// -// CHECK-NOT: @use_big_cell_container({{.*}} readonly {{.*}} %big_cell_container) -#[no_mangle] -pub fn use_big_cell_container(big_cell_container: BigCellContainer) { - hint::black_box(&big_cell_container); -} - -// Make sure that we don't mistakenly mark a big struct as `readonly` when passed through a generic -// type parameter if it contains UnsafeCell. -// -// CHECK-NOT: @use_something({{.*}} readonly {{.*}} %something) -#[no_mangle] -#[inline(never)] -pub fn use_something<T>(something: T) { - hint::black_box(&something); -} - -#[no_mangle] -pub fn forward_big_cell_container(big_cell_container: BigCellContainer) { - use_something(big_cell_container) -} diff --git a/src/test/codegen/default-requires-uwtable.rs b/src/test/codegen/default-requires-uwtable.rs deleted file mode 100644 index 5d77d3f14..000000000 --- a/src/test/codegen/default-requires-uwtable.rs +++ /dev/null @@ -1,16 +0,0 @@ -// revisions: WINDOWS ANDROID -// compile-flags: -C panic=abort -// [WINDOWS] compile-flags: --target=x86_64-pc-windows-msvc -// [WINDOWS] needs-llvm-components: x86 -// [ANDROID] compile-flags: --target=armv7-linux-androideabi -// [ANDROID] needs-llvm-components: arm - -#![feature(no_core, lang_items)] -#![crate_type = "lib"] -#![no_core] - -#[lang = "sized"] -trait Sized {} - -// CHECK: attributes #{{.*}} uwtable -pub fn foo() {} diff --git a/src/test/codegen/dllimports/auxiliary/dummy.rs b/src/test/codegen/dllimports/auxiliary/dummy.rs deleted file mode 100644 index 113a164f1..000000000 --- a/src/test/codegen/dllimports/auxiliary/dummy.rs +++ /dev/null @@ -1,6 +0,0 @@ -// no-prefer-dynamic -#![crate_type = "staticlib"] - -// Since codegen tests don't actually perform linking, this library doesn't need to export -// any symbols. It's here just to satisfy the compiler looking for a .lib file when processing -// #[link(...)] attributes in wrapper.rs. diff --git a/src/test/codegen/dllimports/auxiliary/wrapper.rs b/src/test/codegen/dllimports/auxiliary/wrapper.rs deleted file mode 100644 index 7aa90920a..000000000 --- a/src/test/codegen/dllimports/auxiliary/wrapper.rs +++ /dev/null @@ -1,14 +0,0 @@ -// no-prefer-dynamic -#![crate_type = "rlib"] - -#[link(name = "dummy", kind="dylib")] -extern "C" { - pub fn dylib_func2(x: i32) -> i32; - pub static dylib_global2: i32; -} - -#[link(name = "dummy", kind="static")] -extern "C" { - pub fn static_func2(x: i32) -> i32; - pub static static_global2: i32; -} diff --git a/src/test/codegen/dllimports/main.rs b/src/test/codegen/dllimports/main.rs deleted file mode 100644 index ab599992f..000000000 --- a/src/test/codegen/dllimports/main.rs +++ /dev/null @@ -1,43 +0,0 @@ -// This test is for *-windows-msvc only. -// only-windows -// ignore-gnu - -// aux-build:dummy.rs -// aux-build:wrapper.rs - -extern crate wrapper; - -// Check that external symbols coming from foreign dylibs are adorned with 'dllimport', -// whereas symbols coming from foreign staticlibs are not. (RFC-1717) - -// CHECK: @dylib_global1 = external dllimport local_unnamed_addr global i32 -// CHECK: @dylib_global2 = external dllimport local_unnamed_addr global i32 -// CHECK: @static_global1 = external local_unnamed_addr global i32 -// CHECK: @static_global2 = external local_unnamed_addr global i32 - -// CHECK: declare dllimport i32 @dylib_func1(i32) -// CHECK: declare dllimport i32 @dylib_func2(i32) -// CHECK: declare i32 @static_func1(i32) -// CHECK: declare i32 @static_func2(i32) - -#[link(name = "dummy", kind="dylib")] -extern "C" { - pub fn dylib_func1(x: i32) -> i32; - pub static dylib_global1: i32; -} - -#[link(name = "dummy", kind="static")] -extern "C" { - pub fn static_func1(x: i32) -> i32; - pub static static_global1: i32; -} - -fn main() { - unsafe { - dylib_func1(dylib_global1); - wrapper::dylib_func2(wrapper::dylib_global2); - - static_func1(static_global1); - wrapper::static_func2(wrapper::static_global2); - } -} diff --git a/src/test/codegen/drop.rs b/src/test/codegen/drop.rs deleted file mode 100644 index 994028271..000000000 --- a/src/test/codegen/drop.rs +++ /dev/null @@ -1,36 +0,0 @@ -// ignore-wasm32-bare compiled with panic=abort by default -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -struct SomeUniqueName; - -impl Drop for SomeUniqueName { - fn drop(&mut self) { - } -} - -pub fn possibly_unwinding() { -} - -// CHECK-LABEL: @droppy -#[no_mangle] -pub fn droppy() { -// Check that there are exactly 6 drop calls. The cleanups for the unwinding should be reused, so -// that's one new drop call per call to possibly_unwinding(), and finally 3 drop calls for the -// regular function exit. We used to have problems with quadratic growths of drop calls in such -// functions. -// FIXME(eddyb) the `void @` forces a match on the instruction, instead of the -// comment, that's `; call core::ptr::drop_in_place::<drop::SomeUniqueName>` -// for the `v0` mangling, should switch to matching on that once `legacy` is gone. -// CHECK-COUNT-6: {{(call|invoke) void @.*}}drop_in_place{{.*}}SomeUniqueName -// CHECK-NOT: {{(call|invoke) void @.*}}drop_in_place{{.*}}SomeUniqueName -// The next line checks for the } that ends the function definition -// CHECK-LABEL: {{^[}]}} - let _s = SomeUniqueName; - possibly_unwinding(); - let _s = SomeUniqueName; - possibly_unwinding(); - let _s = SomeUniqueName; - possibly_unwinding(); -} diff --git a/src/test/codegen/dst-vtable-align-nonzero.rs b/src/test/codegen/dst-vtable-align-nonzero.rs deleted file mode 100644 index 14c4c3f30..000000000 --- a/src/test/codegen/dst-vtable-align-nonzero.rs +++ /dev/null @@ -1,45 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// This test checks that we annotate alignment loads from vtables with nonzero range metadata, -// and that this allows LLVM to eliminate redundant `align >= 1` checks. - -pub trait Trait { - fn f(&self); -} - -pub struct WrapperWithAlign1<T: ?Sized> { x: u8, y: T } - -pub struct WrapperWithAlign2<T: ?Sized> { x: u16, y: T } - -pub struct Struct<W: ?Sized> { - _field: i8, - dst: W, -} - -// CHECK-LABEL: @eliminates_runtime_check_when_align_1 -#[no_mangle] -pub fn eliminates_runtime_check_when_align_1( - x: &Struct<WrapperWithAlign1<dyn Trait>> -) -> &WrapperWithAlign1<dyn Trait> { - // CHECK: load [[USIZE:i[0-9]+]], {{.+}} !range [[RANGE_META:![0-9]+]] - // CHECK-NOT: llvm.umax - // CHECK-NOT: icmp - // CHECK-NOT: select - // CHECK: ret - &x.dst -} - -// CHECK-LABEL: @does_not_eliminate_runtime_check_when_align_2 -#[no_mangle] -pub fn does_not_eliminate_runtime_check_when_align_2( - x: &Struct<WrapperWithAlign2<dyn Trait>> -) -> &WrapperWithAlign2<dyn Trait> { - // CHECK: [[X0:%[0-9]+]] = load [[USIZE]], {{.+}} !range [[RANGE_META]] - // CHECK: {{icmp|llvm.umax}} - // CHECK: ret - &x.dst -} - -// CHECK: [[RANGE_META]] = !{[[USIZE]] 1, [[USIZE]] 0} diff --git a/src/test/codegen/enum-bounds-check-derived-idx.rs b/src/test/codegen/enum-bounds-check-derived-idx.rs deleted file mode 100644 index aa66c2ed0..000000000 --- a/src/test/codegen/enum-bounds-check-derived-idx.rs +++ /dev/null @@ -1,24 +0,0 @@ -// This test checks an optimization that is not guaranteed to work. This test case should not block -// a future LLVM update. -// compile-flags: -O - -#![crate_type = "lib"] - -pub enum Bar { - A = 1, - B = 3, -} - -// CHECK-LABEL: @lookup_inc -#[no_mangle] -pub fn lookup_inc(buf: &[u8; 5], f: Bar) -> u8 { - // CHECK-NOT: panic_bounds_check - buf[f as usize + 1] -} - -// CHECK-LABEL: @lookup_dec -#[no_mangle] -pub fn lookup_dec(buf: &[u8; 5], f: Bar) -> u8 { - // CHECK-NOT: panic_bounds_check - buf[f as usize - 1] -} diff --git a/src/test/codegen/enum-bounds-check-issue-13926.rs b/src/test/codegen/enum-bounds-check-issue-13926.rs deleted file mode 100644 index b26945bc5..000000000 --- a/src/test/codegen/enum-bounds-check-issue-13926.rs +++ /dev/null @@ -1,18 +0,0 @@ -// This test checks an optimization that is not guaranteed to work. This test case should not block -// a future LLVM update. -// compile-flags: -O - -#![crate_type = "lib"] - -#[repr(u8)] -pub enum Exception { - Low = 5, - High = 10, -} - -// CHECK-LABEL: @access -#[no_mangle] -pub fn access(array: &[usize; 12], exc: Exception) -> usize { - // CHECK-NOT: panic_bounds_check - array[(exc as u8 - 4) as usize] -} diff --git a/src/test/codegen/enum-bounds-check-issue-82871.rs b/src/test/codegen/enum-bounds-check-issue-82871.rs deleted file mode 100644 index 32fdc4a5f..000000000 --- a/src/test/codegen/enum-bounds-check-issue-82871.rs +++ /dev/null @@ -1,18 +0,0 @@ -// compile-flags: -C opt-level=0 - -#![crate_type = "lib"] - -#[repr(C)] -pub enum E { - A, -} - -// CHECK-LABEL: @index -#[no_mangle] -pub fn index(x: &[u32; 3], ind: E) -> u32 { - // Canary: we should be able to optimize out the bounds check, but we need - // to track the range of the discriminant result in order to be able to do that. - // oli-obk tried to add that, but that caused miscompilations all over the place. - // CHECK: panic_bounds_check - x[ind as usize] -} diff --git a/src/test/codegen/enum-bounds-check.rs b/src/test/codegen/enum-bounds-check.rs deleted file mode 100644 index 17322d591..000000000 --- a/src/test/codegen/enum-bounds-check.rs +++ /dev/null @@ -1,26 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -pub enum Foo { - A, B -} - -// CHECK-LABEL: @lookup -#[no_mangle] -pub fn lookup(buf: &[u8; 2], f: Foo) -> u8 { - // CHECK-NOT: panic_bounds_check - buf[f as usize] -} - -pub enum Bar { - A = 2, - B = 3 -} - -// CHECK-LABEL: @lookup_unmodified -#[no_mangle] -pub fn lookup_unmodified(buf: &[u8; 5], f: Bar) -> u8 { - // CHECK-NOT: panic_bounds_check - buf[f as usize] -} diff --git a/src/test/codegen/enum-debug-clike.rs b/src/test/codegen/enum-debug-clike.rs deleted file mode 100644 index 1e369a2c4..000000000 --- a/src/test/codegen/enum-debug-clike.rs +++ /dev/null @@ -1,23 +0,0 @@ -// This tests that debug info for "c-like" enums is properly emitted. -// This is ignored for the fallback mode on MSVC due to problems with PDB. - -// -// ignore-msvc - -// compile-flags: -g -C no-prepopulate-passes - -// CHECK-LABEL: @main -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_enumeration_type,{{.*}}name: "E",{{.*}}flags: DIFlagEnumClass,{{.*}} -// CHECK: {{.*}}DIEnumerator{{.*}}name: "A",{{.*}}value: {{[0-9].*}} -// CHECK: {{.*}}DIEnumerator{{.*}}name: "B",{{.*}}value: {{[0-9].*}} -// CHECK: {{.*}}DIEnumerator{{.*}}name: "C",{{.*}}value: {{[0-9].*}} - -#![allow(dead_code)] -#![allow(unused_variables)] -#![allow(unused_assignments)] - -enum E { A, B, C } - -pub fn main() { - let e = E::C; -} diff --git a/src/test/codegen/enum-debug-niche-2.rs b/src/test/codegen/enum-debug-niche-2.rs deleted file mode 100644 index 9c72ad9d2..000000000 --- a/src/test/codegen/enum-debug-niche-2.rs +++ /dev/null @@ -1,50 +0,0 @@ -// This tests that optimized enum debug info accurately reflects the enum layout. -// This is ignored for the fallback mode on MSVC due to problems with PDB. - -// -// ignore-msvc - -// compile-flags: -g -C no-prepopulate-passes - -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_variant_part,{{.*}}size: 32,{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "Placeholder",{{.*}}extraData: i64 4294967295{{[,)].*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "Error",{{.*}}extraData: i64 0{{[,)].*}} - -#![feature(never_type)] - -#[derive(Copy, Clone)] -pub struct Entity { - private: std::num::NonZeroU32, -} - -#[derive(Copy, Clone, PartialEq, Eq)] -pub struct Declaration; - -impl TypeFamily for Declaration { - type Base = Base; - type Placeholder = !; - - fn intern_base_data(_: BaseKind<Self>) {} -} - -#[derive(Copy, Clone)] -pub struct Base; - -pub trait TypeFamily: Copy + 'static { - type Base: Copy; - type Placeholder: Copy; - - fn intern_base_data(_: BaseKind<Self>); -} - -#[derive(Copy, Clone)] -pub enum BaseKind<F: TypeFamily> { - Named(Entity), - Placeholder(F::Placeholder), - Error, -} - -pub fn main() { - let x = BaseKind::Error::<Declaration>; - let y = 7; -} diff --git a/src/test/codegen/enum-debug-niche.rs b/src/test/codegen/enum-debug-niche.rs deleted file mode 100644 index b718a6854..000000000 --- a/src/test/codegen/enum-debug-niche.rs +++ /dev/null @@ -1,29 +0,0 @@ -// This tests that optimized enum debug info accurately reflects the enum layout. -// This is ignored for the fallback mode on MSVC due to problems with PDB. - -// ignore-msvc - -// compile-flags: -g -C no-prepopulate-passes - -// CHECK-LABEL: @main -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_variant_part,{{.*}}discriminator:{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "A",{{.*}}extraData:{{.*}} -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "A",{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "B",{{.*}}extraData:{{.*}} -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "B",{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "C",{{.*}}extraData:{{.*}} -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "C",{{.*}} -// CHECK-NOT: {{.*}}DIDerivedType{{.*}}name: "D",{{.*}}extraData:{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "D",{{.*}} -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "D",{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}flags: DIFlagArtificial{{.*}} - -#![allow(dead_code)] -#![allow(unused_variables)] -#![allow(unused_assignments)] - -enum E { A, B, C, D(bool) } - -pub fn main() { - let e = E::D(true); -} diff --git a/src/test/codegen/enum-debug-tagged.rs b/src/test/codegen/enum-debug-tagged.rs deleted file mode 100644 index 095c49ac3..000000000 --- a/src/test/codegen/enum-debug-tagged.rs +++ /dev/null @@ -1,27 +0,0 @@ -// This tests that debug info for tagged (ordinary) enums is properly emitted. -// This is ignored for the fallback mode on MSVC due to problems with PDB. - -// ignore-msvc - -// compile-flags: -g -C no-prepopulate-passes - -// CHECK-LABEL: @main -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "E",{{.*}} -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_variant_part,{{.*}}discriminator:{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "A",{{.*}}extraData:{{.*}} -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "A",{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "__0",{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "B",{{.*}}extraData:{{.*}} -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "B",{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}name: "__0",{{.*}} -// CHECK: {{.*}}DIDerivedType{{.*}}tag: DW_TAG_member,{{.*}}flags: DIFlagArtificial{{.*}} - -#![allow(dead_code)] -#![allow(unused_variables)] -#![allow(unused_assignments)] - -enum E { A(u32), B(u32) } - -pub fn main() { - let e = E::A(23); -} diff --git a/src/test/codegen/enum-discriminant-value.rs b/src/test/codegen/enum-discriminant-value.rs deleted file mode 100644 index cc14c2120..000000000 --- a/src/test/codegen/enum-discriminant-value.rs +++ /dev/null @@ -1,27 +0,0 @@ -// Verify that DIEnumerator uses isUnsigned flag when appropriate. -// -// compile-flags: -g -C no-prepopulate-passes - -#[repr(i64)] -pub enum I64 { - I64Min = i64::MIN, - I64Max = i64::MAX, -} - -#[repr(u64)] -pub enum U64 { - U64Min = u64::MIN, - U64Max = u64::MAX, -} - -fn main() { - let _a = I64::I64Min; - let _b = I64::I64Max; - let _c = U64::U64Min; - let _d = U64::U64Max; -} - -// CHECK: !DIEnumerator(name: "I64Min", value: -9223372036854775808) -// CHECK: !DIEnumerator(name: "I64Max", value: 9223372036854775807) -// CHECK: !DIEnumerator(name: "U64Min", value: 0, isUnsigned: true) -// CHECK: !DIEnumerator(name: "U64Max", value: 18446744073709551615, isUnsigned: true) diff --git a/src/test/codegen/enum-match.rs b/src/test/codegen/enum-match.rs deleted file mode 100644 index 44f1b408d..000000000 --- a/src/test/codegen/enum-match.rs +++ /dev/null @@ -1,109 +0,0 @@ -// compile-flags: -Copt-level=1 -// only-x86_64 - -#![crate_type = "lib"] - -// Check each of the 3 cases for `codegen_get_discr`. - -// Case 0: One tagged variant. -pub enum Enum0 { - A(bool), - B, -} - -// CHECK: define i8 @match0{{.*}} -// CHECK-NEXT: start: -// CHECK-NEXT: %1 = icmp eq i8 %0, 2 -// CHECK-NEXT: %2 = and i8 %0, 1 -// CHECK-NEXT: %.0 = select i1 %1, i8 13, i8 %2 -#[no_mangle] -pub fn match0(e: Enum0) -> u8 { - use Enum0::*; - match e { - A(b) => b as u8, - B => 13, - } -} - -// Case 1: Niche values are on a boundary for `range`. -pub enum Enum1 { - A(bool), - B, - C, -} - -// CHECK: define i8 @match1{{.*}} -// CHECK-NEXT: start: -// CHECK-NEXT: %1 = {{.*}}call i8 @llvm.usub.sat.i8(i8 %0, i8 1) -// CHECK-NEXT: switch i8 %1, label {{.*}} [ -#[no_mangle] -pub fn match1(e: Enum1) -> u8 { - use Enum1::*; - match e { - A(b) => b as u8, - B => 13, - C => 100, - } -} - -// Case 2: Special cases don't apply. -pub enum X { - _2=2, _3, _4, _5, _6, _7, _8, _9, _10, _11, - _12, _13, _14, _15, _16, _17, _18, _19, _20, - _21, _22, _23, _24, _25, _26, _27, _28, _29, - _30, _31, _32, _33, _34, _35, _36, _37, _38, - _39, _40, _41, _42, _43, _44, _45, _46, _47, - _48, _49, _50, _51, _52, _53, _54, _55, _56, - _57, _58, _59, _60, _61, _62, _63, _64, _65, - _66, _67, _68, _69, _70, _71, _72, _73, _74, - _75, _76, _77, _78, _79, _80, _81, _82, _83, - _84, _85, _86, _87, _88, _89, _90, _91, _92, - _93, _94, _95, _96, _97, _98, _99, _100, _101, - _102, _103, _104, _105, _106, _107, _108, _109, - _110, _111, _112, _113, _114, _115, _116, _117, - _118, _119, _120, _121, _122, _123, _124, _125, - _126, _127, _128, _129, _130, _131, _132, _133, - _134, _135, _136, _137, _138, _139, _140, _141, - _142, _143, _144, _145, _146, _147, _148, _149, - _150, _151, _152, _153, _154, _155, _156, _157, - _158, _159, _160, _161, _162, _163, _164, _165, - _166, _167, _168, _169, _170, _171, _172, _173, - _174, _175, _176, _177, _178, _179, _180, _181, - _182, _183, _184, _185, _186, _187, _188, _189, - _190, _191, _192, _193, _194, _195, _196, _197, - _198, _199, _200, _201, _202, _203, _204, _205, - _206, _207, _208, _209, _210, _211, _212, _213, - _214, _215, _216, _217, _218, _219, _220, _221, - _222, _223, _224, _225, _226, _227, _228, _229, - _230, _231, _232, _233, _234, _235, _236, _237, - _238, _239, _240, _241, _242, _243, _244, _245, - _246, _247, _248, _249, _250, _251, _252, _253, -} - -pub enum Enum2 { - A(X), - B, - C, - D, - E, -} - -// CHECK: define i8 @match2{{.*}} -// CHECK-NEXT: start: -// CHECK-NEXT: %1 = add i8 %0, 2 -// CHECK-NEXT: %2 = zext i8 %1 to i64 -// CHECK-NEXT: %3 = icmp ult i8 %1, 4 -// CHECK-NEXT: %4 = add nuw nsw i64 %2, 1 -// CHECK-NEXT: %_2 = select i1 %3, i64 %4, i64 0 -// CHECK-NEXT: switch i64 %_2, label {{.*}} [ -#[no_mangle] -pub fn match2(e: Enum2) -> u8 { - use Enum2::*; - match e { - A(b) => b as u8, - B => 13, - C => 100, - D => 200, - E => 250, - } -} diff --git a/src/test/codegen/export-no-mangle.rs b/src/test/codegen/export-no-mangle.rs deleted file mode 100644 index a89d48ee1..000000000 --- a/src/test/codegen/export-no-mangle.rs +++ /dev/null @@ -1,31 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -mod private { - // CHECK: @FOO = - #[no_mangle] - pub static FOO: u32 = 3; - - // CHECK: @BAR = - #[export_name = "BAR"] - static BAR: u32 = 3; - - // CHECK: void @a() - #[no_mangle] - pub extern "C" fn a() {} - - // CHECK: void @b() - #[export_name = "b"] - extern "C" fn b() {} - - // CHECK: void @c() - #[export_name = "c"] - #[inline] - extern "C" fn c() {} - - // CHECK: void @d() - #[export_name = "d"] - #[inline(always)] - extern "C" fn d() {} -} diff --git a/src/test/codegen/external-no-mangle-fns.rs b/src/test/codegen/external-no-mangle-fns.rs deleted file mode 100644 index 70349b2ec..000000000 --- a/src/test/codegen/external-no-mangle-fns.rs +++ /dev/null @@ -1,75 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// `#[no_mangle]`d functions always have external linkage, i.e., no `internal` in their `define`s - -#![crate_type = "lib"] -#![no_std] - -// CHECK: define{{( dso_local)?}} void @a() -#[no_mangle] -fn a() {} - -// CHECK: define{{( dso_local)?}} void @b() -#[no_mangle] -pub fn b() {} - -mod private { - // CHECK: define{{( dso_local)?}} void @c() - #[no_mangle] - fn c() {} - - // CHECK: define{{( dso_local)?}} void @d() - #[no_mangle] - pub fn d() {} -} - -const HIDDEN: () = { - // CHECK: define{{( dso_local)?}} void @e() - #[no_mangle] - fn e() {} - - // CHECK: define{{( dso_local)?}} void @f() - #[no_mangle] - pub fn f() {} -}; - -// The surrounding item should not accidentally become external -// CHECK-LABEL: ; external_no_mangle_fns::x -// CHECK-NEXT: ; Function Attrs: -// CHECK-NEXT: define internal -#[inline(never)] -fn x() { - // CHECK: define{{( dso_local)?}} void @g() - #[no_mangle] - fn g() { - x(); - } - - // CHECK: define{{( dso_local)?}} void @h() - #[no_mangle] - pub fn h() {} - - // side effect to keep `x` around - unsafe { - core::ptr::read_volatile(&42); - } -} - -// CHECK: define{{( dso_local)?}} void @i() -#[no_mangle] -#[inline] -fn i() {} - -// CHECK: define{{( dso_local)?}} void @j() -#[no_mangle] -#[inline] -pub fn j() {} - -// CHECK: define{{( dso_local)?}} void @k() -#[no_mangle] -#[inline(always)] -fn k() {} - -// CHECK: define{{( dso_local)?}} void @l() -#[no_mangle] -#[inline(always)] -pub fn l() {} diff --git a/src/test/codegen/external-no-mangle-statics.rs b/src/test/codegen/external-no-mangle-statics.rs deleted file mode 100644 index c6ecb7aa9..000000000 --- a/src/test/codegen/external-no-mangle-statics.rs +++ /dev/null @@ -1,77 +0,0 @@ -// revisions: lib staticlib -// ignore-emscripten default visibility is hidden -// compile-flags: -O -// [lib] compile-flags: --crate-type lib -// [staticlib] compile-flags: --crate-type staticlib -// `#[no_mangle]`d static variables always have external linkage, i.e., no `internal` in their -// definitions - -// CHECK: @A = local_unnamed_addr constant -#[no_mangle] -static A: u8 = 0; - -// CHECK: @B = local_unnamed_addr global -#[no_mangle] -static mut B: u8 = 0; - -// CHECK: @C = local_unnamed_addr constant -#[no_mangle] -pub static C: u8 = 0; - -// CHECK: @D = local_unnamed_addr global -#[no_mangle] -pub static mut D: u8 = 0; - -mod private { - // CHECK: @E = local_unnamed_addr constant - #[no_mangle] - static E: u8 = 0; - - // CHECK: @F = local_unnamed_addr global - #[no_mangle] - static mut F: u8 = 0; - - // CHECK: @G = local_unnamed_addr constant - #[no_mangle] - pub static G: u8 = 0; - - // CHECK: @H = local_unnamed_addr global - #[no_mangle] - pub static mut H: u8 = 0; -} - -const HIDDEN: () = { - // CHECK: @I = local_unnamed_addr constant - #[no_mangle] - static I: u8 = 0; - - // CHECK: @J = local_unnamed_addr global - #[no_mangle] - static mut J: u8 = 0; - - // CHECK: @K = local_unnamed_addr constant - #[no_mangle] - pub static K: u8 = 0; - - // CHECK: @L = local_unnamed_addr global - #[no_mangle] - pub static mut L: u8 = 0; -}; - -fn x() { - // CHECK: @M = local_unnamed_addr constant - #[no_mangle] - static M: fn() = x; - - // CHECK: @N = local_unnamed_addr global - #[no_mangle] - static mut N: u8 = 0; - - // CHECK: @O = local_unnamed_addr constant - #[no_mangle] - pub static O: u8 = 0; - - // CHECK: @P = local_unnamed_addr global - #[no_mangle] - pub static mut P: u8 = 0; -} diff --git a/src/test/codegen/fastcall-inreg.rs b/src/test/codegen/fastcall-inreg.rs deleted file mode 100644 index d426ade28..000000000 --- a/src/test/codegen/fastcall-inreg.rs +++ /dev/null @@ -1,41 +0,0 @@ -// Checks if the "fastcall" calling convention marks function arguments -// as "inreg" like the C/C++ compilers for the platforms. -// x86 only. - -// compile-flags: --target i686-unknown-linux-gnu -O -C no-prepopulate-passes -// needs-llvm-components: x86 - -#![crate_type = "lib"] -#![no_core] -#![feature(no_core, lang_items)] - -#[lang = "sized"] -trait Sized {} -#[lang = "copy"] -trait Copy {} - -pub mod tests { - // CHECK: @f1(i32 inreg %_1, i32 inreg %_2, i32 %_3) - #[no_mangle] - pub extern "fastcall" fn f1(_: i32, _: i32, _: i32) {} - - // CHECK: @f2({{i32\*|ptr}} inreg %_1, {{i32\*|ptr}} inreg %_2, {{i32\*|ptr}} %_3) - #[no_mangle] - pub extern "fastcall" fn f2(_: *const i32, _: *const i32, _: *const i32) {} - - // CHECK: @f3(float %_1, i32 inreg %_2, i32 inreg %_3, i32 %_4) - #[no_mangle] - pub extern "fastcall" fn f3(_: f32, _: i32, _: i32, _: i32) {} - - // CHECK: @f4(i32 inreg %_1, float %_2, i32 inreg %_3, i32 %_4) - #[no_mangle] - pub extern "fastcall" fn f4(_: i32, _: f32, _: i32, _: i32) {} - - // CHECK: @f5(i64 %_1, i32 %_2) - #[no_mangle] - pub extern "fastcall" fn f5(_: i64, _: i32) {} - - // CHECK: @f6(i1 inreg noundef zeroext %_1, i32 inreg %_2, i32 %_3) - #[no_mangle] - pub extern "fastcall" fn f6(_: bool, _: i32, _: i32) {} -} diff --git a/src/test/codegen/fatptr.rs b/src/test/codegen/fatptr.rs deleted file mode 100644 index 1c49b5714..000000000 --- a/src/test/codegen/fatptr.rs +++ /dev/null @@ -1,12 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -pub trait T {} - -// CHECK-LABEL: @copy_fat_ptr -#[no_mangle] -pub fn copy_fat_ptr(x: &T) { -// CHECK-NOT: extractvalue - let x2 = x; -} diff --git a/src/test/codegen/fewer-names.rs b/src/test/codegen/fewer-names.rs deleted file mode 100644 index 7307e0379..000000000 --- a/src/test/codegen/fewer-names.rs +++ /dev/null @@ -1,20 +0,0 @@ -// no-system-llvm -// compile-flags: -Coverflow-checks=no -O -// revisions: YES NO -// [YES]compile-flags: -Zfewer-names=yes -// [NO] compile-flags: -Zfewer-names=no -#![crate_type = "lib"] - -#[no_mangle] -pub fn sum(x: u32, y: u32) -> u32 { -// YES-LABEL: define{{.*}}i32 @sum(i32 %0, i32 %1) -// YES-NEXT: %3 = add i32 %1, %0 -// YES-NEXT: ret i32 %3 - -// NO-LABEL: define{{.*}}i32 @sum(i32 %x, i32 %y) -// NO-NEXT: start: -// NO-NEXT: %z = add i32 %y, %x -// NO-NEXT: ret i32 %z - let z = x + y; - z -} diff --git a/src/test/codegen/ffi-const.rs b/src/test/codegen/ffi-const.rs deleted file mode 100644 index 937205034..000000000 --- a/src/test/codegen/ffi-const.rs +++ /dev/null @@ -1,13 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -#![crate_type = "lib"] -#![feature(ffi_const)] - -pub fn bar() { unsafe { foo() } } - -extern "C" { - // CHECK-LABEL: declare{{.*}}void @foo() - // CHECK-SAME: [[ATTRS:#[0-9]+]] - // The attribute changed from `readnone` to `memory(none)` with LLVM 16.0. - // CHECK-DAG: attributes [[ATTRS]] = { {{.*}}{{readnone|memory\(none\)}}{{.*}} } - #[ffi_const] pub fn foo(); -} diff --git a/src/test/codegen/ffi-out-of-bounds-loads.rs b/src/test/codegen/ffi-out-of-bounds-loads.rs deleted file mode 100644 index 099726b2f..000000000 --- a/src/test/codegen/ffi-out-of-bounds-loads.rs +++ /dev/null @@ -1,25 +0,0 @@ -// Regression test for #29988 - -// compile-flags: -C no-prepopulate-passes -// only-x86_64 -// ignore-windows - -#[repr(C)] -struct S { - f1: i32, - f2: i32, - f3: i32, -} - -extern "C" { - fn foo(s: S); -} - -fn main() { - let s = S { f1: 1, f2: 2, f3: 3 }; - unsafe { - // CHECK: load { i64, i32 }, {{.*}}, align 4 - // CHECK: call void @foo({ i64, i32 } {{.*}}) - foo(s); - } -} diff --git a/src/test/codegen/ffi-pure.rs b/src/test/codegen/ffi-pure.rs deleted file mode 100644 index 2ed735813..000000000 --- a/src/test/codegen/ffi-pure.rs +++ /dev/null @@ -1,13 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -#![crate_type = "lib"] -#![feature(ffi_pure)] - -pub fn bar() { unsafe { foo() } } - -extern "C" { - // CHECK-LABEL: declare{{.*}}void @foo() - // CHECK-SAME: [[ATTRS:#[0-9]+]] - // The attribute changed from `readonly` to `memory(read)` with LLVM 16.0. - // CHECK-DAG: attributes [[ATTRS]] = { {{.*}}{{readonly|memory\(read\)}}{{.*}} } - #[ffi_pure] pub fn foo(); -} diff --git a/src/test/codegen/ffi-returns-twice.rs b/src/test/codegen/ffi-returns-twice.rs deleted file mode 100644 index 0fbe03f0b..000000000 --- a/src/test/codegen/ffi-returns-twice.rs +++ /dev/null @@ -1,11 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -#![crate_type = "lib"] -#![feature(ffi_returns_twice)] - -pub fn bar() { unsafe { foo() } } - -extern "C" { - // CHECK: declare{{( dso_local)?}} void @foo(){{.*}}[[ATTRS:#[0-9]+]] - // CHECK: attributes [[ATTRS]] = { {{.*}}returns_twice{{.*}} } - #[ffi_returns_twice] pub fn foo(); -} diff --git a/src/test/codegen/float_math.rs b/src/test/codegen/float_math.rs deleted file mode 100644 index 592e09452..000000000 --- a/src/test/codegen/float_math.rs +++ /dev/null @@ -1,50 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics::{fadd_fast, fsub_fast, fmul_fast, fdiv_fast, frem_fast}; - -// CHECK-LABEL: @add -#[no_mangle] -pub fn add(x: f32, y: f32) -> f32 { -// CHECK: fadd float -// CHECK-NOT: fast - x + y -} - -// CHECK-LABEL: @addition -#[no_mangle] -pub fn addition(x: f32, y: f32) -> f32 { -// CHECK: fadd fast float - unsafe { - fadd_fast(x, y) - } -} - -// CHECK-LABEL: @subtraction -#[no_mangle] -pub fn subtraction(x: f32, y: f32) -> f32 { -// CHECK: fsub fast float - unsafe { - fsub_fast(x, y) - } -} - -// CHECK-LABEL: @multiplication -#[no_mangle] -pub fn multiplication(x: f32, y: f32) -> f32 { -// CHECK: fmul fast float - unsafe { - fmul_fast(x, y) - } -} - -// CHECK-LABEL: @division -#[no_mangle] -pub fn division(x: f32, y: f32) -> f32 { -// CHECK: fdiv fast float - unsafe { - fdiv_fast(x, y) - } -} diff --git a/src/test/codegen/fn-impl-trait-self.rs b/src/test/codegen/fn-impl-trait-self.rs deleted file mode 100644 index 0abc8a409..000000000 --- a/src/test/codegen/fn-impl-trait-self.rs +++ /dev/null @@ -1,16 +0,0 @@ -// compile-flags: -g -// -// CHECK-LABEL: @main -// MSVC: {{.*}}DIDerivedType(tag: DW_TAG_pointer_type, name: "recursive_type$ (*)()",{{.*}} -// NONMSVC: {{.*}}DIDerivedType(tag: DW_TAG_pointer_type, name: "fn() -> <recursive_type>",{{.*}} -// -// CHECK: {{.*}}DISubroutineType{{.*}} -// CHECK: {{.*}}DIBasicType(name: "<recur_type>", size: {{32|64}}, encoding: DW_ATE_unsigned) - -pub fn foo() -> impl Copy { - foo -} - -fn main() { - let my_res = foo(); -} diff --git a/src/test/codegen/foo.s b/src/test/codegen/foo.s deleted file mode 100644 index 304d82aa0..000000000 --- a/src/test/codegen/foo.s +++ /dev/null @@ -1,3 +0,0 @@ -.global foo -foo: - jmp baz diff --git a/src/test/codegen/force-frame-pointers.rs b/src/test/codegen/force-frame-pointers.rs deleted file mode 100644 index 637c42346..000000000 --- a/src/test/codegen/force-frame-pointers.rs +++ /dev/null @@ -1,6 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -C force-frame-pointers=y - -#![crate_type="lib"] - -// CHECK: attributes #{{.*}} "frame-pointer"="all" -pub fn foo() {} diff --git a/src/test/codegen/force-no-unwind-tables.rs b/src/test/codegen/force-no-unwind-tables.rs deleted file mode 100644 index 3ee23f05e..000000000 --- a/src/test/codegen/force-no-unwind-tables.rs +++ /dev/null @@ -1,11 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -C panic=abort -C force-unwind-tables=n -// ignore-windows - -#![crate_type="lib"] - -// CHECK-LABEL: define{{.*}}void @foo -// CHECK-NOT: attributes #{{.*}} uwtable -#[no_mangle] -fn foo() { - panic!(); -} diff --git a/src/test/codegen/force-unwind-tables.rs b/src/test/codegen/force-unwind-tables.rs deleted file mode 100644 index 4c0a5602c..000000000 --- a/src/test/codegen/force-unwind-tables.rs +++ /dev/null @@ -1,6 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -C force-unwind-tables=y - -#![crate_type="lib"] - -// CHECK: attributes #{{.*}} uwtable -pub fn foo() {} diff --git a/src/test/codegen/frame-pointer.rs b/src/test/codegen/frame-pointer.rs deleted file mode 100644 index f7c02d479..000000000 --- a/src/test/codegen/frame-pointer.rs +++ /dev/null @@ -1,35 +0,0 @@ -// compile-flags: --crate-type=rlib -// revisions: aarch64-apple aarch64-linux force x64-apple x64-linux -// [aarch64-apple] needs-llvm-components: aarch64 -// [aarch64-apple] compile-flags: --target=aarch64-apple-darwin -// [aarch64-linux] needs-llvm-components: aarch64 -// [aarch64-linux] compile-flags: --target=aarch64-unknown-linux-gnu -// [force] needs-llvm-components: x86 -// [force] compile-flags: --target=x86_64-unknown-linux-gnu -Cforce-frame-pointers=yes -// [x64-apple] needs-llvm-components: x86 -// [x64-apple] compile-flags: --target=x86_64-apple-darwin -// [x64-linux] needs-llvm-components: x86 -// [x64-linux] compile-flags: --target=x86_64-unknown-linux-gnu - -#![feature(no_core, lang_items)] -#![no_core] -#[lang="sized"] -trait Sized { } -#[lang="copy"] -trait Copy { } -impl Copy for u32 {} - - -// CHECK: define i32 @peach{{.*}}[[PEACH_ATTRS:\#[0-9]+]] { -#[no_mangle] -pub fn peach(x: u32) -> u32 { - x -} - -// CHECK: attributes [[PEACH_ATTRS]] = { -// x64-linux-NOT: {{.*}}"frame-pointer"{{.*}} -// aarch64-linux-NOT: {{.*}}"frame-pointer"{{.*}} -// x64-apple-SAME: {{.*}}"frame-pointer"="all" -// force-SAME: {{.*}}"frame-pointer"="all" -// aarch64-apple-SAME: {{.*}}"frame-pointer"="non-leaf" -// CHECK-SAME: } diff --git a/src/test/codegen/function-arguments-noopt.rs b/src/test/codegen/function-arguments-noopt.rs deleted file mode 100644 index ff76405a4..000000000 --- a/src/test/codegen/function-arguments-noopt.rs +++ /dev/null @@ -1,63 +0,0 @@ -// compile-flags: -C opt-level=0 -C no-prepopulate-passes - -// This test checks that arguments/returns in opt-level=0 builds, -// while lacking attributes used for optimization, still have ABI-affecting attributes. - -#![crate_type = "lib"] -#![feature(rustc_attrs)] - -pub struct S { - _field: [i32; 8], -} - -// CHECK: zeroext i1 @boolean(i1 zeroext %x) -#[no_mangle] -pub fn boolean(x: bool) -> bool { - x -} - -// CHECK-LABEL: @boolean_call -#[no_mangle] -pub fn boolean_call(x: bool, f: fn(bool) -> bool) -> bool { -// CHECK: call zeroext i1 %f(i1 zeroext %x) - f(x) -} - -// CHECK: align 4 {{i32\*|ptr}} @borrow({{i32\*|ptr}} align 4 %x) -#[no_mangle] -pub fn borrow(x: &i32) -> &i32 { - x -} - -// CHECK-LABEL: @borrow_call -#[no_mangle] -pub fn borrow_call(x: &i32, f: fn(&i32) -> &i32) -> &i32 { - // CHECK: call align 4 {{i32\*|ptr}} %f({{i32\*|ptr}} align 4 %x) - f(x) -} - -// CHECK: void @struct_({{%S\*|ptr}} sret(%S){{( %0)?}}, {{%S\*|ptr}} %x) -#[no_mangle] -pub fn struct_(x: S) -> S { - x -} - -// CHECK-LABEL: @struct_call -#[no_mangle] -pub fn struct_call(x: S, f: fn(S) -> S) -> S { - // CHECK: call void %f({{%S\*|ptr}} sret(%S){{( %0)?}}, {{%S\*|ptr}} %{{.+}}) - f(x) -} - -// CHECK: { i8, i8 } @enum_(i1 zeroext %x.0, i8 %x.1) -#[no_mangle] -pub fn enum_(x: Option<u8>) -> Option<u8> { - x -} - -// CHECK-LABEL: @enum_call -#[no_mangle] -pub fn enum_call(x: Option<u8>, f: fn(Option<u8>) -> Option<u8>) -> Option<u8> { - // CHECK: call { i8, i8 } %f(i1 zeroext %x.0, i8 %x.1) - f(x) -} diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs deleted file mode 100644 index 44fee9523..000000000 --- a/src/test/codegen/function-arguments.rs +++ /dev/null @@ -1,235 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(rustc_attrs)] - -use std::mem::MaybeUninit; -use std::num::NonZeroU64; -use std::marker::PhantomPinned; - -pub struct S { - _field: [i32; 8], -} - -pub struct UnsafeInner { - _field: std::cell::UnsafeCell<i16>, -} - -pub struct NotUnpin { - _field: i32, - _marker: PhantomPinned, -} - -pub enum MyBool { - True, - False, -} - -// CHECK: noundef zeroext i1 @boolean(i1 noundef zeroext %x) -#[no_mangle] -pub fn boolean(x: bool) -> bool { - x -} - -// CHECK: i8 @maybeuninit_boolean(i8 %x) -#[no_mangle] -pub fn maybeuninit_boolean(x: MaybeUninit<bool>) -> MaybeUninit<bool> { - x -} - -// CHECK: noundef zeroext i1 @enum_bool(i1 noundef zeroext %x) -#[no_mangle] -pub fn enum_bool(x: MyBool) -> MyBool { - x -} - -// CHECK: i8 @maybeuninit_enum_bool(i8 %x) -#[no_mangle] -pub fn maybeuninit_enum_bool(x: MaybeUninit<MyBool>) -> MaybeUninit<MyBool> { - x -} - -// CHECK: noundef i32 @char(i32 noundef %x) -#[no_mangle] -pub fn char(x: char) -> char { - x -} - -// CHECK: i32 @maybeuninit_char(i32 %x) -#[no_mangle] -pub fn maybeuninit_char(x: MaybeUninit<char>) -> MaybeUninit<char> { - x -} - -// CHECK: i64 @int(i64 %x) -#[no_mangle] -pub fn int(x: u64) -> u64 { - x -} - -// CHECK: noundef i64 @nonzero_int(i64 noundef %x) -#[no_mangle] -pub fn nonzero_int(x: NonZeroU64) -> NonZeroU64 { - x -} - -// CHECK: i64 @option_nonzero_int(i64 %x) -#[no_mangle] -pub fn option_nonzero_int(x: Option<NonZeroU64>) -> Option<NonZeroU64> { - x -} - -// CHECK: @readonly_borrow({{i32\*|ptr}} noalias noundef readonly align 4 dereferenceable(4) %_1) -// FIXME #25759 This should also have `nocapture` -#[no_mangle] -pub fn readonly_borrow(_: &i32) { -} - -// CHECK: @static_borrow({{i32\*|ptr}} noalias noundef readonly align 4 dereferenceable(4) %_1) -// static borrow may be captured -#[no_mangle] -pub fn static_borrow(_: &'static i32) { -} - -// CHECK: @named_borrow({{i32\*|ptr}} noalias noundef readonly align 4 dereferenceable(4) %_1) -// borrow with named lifetime may be captured -#[no_mangle] -pub fn named_borrow<'r>(_: &'r i32) { -} - -// CHECK: @unsafe_borrow({{i16\*|ptr}} noundef nonnull align 2 %_1) -// unsafe interior means this isn't actually readonly and there may be aliases ... -#[no_mangle] -pub fn unsafe_borrow(_: &UnsafeInner) { -} - -// CHECK: @mutable_unsafe_borrow({{i16\*|ptr}} noalias noundef align 2 dereferenceable(2) %_1) -// ... unless this is a mutable borrow, those never alias -#[no_mangle] -pub fn mutable_unsafe_borrow(_: &mut UnsafeInner) { -} - -// CHECK: @mutable_borrow({{i32\*|ptr}} noalias noundef align 4 dereferenceable(4) %_1) -// FIXME #25759 This should also have `nocapture` -#[no_mangle] -pub fn mutable_borrow(_: &mut i32) { -} - -#[no_mangle] -// CHECK: @mutable_notunpin_borrow({{i32\*|ptr}} noundef align 4 dereferenceable(4) %_1) -// This one is *not* `noalias` because it might be self-referential. -pub fn mutable_notunpin_borrow(_: &mut NotUnpin) { -} - -// CHECK: @notunpin_borrow({{i32\*|ptr}} noalias noundef readonly align 4 dereferenceable(4) %_1) -// But `&NotUnpin` behaves perfectly normal. -#[no_mangle] -pub fn notunpin_borrow(_: &NotUnpin) { -} - -// CHECK: @indirect_struct({{%S\*|ptr}} noalias nocapture noundef readonly dereferenceable(32) %_1) -#[no_mangle] -pub fn indirect_struct(_: S) { -} - -// CHECK: @borrowed_struct({{%S\*|ptr}} noalias noundef readonly align 4 dereferenceable(32) %_1) -// FIXME #25759 This should also have `nocapture` -#[no_mangle] -pub fn borrowed_struct(_: &S) { -} - -// CHECK: @raw_struct({{%S\*|ptr}} %_1) -#[no_mangle] -pub fn raw_struct(_: *const S) { -} - -// `Box` can get deallocated during execution of the function, so it should -// not get `dereferenceable`. -// CHECK: noalias noundef nonnull align 4 {{i32\*|ptr}} @_box({{i32\*|ptr}} noalias noundef nonnull align 4 %x) -#[no_mangle] -pub fn _box(x: Box<i32>) -> Box<i32> { - x -} - -// CHECK: @struct_return({{%S\*|ptr}} noalias nocapture noundef sret(%S) dereferenceable(32){{( %0)?}}) -#[no_mangle] -pub fn struct_return() -> S { - S { - _field: [0, 0, 0, 0, 0, 0, 0, 0] - } -} - -// Hack to get the correct size for the length part in slices -// CHECK: @helper([[USIZE:i[0-9]+]] %_1) -#[no_mangle] -pub fn helper(_: usize) { -} - -// CHECK: @slice({{\[0 x i8\]\*|ptr}} noalias noundef nonnull readonly align 1 %_1.0, [[USIZE]] %_1.1) -// FIXME #25759 This should also have `nocapture` -#[no_mangle] -pub fn slice(_: &[u8]) { -} - -// CHECK: @mutable_slice({{\[0 x i8\]\*|ptr}} noalias noundef nonnull align 1 %_1.0, [[USIZE]] %_1.1) -// FIXME #25759 This should also have `nocapture` -#[no_mangle] -pub fn mutable_slice(_: &mut [u8]) { -} - -// CHECK: @unsafe_slice({{\[0 x i16\]\*|ptr}} noundef nonnull align 2 %_1.0, [[USIZE]] %_1.1) -// unsafe interior means this isn't actually readonly and there may be aliases ... -#[no_mangle] -pub fn unsafe_slice(_: &[UnsafeInner]) { -} - -// CHECK: @raw_slice({{\[0 x i8\]\*|ptr}} %_1.0, [[USIZE]] %_1.1) -#[no_mangle] -pub fn raw_slice(_: *const [u8]) { -} - -// CHECK: @str({{\[0 x i8\]\*|ptr}} noalias noundef nonnull readonly align 1 %_1.0, [[USIZE]] %_1.1) -// FIXME #25759 This should also have `nocapture` -#[no_mangle] -pub fn str(_: &[u8]) { -} - -// CHECK: @trait_borrow({{\{\}\*|ptr}} noundef nonnull align 1 %_1.0, {{.+}} noalias noundef readonly align {{.*}} dereferenceable({{.*}}) %_1.1) -// FIXME #25759 This should also have `nocapture` -#[no_mangle] -pub fn trait_borrow(_: &Drop) { -} - -// CHECK: @trait_raw({{\{\}\*|ptr}} %_1.0, {{.+}} noalias noundef readonly align {{.*}} dereferenceable({{.*}}) %_1.1) -#[no_mangle] -pub fn trait_raw(_: *const Drop) { -} - -// CHECK: @trait_box({{\{\}\*|ptr}} noalias noundef nonnull align 1{{( %0)?}}, {{.+}} noalias noundef readonly align {{.*}} dereferenceable({{.*}}){{( %1)?}}) -#[no_mangle] -pub fn trait_box(_: Box<Drop>) { -} - -// CHECK: { {{i8\*|ptr}}, {{i8\*|ptr}} } @trait_option({{i8\*|ptr}} noalias noundef align 1 %x.0, {{i8\*|ptr}} %x.1) -#[no_mangle] -pub fn trait_option(x: Option<Box<Drop>>) -> Option<Box<Drop>> { - x -} - -// CHECK: { {{\[0 x i16\]\*|ptr}}, [[USIZE]] } @return_slice({{\[0 x i16\]\*|ptr}} noalias noundef nonnull readonly align 2 %x.0, [[USIZE]] %x.1) -#[no_mangle] -pub fn return_slice(x: &[u16]) -> &[u16] { - x -} - -// CHECK: { i16, i16 } @enum_id_1(i16 noundef %x.0, i16 %x.1) -#[no_mangle] -pub fn enum_id_1(x: Option<Result<u16, u16>>) -> Option<Result<u16, u16>> { - x -} - -// CHECK: { i8, i8 } @enum_id_2(i1 noundef zeroext %x.0, i8 %x.1) -#[no_mangle] -pub fn enum_id_2(x: Option<u8>) -> Option<u8> { - x -} diff --git a/src/test/codegen/gdb_debug_script_load.rs b/src/test/codegen/gdb_debug_script_load.rs deleted file mode 100644 index 002be8d1b..000000000 --- a/src/test/codegen/gdb_debug_script_load.rs +++ /dev/null @@ -1,17 +0,0 @@ -// -// ignore-windows -// ignore-macos -// ignore-wasm -// ignore-emscripten - -// compile-flags: -g -C no-prepopulate-passes - -#![feature(start)] - -// CHECK-LABEL: @main -// CHECK: load volatile i8, {{.+}} @__rustc_debug_gdb_scripts_section__ - -#[start] -fn start(_: isize, _: *const *const u8) -> isize { - return 0; -} diff --git a/src/test/codegen/generator-debug-msvc.rs b/src/test/codegen/generator-debug-msvc.rs deleted file mode 100644 index 9d70ccdef..000000000 --- a/src/test/codegen/generator-debug-msvc.rs +++ /dev/null @@ -1,59 +0,0 @@ -// Verify debuginfo for generators: -// - Each variant points to the file and line of its yield point -// - The discriminants are marked artificial -// - Other fields are not marked artificial -// -// -// compile-flags: -C debuginfo=2 -// only-msvc - -#![feature(generators, generator_trait)] -use std::ops::Generator; - -fn generator_test() -> impl Generator<Yield = i32, Return = ()> { - || { - yield 0; - let s = String::from("foo"); - yield 1; - } -} - -// FIXME: No way to reliably check the filename. - -// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_union_type, name: "enum2$<generator_debug_msvc::generator_test::generator_env$0>" -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant0", scope: [[GEN]], -// For brevity, we only check the struct name and members of the last variant. -// CHECK-SAME: file: [[FILE:![0-9]*]], line: 14, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant1", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 18, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant2", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 18, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant3", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 15, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "variant4", scope: [[GEN]], -// CHECK-SAME: file: [[FILE]], line: 17, -// CHECK-SAME: baseType: [[VARIANT_WRAPPER:![0-9]*]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: [[VARIANT_WRAPPER]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Variant4", scope: [[GEN]], -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "value", scope: [[VARIANT_WRAPPER]], {{.*}}, baseType: [[VARIANT:![0-9]*]], -// CHECK: [[VARIANT]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[VARIANT]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "tag", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial - -fn main() { - let _dummy = generator_test(); -} diff --git a/src/test/codegen/generator-debug.rs b/src/test/codegen/generator-debug.rs deleted file mode 100644 index 3ec860f2c..000000000 --- a/src/test/codegen/generator-debug.rs +++ /dev/null @@ -1,62 +0,0 @@ -// Verify debuginfo for generators: -// - Each variant points to the file and line of its yield point -// - The discriminants are marked artificial -// - Other fields are not marked artificial -// -// -// compile-flags: -C debuginfo=2 --edition=2018 -// ignore-msvc - -#![feature(generators, generator_trait)] -use std::ops::Generator; - -fn generator_test() -> impl Generator<Yield = i32, Return = ()> { - || { - yield 0; - let s = String::from("foo"); - yield 1; - } -} - -// FIXME: No way to reliably check the filename. - -// CHECK-DAG: [[GEN_FN:!.*]] = !DINamespace(name: "generator_test" -// CHECK-DAG: [[GEN:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "{generator_env#0}", scope: [[GEN_FN]] -// CHECK: [[VARIANT:!.*]] = !DICompositeType(tag: DW_TAG_variant_part, scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: discriminator: [[DISC:![0-9]*]] -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "0", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE:![0-9]*]], line: 14, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DICompositeType(tag: DW_TAG_structure_type, name: "Unresumed", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "1", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 18, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "2", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 18, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "3", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 15, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "4", scope: [[VARIANT]], -// CHECK-SAME: file: [[FILE]], line: 17, -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: [[S1:!.*]] = !DICompositeType(tag: DW_TAG_structure_type, name: "Suspend1", scope: [[GEN]], -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: {{!.*}} = !DIDerivedType(tag: DW_TAG_member, name: "s", scope: [[S1]] -// CHECK-NOT: flags: DIFlagArtificial -// CHECK-SAME: ) -// CHECK: [[DISC]] = !DIDerivedType(tag: DW_TAG_member, name: "__state", scope: [[GEN]], -// CHECK-SAME: flags: DIFlagArtificial - -fn main() { - let _dummy = generator_test(); -} diff --git a/src/test/codegen/generic-debug.rs b/src/test/codegen/generic-debug.rs deleted file mode 100644 index eea16805c..000000000 --- a/src/test/codegen/generic-debug.rs +++ /dev/null @@ -1,17 +0,0 @@ -// ignore-windows - -// compile-flags: -g -C no-prepopulate-passes - -// CHECK-LABEL: @main -// CHECK: {{.*}}DICompositeType{{.*}}tag: DW_TAG_structure_type,{{.*}}name: "Generic<i32>",{{.*}} -// CHECK: {{.*}}DITemplateTypeParameter{{.*}}name: "Type",{{.*}} - -#![allow(dead_code)] -#![allow(unused_variables)] -#![allow(unused_assignments)] - -pub struct Generic<Type>(Type); - -fn main () { - let generic = Generic(10); -} diff --git a/src/test/codegen/global_asm.rs b/src/test/codegen/global_asm.rs deleted file mode 100644 index fab84868f..000000000 --- a/src/test/codegen/global_asm.rs +++ /dev/null @@ -1,64 +0,0 @@ -// ignore-aarch64 -// ignore-aarch64_be -// ignore-arm -// ignore-armeb -// ignore-avr -// ignore-bpfel -// ignore-bpfeb -// ignore-hexagon -// ignore-mips -// ignore-mips64 -// ignore-msp430 -// ignore-powerpc64 -// ignore-powerpc64le -// ignore-powerpc -// ignore-r600 -// ignore-amdgcn -// ignore-sparc -// ignore-sparcv9 -// ignore-sparcel -// ignore-s390x -// ignore-tce -// ignore-thumb -// ignore-thumbeb -// ignore-xcore -// ignore-nvptx -// ignore-nvptx64 -// ignore-le32 -// ignore-le64 -// ignore-amdil -// ignore-amdil64 -// ignore-hsail -// ignore-hsail64 -// ignore-spir -// ignore-spir64 -// ignore-kalimba -// ignore-shave -// ignore-wasm32 -// ignore-wasm64 -// ignore-emscripten -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -use std::arch::global_asm; - -// CHECK-LABEL: foo -// CHECK: module asm -// this regex will capture the correct unconditional branch inst. -// CHECK: module asm "{{[[:space:]]+}}jmp baz" -global_asm!( - r#" - .global foo -foo: - jmp baz -"# -); - -extern "C" { - fn foo(); -} - -// CHECK-LABEL: @baz -#[no_mangle] -pub unsafe extern "C" fn baz() {} diff --git a/src/test/codegen/global_asm_include.rs b/src/test/codegen/global_asm_include.rs deleted file mode 100644 index 02ee91645..000000000 --- a/src/test/codegen/global_asm_include.rs +++ /dev/null @@ -1,57 +0,0 @@ -// ignore-aarch64 -// ignore-aarch64_be -// ignore-arm -// ignore-armeb -// ignore-avr -// ignore-bpfel -// ignore-bpfeb -// ignore-hexagon -// ignore-mips -// ignore-mips64 -// ignore-msp430 -// ignore-powerpc64 -// ignore-powerpc64le -// ignore-powerpc -// ignore-r600 -// ignore-amdgcn -// ignore-sparc -// ignore-sparcv9 -// ignore-sparcel -// ignore-s390x -// ignore-tce -// ignore-thumb -// ignore-thumbeb -// ignore-xcore -// ignore-nvptx -// ignore-nvptx64 -// ignore-le32 -// ignore-le64 -// ignore-amdil -// ignore-amdil64 -// ignore-hsail -// ignore-hsail64 -// ignore-spir -// ignore-spir64 -// ignore-kalimba -// ignore-shave -// ignore-wasm32 -// ignore-wasm64 -// ignore-emscripten -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -use std::arch::global_asm; - -// CHECK-LABEL: foo -// CHECK: module asm -// CHECK: module asm "{{[[:space:]]+}}jmp baz" -global_asm!(include_str!("foo.s")); - -extern "C" { - fn foo(); -} - -// CHECK-LABEL: @baz -#[no_mangle] -pub unsafe extern "C" fn baz() {} diff --git a/src/test/codegen/global_asm_x2.rs b/src/test/codegen/global_asm_x2.rs deleted file mode 100644 index bdcf0ea84..000000000 --- a/src/test/codegen/global_asm_x2.rs +++ /dev/null @@ -1,83 +0,0 @@ -// ignore-aarch64 -// ignore-aarch64_be -// ignore-arm -// ignore-armeb -// ignore-avr -// ignore-bpfel -// ignore-bpfeb -// ignore-hexagon -// ignore-mips -// ignore-mips64 -// ignore-msp430 -// ignore-powerpc64 -// ignore-powerpc64le -// ignore-powerpc -// ignore-r600 -// ignore-amdgcn -// ignore-sparc -// ignore-sparcv9 -// ignore-sparcel -// ignore-s390x -// ignore-tce -// ignore-thumb -// ignore-thumbeb -// ignore-xcore -// ignore-nvptx -// ignore-nvptx64 -// ignore-le32 -// ignore-le64 -// ignore-amdil -// ignore-amdil64 -// ignore-hsail -// ignore-hsail64 -// ignore-spir -// ignore-spir64 -// ignore-kalimba -// ignore-shave -// ignore-wasm32 -// ignore-wasm64 -// ignore-emscripten -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![no_std] - -use core::arch::global_asm; - -// CHECK-LABEL: foo -// CHECK: module asm -// CHECK: module asm "{{[[:space:]]+}}jmp baz" -// any other global_asm will be appended to this first block, so: -// CHECK-LABEL: bar -// CHECK: module asm "{{[[:space:]]+}}jmp quux" -global_asm!( - r#" - .global foo -foo: - jmp baz -"# -); - -extern "C" { - fn foo(); -} - -// CHECK-LABEL: @baz -#[no_mangle] -pub unsafe extern "C" fn baz() {} - -// no checks here; this has been appended to the first occurrence -global_asm!( - r#" - .global bar -bar: - jmp quux -"# -); - -extern "C" { - fn bar(); -} - -#[no_mangle] -pub unsafe extern "C" fn quux() {} diff --git a/src/test/codegen/i686-macosx-deployment-target.rs b/src/test/codegen/i686-macosx-deployment-target.rs deleted file mode 100644 index 17258a264..000000000 --- a/src/test/codegen/i686-macosx-deployment-target.rs +++ /dev/null @@ -1,27 +0,0 @@ -// -// Checks that we correctly modify the target when MACOSX_DEPLOYMENT_TARGET is set. -// See issue #60235. - -// compile-flags: -O --target=i686-apple-darwin --crate-type=rlib -// needs-llvm-components: x86 -// rustc-env:MACOSX_DEPLOYMENT_TARGET=10.9 -#![feature(no_core, lang_items)] -#![no_core] - -#[lang="sized"] -trait Sized { } -#[lang="freeze"] -trait Freeze { } -#[lang="copy"] -trait Copy { } - -#[repr(C)] -pub struct Bool { - b: bool, -} - -// CHECK: target triple = "i686-apple-macosx10.9.0" -#[no_mangle] -pub extern "C" fn structbool() -> Bool { - Bool { b: true } -} diff --git a/src/test/codegen/i686-no-macosx-deployment-target.rs b/src/test/codegen/i686-no-macosx-deployment-target.rs deleted file mode 100644 index 043040a95..000000000 --- a/src/test/codegen/i686-no-macosx-deployment-target.rs +++ /dev/null @@ -1,27 +0,0 @@ -// -// Checks that we leave the target alone MACOSX_DEPLOYMENT_TARGET is unset. -// See issue #60235. - -// compile-flags: -O --target=i686-apple-darwin --crate-type=rlib -// needs-llvm-components: x86 -// unset-rustc-env:MACOSX_DEPLOYMENT_TARGET -#![feature(no_core, lang_items)] -#![no_core] - -#[lang="sized"] -trait Sized { } -#[lang="freeze"] -trait Freeze { } -#[lang="copy"] -trait Copy { } - -#[repr(C)] -pub struct Bool { - b: bool, -} - -// CHECK: target triple = "i686-apple-macosx10.7.0" -#[no_mangle] -pub extern "C" fn structbool() -> Bool { - Bool { b: true } -} diff --git a/src/test/codegen/inline-always-works-always.rs b/src/test/codegen/inline-always-works-always.rs deleted file mode 100644 index 912af782a..000000000 --- a/src/test/codegen/inline-always-works-always.rs +++ /dev/null @@ -1,21 +0,0 @@ -// revisions: NO-OPT SIZE-OPT SPEED-OPT -//[NO-OPT] compile-flags: -Copt-level=0 -//[SIZE-OPT] compile-flags: -Copt-level=s -//[SPEED-OPT] compile-flags: -Copt-level=3 - -#![crate_type="rlib"] - -#[no_mangle] -#[inline(always)] -pub extern "C" fn callee() -> u32 { - 4 + 4 -} - -// CHECK-LABEL: caller -// SIZE-OPT: ret i32 8 -// SPEED-OPT: ret i32 8 -// NO-OPT: ret i32 8 -#[no_mangle] -pub extern "C" fn caller() -> u32 { - callee() -} diff --git a/src/test/codegen/inline-debuginfo.rs b/src/test/codegen/inline-debuginfo.rs deleted file mode 100644 index 5b230361f..000000000 --- a/src/test/codegen/inline-debuginfo.rs +++ /dev/null @@ -1,17 +0,0 @@ -#![crate_type="rlib"] -// compile-flags: -Copt-level=3 -g -// - -#[no_mangle] -#[inline(always)] -pub extern "C" fn callee(x: u32) -> u32 { - x + 4 -} - -// CHECK-LABEL: caller -// CHECK: call void @llvm.dbg.value(metadata i32 %y, metadata !{{.*}}, metadata !DIExpression(DW_OP_constu, 3, DW_OP_minus, DW_OP_stack_value)), !dbg [[A:!.*]] -// CHECK: [[A]] = !DILocation(line: {{.*}}, scope: {{.*}}, inlinedAt: {{.*}}) -#[no_mangle] -pub extern "C" fn caller(y: u32) -> u32 { - callee(y - 3) -} diff --git a/src/test/codegen/inline-hint.rs b/src/test/codegen/inline-hint.rs deleted file mode 100644 index d3ea1915a..000000000 --- a/src/test/codegen/inline-hint.rs +++ /dev/null @@ -1,31 +0,0 @@ -// Checks that closures, constructors, and shims except -// for a drop glue receive inline hint by default. -// -// compile-flags: -Cno-prepopulate-passes -Csymbol-mangling-version=v0 -#![crate_type = "lib"] - -pub fn f() { - let a = A; - let b = (0i32, 1i32, 2i32, 3 as *const i32); - let c = || {}; - - a(String::new(), String::new()); - b.clone(); - c(); -} - -struct A(String, String); - -// CHECK: ; core::ptr::drop_in_place::<inline_hint::A> -// CHECK-NEXT: ; Function Attrs: -// CHECK-NOT: inlinehint -// CHECK-SAME: {{$}} - -// CHECK: ; <(i32, i32, i32, *const i{{16|32|64}}) as core::clone::Clone>::clone -// CHECK-NEXT: ; Function Attrs: inlinehint - -// CHECK: ; inline_hint::f::{closure#0} -// CHECK-NEXT: ; Function Attrs: inlinehint - -// CHECK: ; inline_hint::A -// CHECK-NEXT: ; Function Attrs: inlinehint diff --git a/src/test/codegen/instrument-coverage.rs b/src/test/codegen/instrument-coverage.rs deleted file mode 100644 index 78f8875a2..000000000 --- a/src/test/codegen/instrument-coverage.rs +++ /dev/null @@ -1,17 +0,0 @@ -// Test that `-Cinstrument-coverage` creates expected __llvm_profile_filename symbol in LLVM IR. - -// needs-profiler-support -// compile-flags: -Cinstrument-coverage - -// CHECK: @__llvm_profile_filename = {{.*}}"default_%m_%p.profraw\00"{{.*}} - -#![crate_type="lib"] - -#[inline(never)] -fn some_function() { - -} - -pub fn some_other_function() { - some_function(); -} diff --git a/src/test/codegen/instrument-mcount.rs b/src/test/codegen/instrument-mcount.rs deleted file mode 100644 index b26076e7a..000000000 --- a/src/test/codegen/instrument-mcount.rs +++ /dev/null @@ -1,7 +0,0 @@ -// -// compile-flags: -Z instrument-mcount - -#![crate_type = "lib"] - -// CHECK: attributes #{{.*}} "frame-pointer"="all" "instrument-function-entry-inlined"="{{.*}}mcount{{.*}}" -pub fn foo() {} diff --git a/src/test/codegen/integer-cmp.rs b/src/test/codegen/integer-cmp.rs deleted file mode 100644 index 8ada3cf09..000000000 --- a/src/test/codegen/integer-cmp.rs +++ /dev/null @@ -1,28 +0,0 @@ -// This is test for more optimal Ord implementation for integers. -// See <https://github.com/rust-lang/rust/issues/63758> for more info. - -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] - -use std::cmp::Ordering; - -// CHECK-LABEL: @cmp_signed -#[no_mangle] -pub fn cmp_signed(a: i64, b: i64) -> Ordering { -// CHECK: icmp slt -// CHECK: icmp ne -// CHECK: zext i1 -// CHECK: select i1 - a.cmp(&b) -} - -// CHECK-LABEL: @cmp_unsigned -#[no_mangle] -pub fn cmp_unsigned(a: u32, b: u32) -> Ordering { -// CHECK: icmp ult -// CHECK: icmp ne -// CHECK: zext i1 -// CHECK: select i1 - a.cmp(&b) -} diff --git a/src/test/codegen/integer-overflow.rs b/src/test/codegen/integer-overflow.rs deleted file mode 100644 index 183de56db..000000000 --- a/src/test/codegen/integer-overflow.rs +++ /dev/null @@ -1,26 +0,0 @@ -// no-system-llvm -// compile-flags: -O -C overflow-checks=on - -#![crate_type = "lib"] - - -pub struct S1<'a> { - data: &'a [u8], - position: usize, -} - -// CHECK-LABEL: @slice_no_index_order -#[no_mangle] -pub fn slice_no_index_order<'a>(s: &'a mut S1, n: usize) -> &'a [u8] { - // CHECK-NOT: slice_index_order_fail - let d = &s.data[s.position..s.position+n]; - s.position += n; - return d; -} - -// CHECK-LABEL: @test_check -#[no_mangle] -pub fn test_check<'a>(s: &'a mut S1, x: usize, y: usize) -> &'a [u8] { - // CHECK: slice_index_order_fail - &s.data[x..y] -} diff --git a/src/test/codegen/internalize-closures.rs b/src/test/codegen/internalize-closures.rs deleted file mode 100644 index ab3dc3fba..000000000 --- a/src/test/codegen/internalize-closures.rs +++ /dev/null @@ -1,14 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Zmir-opt-level=0 - -pub fn main() { - - // We want to make sure that closures get 'internal' linkage instead of - // 'weak_odr' when they are not shared between codegen units - // FIXME(eddyb) `legacy` mangling uses `{{closure}}`, while `v0` - // uses `{closure#0}`, switch to the latter once `legacy` is gone. - // CHECK-LABEL: ; internalize_closures::main::{{.*}}closure - // CHECK-NEXT: ; Function Attrs: - // CHECK-NEXT: define internal - let c = |x:i32| { x + 1 }; - let _ = c(1); -} diff --git a/src/test/codegen/intrinsic-no-unnamed-attr.rs b/src/test/codegen/intrinsic-no-unnamed-attr.rs deleted file mode 100644 index c8a8e0b3e..000000000 --- a/src/test/codegen/intrinsic-no-unnamed-attr.rs +++ /dev/null @@ -1,12 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![feature(intrinsics)] - -extern "rust-intrinsic" { - fn sqrtf32(x: f32) -> f32; -} -// CHECK: @llvm.sqrt.f32(float) #{{[0-9]*}} - -fn main() { - unsafe { sqrtf32(0.0f32); } -} diff --git a/src/test/codegen/intrinsics/const_eval_select.rs b/src/test/codegen/intrinsics/const_eval_select.rs deleted file mode 100644 index db8a04763..000000000 --- a/src/test/codegen/intrinsics/const_eval_select.rs +++ /dev/null @@ -1,18 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(const_eval_select)] -#![feature(core_intrinsics)] - -use std::intrinsics::const_eval_select; - -const fn foo(_: i32) -> i32 { 1 } - -#[no_mangle] -pub fn hi(n: i32) -> i32 { n } - -#[no_mangle] -pub unsafe fn hey() { - // CHECK: call i32 @hi(i32 - const_eval_select((42,), foo, hi); -} diff --git a/src/test/codegen/intrinsics/exact_div.rs b/src/test/codegen/intrinsics/exact_div.rs deleted file mode 100644 index 68eaa3999..000000000 --- a/src/test/codegen/intrinsics/exact_div.rs +++ /dev/null @@ -1,20 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics::exact_div; - -// CHECK-LABEL: @exact_sdiv -#[no_mangle] -pub unsafe fn exact_sdiv(x: i32, y: i32) -> i32 { - // CHECK: sdiv exact - exact_div(x, y) -} - -// CHECK-LABEL: @exact_udiv -#[no_mangle] -pub unsafe fn exact_udiv(x: u32, y: u32) -> u32 { - // CHECK: udiv exact - exact_div(x, y) -} diff --git a/src/test/codegen/intrinsics/likely.rs b/src/test/codegen/intrinsics/likely.rs deleted file mode 100644 index c5a0185bd..000000000 --- a/src/test/codegen/intrinsics/likely.rs +++ /dev/null @@ -1,30 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics::{likely,unlikely}; - -#[no_mangle] -pub fn check_likely(x: i32, y: i32) -> Option<i32> { - unsafe { - // CHECK: call i1 @llvm.expect.i1(i1 %{{.*}}, i1 true) - if likely(x == y) { - None - } else { - Some(x + y) - } - } -} - -#[no_mangle] -pub fn check_unlikely(x: i32, y: i32) -> Option<i32> { - unsafe { - // CHECK: call i1 @llvm.expect.i1(i1 %{{.*}}, i1 false) - if unlikely(x == y) { - None - } else { - Some(x + y) - } - } -} diff --git a/src/test/codegen/intrinsics/mask.rs b/src/test/codegen/intrinsics/mask.rs deleted file mode 100644 index 2e984db1b..000000000 --- a/src/test/codegen/intrinsics/mask.rs +++ /dev/null @@ -1,11 +0,0 @@ -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -// CHECK-LABEL: @mask_ptr -// CHECK-SAME: [[WORD:i[0-9]+]] %mask -#[no_mangle] -pub fn mask_ptr(ptr: *const u16, mask: usize) -> *const u16 { - // CHECK: call - // CHECK-SAME: @llvm.ptrmask.{{p0|p0i8}}.[[WORD]]({{ptr|i8\*}} {{%ptr|%0}}, [[WORD]] %mask) - core::intrinsics::ptr_mask(ptr, mask) -} diff --git a/src/test/codegen/intrinsics/nearby.rs b/src/test/codegen/intrinsics/nearby.rs deleted file mode 100644 index 520fe2f18..000000000 --- a/src/test/codegen/intrinsics/nearby.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics; - -// CHECK-LABEL: @nearbyintf32 -#[no_mangle] -pub unsafe fn nearbyintf32(a: f32) -> f32 { - // CHECK: llvm.nearbyint.f32 - intrinsics::nearbyintf32(a) -} - -// CHECK-LABEL: @nearbyintf64 -#[no_mangle] -pub unsafe fn nearbyintf64(a: f64) -> f64 { - // CHECK: llvm.nearbyint.f64 - intrinsics::nearbyintf64(a) -} diff --git a/src/test/codegen/intrinsics/nontemporal.rs b/src/test/codegen/intrinsics/nontemporal.rs deleted file mode 100644 index d8ee29452..000000000 --- a/src/test/codegen/intrinsics/nontemporal.rs +++ /dev/null @@ -1,13 +0,0 @@ -// compile-flags: -O - -#![feature(core_intrinsics)] -#![crate_type = "lib"] - -#[no_mangle] -pub fn a(a: &mut u32, b: u32) { - // CHECK-LABEL: define{{.*}}void @a - // CHECK: store i32 %b, {{i32\*|ptr}} %a, align 4, !nontemporal - unsafe { - std::intrinsics::nontemporal_store(a, b); - } -} diff --git a/src/test/codegen/intrinsics/offset_from.rs b/src/test/codegen/intrinsics/offset_from.rs deleted file mode 100644 index d0de4c835..000000000 --- a/src/test/codegen/intrinsics/offset_from.rs +++ /dev/null @@ -1,36 +0,0 @@ -// compile-flags: -C opt-level=1 -// only-64bit (because we're using [ui]size) - -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -//! Basic optimizations are enabled because otherwise `x86_64-gnu-nopt` had an alloca. -//! Uses a type with non-power-of-two size to avoid normalizations to shifts. - -use std::intrinsics::*; - -type RGB = [u8; 3]; - -// CHECK-LABEL: @offset_from_odd_size -#[no_mangle] -pub unsafe fn offset_from_odd_size(a: *const RGB, b: *const RGB) -> isize { - // CHECK: start - // CHECK-NEXT: ptrtoint - // CHECK-NEXT: ptrtoint - // CHECK-NEXT: sub i64 - // CHECK-NEXT: sdiv exact i64 %{{[0-9]+}}, 3 - // CHECK-NEXT: ret i64 - ptr_offset_from(a, b) -} - -// CHECK-LABEL: @offset_from_unsigned_odd_size -#[no_mangle] -pub unsafe fn offset_from_unsigned_odd_size(a: *const RGB, b: *const RGB) -> usize { - // CHECK: start - // CHECK-NEXT: ptrtoint - // CHECK-NEXT: ptrtoint - // CHECK-NEXT: sub nuw i64 - // CHECK-NEXT: udiv exact i64 %{{[0-9]+}}, 3 - // CHECK-NEXT: ret i64 - ptr_offset_from_unsigned(a, b) -} diff --git a/src/test/codegen/intrinsics/prefetch.rs b/src/test/codegen/intrinsics/prefetch.rs deleted file mode 100644 index 59d7fa638..000000000 --- a/src/test/codegen/intrinsics/prefetch.rs +++ /dev/null @@ -1,63 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics::{prefetch_read_data, prefetch_write_data, - prefetch_read_instruction, prefetch_write_instruction}; - -#[no_mangle] -pub fn check_prefetch_read_data(data: &[i8]) { - unsafe { - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 0, i32 1) - prefetch_read_data(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 1, i32 1) - prefetch_read_data(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 2, i32 1) - prefetch_read_data(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 3, i32 1) - prefetch_read_data(data.as_ptr(), 3); - } -} - -#[no_mangle] -pub fn check_prefetch_write_data(data: &[i8]) { - unsafe { - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 0, i32 1) - prefetch_write_data(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 1, i32 1) - prefetch_write_data(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 2, i32 1) - prefetch_write_data(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 3, i32 1) - prefetch_write_data(data.as_ptr(), 3); - } -} - -#[no_mangle] -pub fn check_prefetch_read_instruction(data: &[i8]) { - unsafe { - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 0, i32 0) - prefetch_read_instruction(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 1, i32 0) - prefetch_read_instruction(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 2, i32 0) - prefetch_read_instruction(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 0, i32 3, i32 0) - prefetch_read_instruction(data.as_ptr(), 3); - } -} - -#[no_mangle] -pub fn check_prefetch_write_instruction(data: &[i8]) { - unsafe { - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 0, i32 0) - prefetch_write_instruction(data.as_ptr(), 0); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 1, i32 0) - prefetch_write_instruction(data.as_ptr(), 1); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 2, i32 0) - prefetch_write_instruction(data.as_ptr(), 2); - // CHECK: call void @llvm.prefetch{{.*}}({{.*}}, i32 1, i32 3, i32 0) - prefetch_write_instruction(data.as_ptr(), 3); - } -} diff --git a/src/test/codegen/intrinsics/unchecked_math.rs b/src/test/codegen/intrinsics/unchecked_math.rs deleted file mode 100644 index 419c120ed..000000000 --- a/src/test/codegen/intrinsics/unchecked_math.rs +++ /dev/null @@ -1,46 +0,0 @@ -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics::*; - -// CHECK-LABEL: @unchecked_add_signed -#[no_mangle] -pub unsafe fn unchecked_add_signed(a: i32, b: i32) -> i32 { - // CHECK: add nsw - unchecked_add(a, b) -} - -// CHECK-LABEL: @unchecked_add_unsigned -#[no_mangle] -pub unsafe fn unchecked_add_unsigned(a: u32, b: u32) -> u32 { - // CHECK: add nuw - unchecked_add(a, b) -} - -// CHECK-LABEL: @unchecked_sub_signed -#[no_mangle] -pub unsafe fn unchecked_sub_signed(a: i32, b: i32) -> i32 { - // CHECK: sub nsw - unchecked_sub(a, b) -} - -// CHECK-LABEL: @unchecked_sub_unsigned -#[no_mangle] -pub unsafe fn unchecked_sub_unsigned(a: u32, b: u32) -> u32 { - // CHECK: sub nuw - unchecked_sub(a, b) -} - -// CHECK-LABEL: @unchecked_mul_signed -#[no_mangle] -pub unsafe fn unchecked_mul_signed(a: i32, b: i32) -> i32 { - // CHECK: mul nsw - unchecked_mul(a, b) -} - -// CHECK-LABEL: @unchecked_mul_unsigned -#[no_mangle] -pub unsafe fn unchecked_mul_unsigned(a: u32, b: u32) -> u32 { - // CHECK: mul nuw - unchecked_mul(a, b) -} diff --git a/src/test/codegen/intrinsics/volatile.rs b/src/test/codegen/intrinsics/volatile.rs deleted file mode 100644 index 7980c00e7..000000000 --- a/src/test/codegen/intrinsics/volatile.rs +++ /dev/null @@ -1,55 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics; - -// CHECK-LABEL: @volatile_copy_memory -#[no_mangle] -pub unsafe fn volatile_copy_memory(a: *mut u8, b: *const u8) { - // CHECK: llvm.memmove.{{\w*(.*true)}} - intrinsics::volatile_copy_memory(a, b, 1) -} - -// CHECK-LABEL: @volatile_copy_nonoverlapping_memory -#[no_mangle] -pub unsafe fn volatile_copy_nonoverlapping_memory(a: *mut u8, b: *const u8) { - // CHECK: llvm.memcpy.{{\w*(.*true)}} - intrinsics::volatile_copy_nonoverlapping_memory(a, b, 1) -} - -// CHECK-LABEL: @volatile_set_memory -#[no_mangle] -pub unsafe fn volatile_set_memory(a: *mut u8, b: u8) { - // CHECK: llvm.memset.{{\w*(.*true)}} - intrinsics::volatile_set_memory(a, b, 1) -} - -// CHECK-LABEL: @volatile_load -#[no_mangle] -pub unsafe fn volatile_load(a: *const u8) -> u8 { - // CHECK: load volatile - intrinsics::volatile_load(a) -} - -// CHECK-LABEL: @volatile_store -#[no_mangle] -pub unsafe fn volatile_store(a: *mut u8, b: u8) { - // CHECK: store volatile - intrinsics::volatile_store(a, b) -} - -// CHECK-LABEL: @unaligned_volatile_load -#[no_mangle] -pub unsafe fn unaligned_volatile_load(a: *const u8) -> u8 { - // CHECK: load volatile - intrinsics::unaligned_volatile_load(a) -} - -// CHECK-LABEL: @unaligned_volatile_store -#[no_mangle] -pub unsafe fn unaligned_volatile_store(a: *mut u8, b: u8) { - // CHECK: store volatile - intrinsics::unaligned_volatile_store(a, b) -} diff --git a/src/test/codegen/intrinsics/volatile_order.rs b/src/test/codegen/intrinsics/volatile_order.rs deleted file mode 100644 index 99469831a..000000000 --- a/src/test/codegen/intrinsics/volatile_order.rs +++ /dev/null @@ -1,18 +0,0 @@ -#![crate_type = "lib"] -#![feature(core_intrinsics)] - -use std::intrinsics::*; - -pub unsafe fn test_volatile_order() { - let mut a: Box<u8> = Box::new(0); - // CHECK: load volatile - let x = volatile_load(&*a); - // CHECK: load volatile - let x = volatile_load(&*a); - // CHECK: store volatile - volatile_store(&mut *a, 12); - // CHECK: store volatile - unaligned_volatile_store(&mut *a, 12); - // CHECK: llvm.memset.p0 - volatile_set_memory(&mut *a, 12, 1) -} diff --git a/src/test/codegen/issue-103285-ptr-addr-overflow-check.rs b/src/test/codegen/issue-103285-ptr-addr-overflow-check.rs deleted file mode 100644 index a3499babe..000000000 --- a/src/test/codegen/issue-103285-ptr-addr-overflow-check.rs +++ /dev/null @@ -1,16 +0,0 @@ -// compile-flags: -O -C debug-assertions=yes - -#![crate_type = "lib"] -#![feature(strict_provenance)] - -#[no_mangle] -pub fn test(src: *const u8, dst: *const u8) -> usize { - // CHECK-LABEL: @test( - // CHECK-NOT: panic - let src_usize = src.addr(); - let dst_usize = dst.addr(); - if src_usize > dst_usize { - return src_usize - dst_usize; - } - return 0; -} diff --git a/src/test/codegen/issue-13018.rs b/src/test/codegen/issue-13018.rs deleted file mode 100644 index b70ea1f48..000000000 --- a/src/test/codegen/issue-13018.rs +++ /dev/null @@ -1,11 +0,0 @@ -// compile-flags: -O - -// A drop([...].clone()) sequence on an Rc should be a no-op -// In particular, no call to __rust_dealloc should be emitted -#![crate_type = "lib"] -use std::rc::Rc; - -pub fn foo(t: &Rc<Vec<usize>>) { -// CHECK-NOT: __rust_dealloc - drop(t.clone()); -} diff --git a/src/test/codegen/issue-15953.rs b/src/test/codegen/issue-15953.rs deleted file mode 100644 index 28d284289..000000000 --- a/src/test/codegen/issue-15953.rs +++ /dev/null @@ -1,29 +0,0 @@ -// Test that llvm generates `memcpy` for moving a value -// inside a function and moving an argument. - -struct Foo { - x: Vec<i32>, -} - -#[inline(never)] -#[no_mangle] -// CHECK: memcpy -fn interior(x: Vec<i32>) -> Vec<i32> { - let Foo { x } = Foo { x: x }; - x -} - -#[inline(never)] -#[no_mangle] -// CHECK: memcpy -fn exterior(x: Vec<i32>) -> Vec<i32> { - x -} - -fn main() { - let x = interior(Vec::new()); - println!("{:?}", x); - - let x = exterior(Vec::new()); - println!("{:?}", x); -} diff --git a/src/test/codegen/issue-27130.rs b/src/test/codegen/issue-27130.rs deleted file mode 100644 index e5ee94e1f..000000000 --- a/src/test/codegen/issue-27130.rs +++ /dev/null @@ -1,21 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @trim_in_place -#[no_mangle] -pub fn trim_in_place(a: &mut &[u8]) { - while a.first() == Some(&42) { - // CHECK-NOT: slice_index_order_fail - *a = &a[1..]; - } -} - -// CHECK-LABEL: @trim_in_place2 -#[no_mangle] -pub fn trim_in_place2(a: &mut &[u8]) { - while let Some(&42) = a.first() { - // CHECK-NOT: slice_index_order_fail - *a = &a[2..]; - } -} diff --git a/src/test/codegen/issue-32031.rs b/src/test/codegen/issue-32031.rs deleted file mode 100644 index 82ba32557..000000000 --- a/src/test/codegen/issue-32031.rs +++ /dev/null @@ -1,23 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#[no_mangle] -pub struct F32(f32); - -// CHECK: define{{.*}}float @add_newtype_f32(float %a, float %b) -#[inline(never)] -#[no_mangle] -pub fn add_newtype_f32(a: F32, b: F32) -> F32 { - F32(a.0 + b.0) -} - -#[no_mangle] -pub struct F64(f64); - -// CHECK: define{{.*}}double @add_newtype_f64(double %a, double %b) -#[inline(never)] -#[no_mangle] -pub fn add_newtype_f64(a: F64, b: F64) -> F64 { - F64(a.0 + b.0) -} diff --git a/src/test/codegen/issue-32364.rs b/src/test/codegen/issue-32364.rs deleted file mode 100644 index 85493a4bb..000000000 --- a/src/test/codegen/issue-32364.rs +++ /dev/null @@ -1,18 +0,0 @@ -// Test that `extern "stdcall"` is properly translated. - -// only-x86 - -// compile-flags: -C no-prepopulate-passes - -struct Foo; - -impl Foo { -// CHECK: define internal x86_stdcallcc void @{{.*}}foo{{.*}}() - #[inline(never)] - pub extern "stdcall" fn foo<T>() { - } -} - -fn main() { - Foo::foo::<Foo>(); -} diff --git a/src/test/codegen/issue-34634.rs b/src/test/codegen/issue-34634.rs deleted file mode 100644 index f53fa240c..000000000 --- a/src/test/codegen/issue-34634.rs +++ /dev/null @@ -1,16 +0,0 @@ -// Test that `wrapping_div` only checks divisor once. -// This test checks that there is only a single compare against -1 and -1 is not present as a -// switch case (the second check present until rustc 1.12). -// This test also verifies that a single panic call is generated (for the division by zero case). - -// compile-flags: -O -#![crate_type = "lib"] - -// CHECK-LABEL: @f -#[no_mangle] -pub fn f(x: i32, y: i32) -> i32 { - // CHECK-COUNT-1: icmp eq i32 %y, -1 - // CHECK-COUNT-1: panic - // CHECK-NOT: i32 -1, label - x.wrapping_div(y) -} diff --git a/src/test/codegen/issue-34947-pow-i32.rs b/src/test/codegen/issue-34947-pow-i32.rs deleted file mode 100644 index 653da8e8b..000000000 --- a/src/test/codegen/issue-34947-pow-i32.rs +++ /dev/null @@ -1,13 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @issue_34947 -#[no_mangle] -pub fn issue_34947(x: i32) -> i32 { - // CHECK: mul - // CHECK-NEXT: mul - // CHECK-NEXT: mul - // CHECK-NEXT: ret - x.pow(5) -} diff --git a/src/test/codegen/issue-37945.rs b/src/test/codegen/issue-37945.rs deleted file mode 100644 index fe54375bb..000000000 --- a/src/test/codegen/issue-37945.rs +++ /dev/null @@ -1,38 +0,0 @@ -// compile-flags: -O -Zmerge-functions=disabled -// ignore-x86 -// ignore-arm -// ignore-emscripten -// ignore-gnux32 -// ignore 32-bit platforms (LLVM has a bug with them) - -// Check that LLVM understands that `Iter` pointer is not null. Issue #37945. - -#![crate_type = "lib"] - -use std::slice::Iter; - -#[no_mangle] -pub fn is_empty_1(xs: Iter<f32>) -> bool { -// CHECK-LABEL: @is_empty_1( -// CHECK-NEXT: start: -// CHECK-NEXT: [[A:%.*]] = icmp ne {{i32\*|ptr}} {{%xs.0|%xs.1}}, null -// CHECK-NEXT: tail call void @llvm.assume(i1 [[A]]) -// The order between %xs.0 and %xs.1 on the next line doesn't matter -// and different LLVM versions produce different order. -// CHECK-NEXT: [[B:%.*]] = icmp eq {{i32\*|ptr}} {{%xs.0, %xs.1|%xs.1, %xs.0}} -// CHECK-NEXT: ret i1 [[B:%.*]] - {xs}.next().is_none() -} - -#[no_mangle] -pub fn is_empty_2(xs: Iter<f32>) -> bool { -// CHECK-LABEL: @is_empty_2 -// CHECK-NEXT: start: -// CHECK-NEXT: [[C:%.*]] = icmp ne {{i32\*|ptr}} {{%xs.0|%xs.1}}, null -// CHECK-NEXT: tail call void @llvm.assume(i1 [[C]]) -// The order between %xs.0 and %xs.1 on the next line doesn't matter -// and different LLVM versions produce different order. -// CHECK-NEXT: [[D:%.*]] = icmp eq {{i32\*|ptr}} {{%xs.0, %xs.1|%xs.1, %xs.0}} -// CHECK-NEXT: ret i1 [[D:%.*]] - xs.map(|&x| x).next().is_none() -} diff --git a/src/test/codegen/issue-44056-macos-tls-align.rs b/src/test/codegen/issue-44056-macos-tls-align.rs deleted file mode 100644 index 1a3923f1b..000000000 --- a/src/test/codegen/issue-44056-macos-tls-align.rs +++ /dev/null @@ -1,28 +0,0 @@ -// -// only-macos -// no-system-llvm -// compile-flags: -O - -#![crate_type = "rlib"] -#![feature(thread_local)] - -// local_unnamed_addr does not appear when std is built with debug assertions. -// CHECK: @STATIC_VAR_1 = thread_local {{(local_unnamed_addr )?}}global <{ [32 x i8] }> zeroinitializer, section "__DATA,__thread_bss", align 4 -#[no_mangle] -#[thread_local] -static mut STATIC_VAR_1: [u32; 8] = [0; 8]; - -// CHECK: @STATIC_VAR_2 = thread_local {{(local_unnamed_addr )?}}global <{ [32 x i8] }> <{{[^>]*}}>, section "__DATA,__thread_data", align 4 -#[no_mangle] -#[thread_local] -static mut STATIC_VAR_2: [u32; 8] = [4; 8]; - -#[no_mangle] -pub unsafe fn f(x: &mut [u32; 8]) { - std::mem::swap(x, &mut STATIC_VAR_1) -} - -#[no_mangle] -pub unsafe fn g(x: &mut [u32; 8]) { - std::mem::swap(x, &mut STATIC_VAR_2) -} diff --git a/src/test/codegen/issue-45222.rs b/src/test/codegen/issue-45222.rs deleted file mode 100644 index e9b05e648..000000000 --- a/src/test/codegen/issue-45222.rs +++ /dev/null @@ -1,63 +0,0 @@ -// compile-flags: -O -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] - -// verify that LLVM recognizes a loop involving 0..=n and will const-fold it. - -// Example from original issue #45222 - -fn foo2(n: u64) -> u64 { - let mut count = 0; - for _ in 0..n { - for j in (0..=n).rev() { - count += j; - } - } - count -} - -// CHECK-LABEL: @check_foo2 -#[no_mangle] -pub fn check_foo2() -> u64 { - // CHECK: ret i64 500005000000000 - foo2(100000) -} - -// Simplified example of #45222 -// -// Temporarily disabled in #68835 to fix a soundness hole. -// -// fn triangle_inc(n: u64) -> u64 { -// let mut count = 0; -// for j in 0 ..= n { -// count += j; -// } -// count -// } -// -// // COMMENTEDCHECK-LABEL: @check_triangle_inc -// #[no_mangle] -// pub fn check_triangle_inc() -> u64 { -// // COMMENTEDCHECK: ret i64 5000050000 -// triangle_inc(100000) -// } - -// Demo in #48012 - -fn foo3r(n: u64) -> u64 { - let mut count = 0; - (0..n).for_each(|_| { - (0..=n).rev().for_each(|j| { - count += j; - }) - }); - count -} - -// CHECK-LABEL: @check_foo3r -#[no_mangle] -pub fn check_foo3r() -> u64 { - // CHECK: ret i64 500050000000 - foo3r(10000) -} diff --git a/src/test/codegen/issue-45466.rs b/src/test/codegen/issue-45466.rs deleted file mode 100644 index c79542767..000000000 --- a/src/test/codegen/issue-45466.rs +++ /dev/null @@ -1,15 +0,0 @@ -// compile-flags: -O -// ignore-debug: the debug assertions get in the way - -#![crate_type="rlib"] - -// CHECK-LABEL: @memzero -// CHECK-NOT: store -// CHECK: call void @llvm.memset -// CHECK-NOT: store -#[no_mangle] -pub fn memzero(data: &mut [u8]) { - for i in 0..data.len() { - data[i] = 0; - } -} diff --git a/src/test/codegen/issue-45964-bounds-check-slice-pos.rs b/src/test/codegen/issue-45964-bounds-check-slice-pos.rs deleted file mode 100644 index aa59c713b..000000000 --- a/src/test/codegen/issue-45964-bounds-check-slice-pos.rs +++ /dev/null @@ -1,38 +0,0 @@ -// This test case checks that slice::{r}position functions do not -// prevent optimizing away bounds checks - -// compile-flags: -O - -#![crate_type="rlib"] - -// CHECK-LABEL: @test -#[no_mangle] -pub fn test(y: &[u32], x: &u32, z: &u32) -> bool { - let result = match y.iter().position(|a| a == x) { - Some(p) => Ok(p), - None => Err(()), - }; - - if let Ok(p) = result { - // CHECK-NOT: panic - y[p] == *z - } else { - false - } -} - -// CHECK-LABEL: @rtest -#[no_mangle] -pub fn rtest(y: &[u32], x: &u32, z: &u32) -> bool { - let result = match y.iter().rposition(|a| a == x) { - Some(p) => Ok(p), - None => Err(()), - }; - - if let Ok(p) = result { - // CHECK-NOT: panic - y[p] == *z - } else { - false - } -} diff --git a/src/test/codegen/issue-47278.rs b/src/test/codegen/issue-47278.rs deleted file mode 100644 index 9076274f4..000000000 --- a/src/test/codegen/issue-47278.rs +++ /dev/null @@ -1,9 +0,0 @@ -// -C no-prepopulate-passes -#![crate_type="staticlib"] - -#[repr(C)] -pub struct Foo(u64); - -// CHECK: define {{.*}} @foo( -#[no_mangle] -pub extern "C" fn foo(_: Foo) -> Foo { loop {} } diff --git a/src/test/codegen/issue-47442.rs b/src/test/codegen/issue-47442.rs deleted file mode 100644 index 6944336d3..000000000 --- a/src/test/codegen/issue-47442.rs +++ /dev/null @@ -1,22 +0,0 @@ -// check that we don't emit unneeded `resume` cleanup blocks for every -// destructor. - -// CHECK-NOT: Unwind - -#![feature(test)] -#![crate_type="rlib"] - -extern crate test; - -struct Foo {} - -impl Drop for Foo { - fn drop(&mut self) { - test::black_box(()); - } -} - -#[no_mangle] -pub fn foo() { - let _foo = Foo {}; -} diff --git a/src/test/codegen/issue-56267-2.rs b/src/test/codegen/issue-56267-2.rs deleted file mode 100644 index 4dc9ebfeb..000000000 --- a/src/test/codegen/issue-56267-2.rs +++ /dev/null @@ -1,18 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type="rlib"] - -#[allow(dead_code)] -pub struct Foo<T> { - foo: u64, - bar: T, -} - -// The load from bar.1 should have alignment 4. Not checking -// other loads here, as the alignment will be platform-dependent. - -// CHECK: %{{.+}} = load i32, {{i32\*|ptr}} %{{.+}}, align 4 -#[no_mangle] -pub fn test(x: Foo<(i32, i32)>) -> (i32, i32) { - x.bar -} diff --git a/src/test/codegen/issue-56267.rs b/src/test/codegen/issue-56267.rs deleted file mode 100644 index 7bdd25779..000000000 --- a/src/test/codegen/issue-56267.rs +++ /dev/null @@ -1,18 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type="rlib"] - -#[allow(dead_code)] -pub struct Foo<T> { - foo: u64, - bar: T, -} - -// The store writing to bar.1 should have alignment 4. Not checking -// other stores here, as the alignment will be platform-dependent. - -// CHECK: store i32 [[TMP1:%.+]], {{i32\*|ptr}} [[TMP2:%.+]], align 4 -#[no_mangle] -pub fn test(x: (i32, i32)) -> Foo<(i32, i32)> { - Foo { foo: 0, bar: x } -} diff --git a/src/test/codegen/issue-56927.rs b/src/test/codegen/issue-56927.rs deleted file mode 100644 index 044d72181..000000000 --- a/src/test/codegen/issue-56927.rs +++ /dev/null @@ -1,43 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type="rlib"] - -#[repr(align(16))] -pub struct S { - arr: [u32; 4], -} - -// CHECK-LABEL: @test1 -// CHECK: store i32 0, {{i32\*|ptr}} %{{.+}}, align 16 -// CHECK: store i32 1, {{i32\*|ptr}} %{{.+}}, align 4 -// CHECK: store i32 2, {{i32\*|ptr}} %{{.+}}, align 8 -// CHECK: store i32 3, {{i32\*|ptr}} %{{.+}}, align 4 -#[no_mangle] -pub fn test1(s: &mut S) { - s.arr[0] = 0; - s.arr[1] = 1; - s.arr[2] = 2; - s.arr[3] = 3; -} - -// CHECK-LABEL: @test2 -// CHECK: store i32 4, {{i32\*|ptr}} %{{.+}}, align 4 -#[allow(unconditional_panic)] -#[no_mangle] -pub fn test2(s: &mut S) { - s.arr[usize::MAX / 4 + 1] = 4; -} - -// CHECK-LABEL: @test3 -// CHECK: store i32 5, {{i32\*|ptr}} %{{.+}}, align 4 -#[no_mangle] -pub fn test3(s: &mut S, i: usize) { - s.arr[i] = 5; -} - -// CHECK-LABEL: @test4 -// CHECK: store i32 6, {{i32\*|ptr}} %{{.+}}, align 4 -#[no_mangle] -pub fn test4(s: &mut S) { - s.arr = [6; 4]; -} diff --git a/src/test/codegen/issue-58881.rs b/src/test/codegen/issue-58881.rs deleted file mode 100644 index 0900a3337..000000000 --- a/src/test/codegen/issue-58881.rs +++ /dev/null @@ -1,21 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// -// only-x86_64 -// ignore-windows - -#![crate_type = "lib"] - -extern "C" { - fn variadic_fn(_: i32, ...); -} - -#[repr(C)] -struct Foo(u8); -#[repr(C)] -struct Bar(u64, u64, u64); - -// Ensure that emit arguments of the correct type. -pub unsafe fn test_call_variadic() { - // CHECK: call void (i32, ...) @variadic_fn(i32 0, i8 {{.*}}, {{%Bar\*|ptr}} {{.*}}) - variadic_fn(0, Foo(0), Bar(0, 0, 0)) -} diff --git a/src/test/codegen/issue-59352.rs b/src/test/codegen/issue-59352.rs deleted file mode 100644 index d271fe027..000000000 --- a/src/test/codegen/issue-59352.rs +++ /dev/null @@ -1,18 +0,0 @@ -// This test is a mirror of mir-opt/issues/issue-59352.rs. The LLVM inliner doesn't inline -// `char::method::is_digit()` and `char::method::to_digit()`, probably because of their size. -// -// Currently, the MIR optimizer isn't capable of removing the unreachable panic in this test case. -// Once the optimizer can do that, mir-opt/issues/issue-59352.rs will need to be updated and this -// test case should be removed as it will become redundant. - -// mir-opt-level=3 enables inlining and enables LLVM to optimize away the unreachable panic call. -// compile-flags: -O -Z mir-opt-level=3 - -#![crate_type = "rlib"] - -// CHECK-LABEL: @num_to_digit -#[no_mangle] -pub fn num_to_digit(num: char) -> u32 { - // CHECK-NOT: panic - if num.is_digit(8) { num.to_digit(8).unwrap() } else { 0 } -} diff --git a/src/test/codegen/issue-69101-bounds-check.rs b/src/test/codegen/issue-69101-bounds-check.rs deleted file mode 100644 index a3aca3a29..000000000 --- a/src/test/codegen/issue-69101-bounds-check.rs +++ /dev/null @@ -1,44 +0,0 @@ -// no-system-llvm -// compile-flags: -O -// ignore-debug: the debug assertions get in the way -#![crate_type = "lib"] - -// Make sure no bounds checks are emitted in the loop when upfront slicing -// ensures that the slices are big enough. -// In particular, bounds checks were not always optimized out if the upfront -// check was for a greater len than the loop requires. -// (i.e. `already_sliced_no_bounds_check` was not always optimized even when -// `already_sliced_no_bounds_check_exact` was) -// CHECK-LABEL: @already_sliced_no_bounds_check -#[no_mangle] -pub fn already_sliced_no_bounds_check(a: &[u8], b: &[u8], c: &mut [u8]) { - // CHECK: slice_end_index_len_fail - // CHECK-NOT: panic_bounds_check - let _ = (&a[..2048], &b[..2048], &mut c[..2048]); - for i in 0..1024 { - c[i] = a[i] ^ b[i]; - } -} - -// CHECK-LABEL: @already_sliced_no_bounds_check_exact -#[no_mangle] -pub fn already_sliced_no_bounds_check_exact(a: &[u8], b: &[u8], c: &mut [u8]) { - // CHECK: slice_end_index_len_fail - // CHECK-NOT: panic_bounds_check - let _ = (&a[..1024], &b[..1024], &mut c[..1024]); - for i in 0..1024 { - c[i] = a[i] ^ b[i]; - } -} - -// Make sure we're checking for the right thing: there can be a panic if the slice is too small. -// CHECK-LABEL: @already_sliced_bounds_check -#[no_mangle] -pub fn already_sliced_bounds_check(a: &[u8], b: &[u8], c: &mut [u8]) { - // CHECK: slice_end_index_len_fail - // CHECK: panic_bounds_check - let _ = (&a[..1023], &b[..2048], &mut c[..2048]); - for i in 0..1024 { - c[i] = a[i] ^ b[i]; - } -} diff --git a/src/test/codegen/issue-73031.rs b/src/test/codegen/issue-73031.rs deleted file mode 100644 index a09c4bcfb..000000000 --- a/src/test/codegen/issue-73031.rs +++ /dev/null @@ -1,26 +0,0 @@ -// compile-flags: -O -#![crate_type = "lib"] - -// Test that LLVM can eliminate the unreachable `All::None` branch. - -pub enum All { - None, - Foo, - Bar, -} - -// CHECK-LABEL: @issue_73031 -#[no_mangle] -pub fn issue_73031(a: &mut All, q: i32) -> i32 { - *a = if q == 5 { - All::Foo - } else { - All::Bar - }; - match *a { - // CHECK-NOT: panic - All::None => panic!(), - All::Foo => 1, - All::Bar => 2, - } -} diff --git a/src/test/codegen/issue-73338-effecient-cmp.rs b/src/test/codegen/issue-73338-effecient-cmp.rs deleted file mode 100644 index 85c2bbfd0..000000000 --- a/src/test/codegen/issue-73338-effecient-cmp.rs +++ /dev/null @@ -1,39 +0,0 @@ -// This test checks that comparison operation -// generated by #[derive(PartialOrd)] -// doesn't contain jumps for C enums - -// compile-flags: -Copt-level=3 - -#![crate_type="lib"] - -#[repr(u32)] -#[derive(Copy, Clone, Eq, PartialEq, PartialOrd)] -pub enum Foo { - Zero, - One, - Two, -} - -#[no_mangle] -pub fn compare_less(a: Foo, b: Foo)->bool{ - // CHECK-NOT: br {{.*}} - a < b -} - -#[no_mangle] -pub fn compare_le(a: Foo, b: Foo)->bool{ - // CHECK-NOT: br {{.*}} - a <= b -} - -#[no_mangle] -pub fn compare_ge(a: Foo, b: Foo)->bool{ - // CHECK-NOT: br {{.*}} - a >= b -} - -#[no_mangle] -pub fn compare_greater(a: Foo, b: Foo)->bool{ - // CHECK-NOT: br {{.*}} - a > b -} diff --git a/src/test/codegen/issue-73396-bounds-check-after-position.rs b/src/test/codegen/issue-73396-bounds-check-after-position.rs deleted file mode 100644 index 8d07a67a1..000000000 --- a/src/test/codegen/issue-73396-bounds-check-after-position.rs +++ /dev/null @@ -1,77 +0,0 @@ -// compile-flags: -O -// ignore-debug: the debug assertions get in the way -#![crate_type = "lib"] - -// Make sure no bounds checks are emitted when slicing or indexing -// with an index from `position()` or `rposition()`. - -// CHECK-LABEL: @position_slice_to_no_bounds_check -#[no_mangle] -pub fn position_slice_to_no_bounds_check(s: &[u8]) -> &[u8] { - // CHECK-NOT: panic - // CHECK-NOT: slice_index_len_fail - if let Some(idx) = s.iter().position(|b| *b == b'\\') { - &s[..idx] - } else { - s - } -} - -// CHECK-LABEL: @position_slice_from_no_bounds_check -#[no_mangle] -pub fn position_slice_from_no_bounds_check(s: &[u8]) -> &[u8] { - // CHECK-NOT: panic - // CHECK-NOT: slice_index_len_fail - if let Some(idx) = s.iter().position(|b| *b == b'\\') { - &s[idx..] - } else { - s - } -} - -// CHECK-LABEL: @position_index_no_bounds_check -#[no_mangle] -pub fn position_index_no_bounds_check(s: &[u8]) -> u8 { - // CHECK-NOT: panic - // CHECK-NOT: slice_index_len_fail - if let Some(idx) = s.iter().position(|b| *b == b'\\') { - s[idx] - } else { - 42 - } -} -// CHECK-LABEL: @rposition_slice_to_no_bounds_check -#[no_mangle] -pub fn rposition_slice_to_no_bounds_check(s: &[u8]) -> &[u8] { - // CHECK-NOT: panic - // CHECK-NOT: slice_index_len_fail - if let Some(idx) = s.iter().rposition(|b| *b == b'\\') { - &s[..idx] - } else { - s - } -} - -// CHECK-LABEL: @rposition_slice_from_no_bounds_check -#[no_mangle] -pub fn rposition_slice_from_no_bounds_check(s: &[u8]) -> &[u8] { - // CHECK-NOT: panic - // CHECK-NOT: slice_index_len_fail - if let Some(idx) = s.iter().rposition(|b| *b == b'\\') { - &s[idx..] - } else { - s - } -} - -// CHECK-LABEL: @rposition_index_no_bounds_check -#[no_mangle] -pub fn rposition_index_no_bounds_check(s: &[u8]) -> u8 { - // CHECK-NOT: panic - // CHECK-NOT: slice_index_len_fail - if let Some(idx) = s.iter().rposition(|b| *b == b'\\') { - s[idx] - } else { - 42 - } -} diff --git a/src/test/codegen/issue-73827-bounds-check-index-in-subexpr.rs b/src/test/codegen/issue-73827-bounds-check-index-in-subexpr.rs deleted file mode 100644 index 1ad05906e..000000000 --- a/src/test/codegen/issue-73827-bounds-check-index-in-subexpr.rs +++ /dev/null @@ -1,17 +0,0 @@ -// This test checks that bounds checks are elided when -// index is part of a (x | y) < C style condition - -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @get -#[no_mangle] -pub fn get(array: &[u8; 8], x: usize, y: usize) -> u8 { - if x > 7 || y > 7 { - 0 - } else { - // CHECK-NOT: panic_bounds_check - array[y] - } -} diff --git a/src/test/codegen/issue-75525-bounds-checks.rs b/src/test/codegen/issue-75525-bounds-checks.rs deleted file mode 100644 index 2d363d8f7..000000000 --- a/src/test/codegen/issue-75525-bounds-checks.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Regression test for #75525, verifies that no bounds checks are generated. - -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @f0 -// CHECK-NOT: panic -#[no_mangle] -pub fn f0(idx: usize, buf: &[u8; 10]) -> u8 { - if idx < 8 { buf[idx + 1] } else { 0 } -} - -// CHECK-LABEL: @f1 -// CHECK-NOT: panic -#[no_mangle] -pub fn f1(idx: usize, buf: &[u8; 10]) -> u8 { - if idx > 5 && idx < 8 { buf[idx - 1] } else { 0 } -} - -// CHECK-LABEL: @f2 -// CHECK-NOT: panic -#[no_mangle] -pub fn f2(idx: usize, buf: &[u8; 10]) -> u8 { - if idx > 5 && idx < 8 { buf[idx] } else { 0 } -} diff --git a/src/test/codegen/issue-75546.rs b/src/test/codegen/issue-75546.rs deleted file mode 100644 index 470a9e040..000000000 --- a/src/test/codegen/issue-75546.rs +++ /dev/null @@ -1,15 +0,0 @@ -// compile-flags: -O -#![crate_type = "lib"] - -// Test that LLVM can eliminate the impossible `i == 0` check. - -// CHECK-LABEL: @issue_75546 -#[no_mangle] -pub fn issue_75546() { - let mut i = 1u32; - while i < u32::MAX { - // CHECK-NOT: panic - if i == 0 { panic!(); } - i += 1; - } -} diff --git a/src/test/codegen/issue-75659.rs b/src/test/codegen/issue-75659.rs deleted file mode 100644 index 6bcb59aff..000000000 --- a/src/test/codegen/issue-75659.rs +++ /dev/null @@ -1,63 +0,0 @@ -// This test checks that the call to memchr/slice_contains is optimized away -// when searching in small slices. - -// compile-flags: -O -Zinline-mir=no -// only-x86_64 - -#![crate_type = "lib"] - -// CHECK-LABEL: @foo1 -#[no_mangle] -pub fn foo1(x: u8, data: &[u8; 1]) -> bool { - // CHECK-NOT: memchr - // CHECK-NOT: slice_contains - data.contains(&x) -} - -// CHECK-LABEL: @foo2 -#[no_mangle] -pub fn foo2(x: u8, data: &[u8; 2]) -> bool { - // CHECK-NOT: memchr - // CHECK-NOT: slice_contains - data.contains(&x) -} - -// CHECK-LABEL: @foo3 -#[no_mangle] -pub fn foo3(x: u8, data: &[u8; 3]) -> bool { - // CHECK-NOT: memchr - // CHECK-NOT: slice_contains - data.contains(&x) -} - -// CHECK-LABEL: @foo4 -#[no_mangle] -pub fn foo4(x: u8, data: &[u8; 4]) -> bool { - // CHECK-NOT: memchr - // CHECK-NOT: slice_contains - data.contains(&x) -} - -// CHECK-LABEL: @foo8 -#[no_mangle] -pub fn foo8(x: u8, data: &[u8; 8]) -> bool { - // CHECK-NOT: memchr - // CHECK-NOT: slice_contains - data.contains(&x) -} - -// CHECK-LABEL: @foo8_i8 -#[no_mangle] -pub fn foo8_i8(x: i8, data: &[i8; 8]) -> bool { - // CHECK-NOT: memchr - // CHECK-NOT: slice_contains - !data.contains(&x) -} - -// Check that the general case isn't inlined -// CHECK-LABEL: @foo80 -#[no_mangle] -pub fn foo80(x: u8, data: &[u8; 80]) -> bool { - // CHECK: call core::slice::memchr - data.contains(&x) -} diff --git a/src/test/codegen/issue-77812.rs b/src/test/codegen/issue-77812.rs deleted file mode 100644 index 4cc824145..000000000 --- a/src/test/codegen/issue-77812.rs +++ /dev/null @@ -1,32 +0,0 @@ -// compile-flags: -O -#![crate_type = "lib"] - -// Test that LLVM can eliminate the unreachable `Variant::Zero` branch. - -#[derive(Copy, Clone, Eq, PartialEq)] -pub enum Variant { - Zero, - One, - Two, -} - -extern { - fn exf1(); - fn exf2(); -} - -pub static mut GLOBAL: Variant = Variant::Zero; - -// CHECK-LABEL: @issue_77812 -#[no_mangle] -pub unsafe fn issue_77812() { - let g = GLOBAL; - if g != Variant::Zero { - match g { - Variant::One => exf1(), - Variant::Two => exf2(), - // CHECK-NOT: panic - Variant::Zero => panic!(), - } - } -} diff --git a/src/test/codegen/issue-81408-dllimport-thinlto-windows.rs b/src/test/codegen/issue-81408-dllimport-thinlto-windows.rs deleted file mode 100644 index 0b6ab4f7e..000000000 --- a/src/test/codegen/issue-81408-dllimport-thinlto-windows.rs +++ /dev/null @@ -1,15 +0,0 @@ -// compile-flags: -O -C lto=thin -C prefer-dynamic=no -// only-windows -// aux-build:static_dllimport_aux.rs - -// Test that on Windows, when performing ThinLTO, we do not mark cross-crate static items with -// dllimport because lld does not fix the symbol names for us. - -extern crate static_dllimport_aux; - -// CHECK-LABEL: @{{.+}}CROSS_CRATE_STATIC_ITEM{{.+}} = -// CHECK-SAME: external local_unnamed_addr global %"{{.+}}AtomicPtr - -pub fn main() { - static_dllimport_aux::memrchr(); -} diff --git a/src/test/codegen/issue-84268.rs b/src/test/codegen/issue-84268.rs deleted file mode 100644 index 7ca195447..000000000 --- a/src/test/codegen/issue-84268.rs +++ /dev/null @@ -1,23 +0,0 @@ -// compile-flags: -O --crate-type=rlib -#![feature(platform_intrinsics, repr_simd)] - -extern "platform-intrinsic" { - fn simd_fabs<T>(x: T) -> T; - fn simd_eq<T, U>(x: T, y: T) -> U; -} - -#[repr(simd)] -pub struct V([f32; 4]); - -#[repr(simd)] -pub struct M([i32; 4]); - -#[no_mangle] -// CHECK-LABEL: @is_infinite -pub fn is_infinite(v: V) -> M { - // CHECK: fabs - // CHECK: cmp oeq - unsafe { - simd_eq(simd_fabs(v), V([f32::INFINITY; 4])) - } -} diff --git a/src/test/codegen/issue-85872-multiple-reverse.rs b/src/test/codegen/issue-85872-multiple-reverse.rs deleted file mode 100644 index 591a1aca7..000000000 --- a/src/test/codegen/issue-85872-multiple-reverse.rs +++ /dev/null @@ -1,20 +0,0 @@ -// min-llvm-version: 15.0.0 -// compile-flags: -O - -#![crate_type = "lib"] - -#[no_mangle] -pub fn u16_be_to_arch(mut data: [u8; 2]) -> [u8; 2] { - // CHECK-LABEL: @u16_be_to_arch - // CHECK: @llvm.bswap.i16 - data.reverse(); - data -} - -#[no_mangle] -pub fn u32_be_to_arch(mut data: [u8; 4]) -> [u8; 4] { - // CHECK-LABEL: @u32_be_to_arch - // CHECK: @llvm.bswap.i32 - data.reverse(); - data -} diff --git a/src/test/codegen/issue-96274.rs b/src/test/codegen/issue-96274.rs deleted file mode 100644 index 28bfcce0d..000000000 --- a/src/test/codegen/issue-96274.rs +++ /dev/null @@ -1,17 +0,0 @@ -// min-llvm-version: 15.0 -// compile-flags: -O - -#![crate_type = "lib"] -#![feature(inline_const)] - -use std::mem::MaybeUninit; - -pub fn maybe_uninit() -> [MaybeUninit<u8>; 3000] { - // CHECK-NOT: memset - [MaybeUninit::uninit(); 3000] -} - -pub fn maybe_uninit_const<T>() -> [MaybeUninit<T>; 8192] { - // CHECK-NOT: memset - [const { MaybeUninit::uninit() }; 8192] -} diff --git a/src/test/codegen/issue-96497-slice-size-nowrap.rs b/src/test/codegen/issue-96497-slice-size-nowrap.rs deleted file mode 100644 index a5dbef934..000000000 --- a/src/test/codegen/issue-96497-slice-size-nowrap.rs +++ /dev/null @@ -1,29 +0,0 @@ -// This test case checks that LLVM is aware that computing the size of a slice cannot wrap. -// The possibility of wrapping results in an additional branch when dropping boxed slices -// in some situations, see https://github.com/rust-lang/rust/issues/96497#issuecomment-1112865218 - -// compile-flags: -O -// min-llvm-version: 14.0 - -#![crate_type="lib"] - -// CHECK-LABEL: @simple_size_of_nowrap -#[no_mangle] -pub fn simple_size_of_nowrap(x: &[u32]) -> usize { - // Make sure the shift used to compute the size has a nowrap flag. - - // CHECK: [[A:%.*]] = shl nsw {{.*}}, 2 - // CHECK-NEXT: ret {{.*}} [[A]] - core::mem::size_of_val(x) -} - -// CHECK-LABEL: @drop_write -#[no_mangle] -pub fn drop_write(mut x: Box<[u32]>) { - // Check that this write is optimized out. - // This depends on the size calculation not wrapping, - // since otherwise LLVM can't tell that the memory is always deallocated if the slice len > 0. - - // CHECK-NOT: store i32 42 - x[1] = 42; -} diff --git a/src/test/codegen/issue-98156-const-arg-temp-lifetime.rs b/src/test/codegen/issue-98156-const-arg-temp-lifetime.rs deleted file mode 100644 index 12ace5fff..000000000 --- a/src/test/codegen/issue-98156-const-arg-temp-lifetime.rs +++ /dev/null @@ -1,27 +0,0 @@ -// This test checks that temporaries for indirectly-passed arguments get lifetime markers. - -// compile-flags: -O -C no-prepopulate-passes -Zmir-opt-level=0 - -#![crate_type = "lib"] - -extern "Rust" { - fn f(x: [u8; 1024]); -} - -const A: [u8; 1024] = [0; 1024]; - -// CHECK-LABEL: @const_arg_indirect -#[no_mangle] -pub unsafe fn const_arg_indirect() { - // Ensure that the live ranges for the two argument temporaries don't overlap. - - // CHECK: call void @llvm.lifetime.start - // CHECK: call void @f - // CHECK: call void @llvm.lifetime.end - // CHECK: call void @llvm.lifetime.start - // CHECK: call void @f - // CHECK: call void @llvm.lifetime.end - - f(A); - f(A); -} diff --git a/src/test/codegen/issue-98294-get-mut-copy-from-slice-opt.rs b/src/test/codegen/issue-98294-get-mut-copy-from-slice-opt.rs deleted file mode 100644 index 7da29cd79..000000000 --- a/src/test/codegen/issue-98294-get-mut-copy-from-slice-opt.rs +++ /dev/null @@ -1,19 +0,0 @@ -// min-llvm-version: 15.0.0 -// ignore-debug: The debug assertions get in the way -// compile-flags: -O - -#![crate_type = "lib"] - -// There should be no calls to panic / len_mismatch_fail. - -#[no_mangle] -pub fn test(a: &mut [u8], offset: usize, bytes: &[u8]) { - // CHECK-LABEL: @test( - // CHECK-NOT: call - // CHECK: call void @llvm.memcpy - // CHECK-NOT: call - // CHECK: } - if let Some(dst) = a.get_mut(offset..offset + bytes.len()) { - dst.copy_from_slice(bytes); - } -} diff --git a/src/test/codegen/iter-repeat-n-trivial-drop.rs b/src/test/codegen/iter-repeat-n-trivial-drop.rs deleted file mode 100644 index 20e1d9b4d..000000000 --- a/src/test/codegen/iter-repeat-n-trivial-drop.rs +++ /dev/null @@ -1,56 +0,0 @@ -// compile-flags: -O -// only-x86_64 -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] -#![feature(iter_repeat_n)] - -#[derive(Clone)] -pub struct NotCopy(u16); - -impl Drop for NotCopy { - fn drop(&mut self) {} -} - -// For a type where `Drop::drop` doesn't do anything observable and a clone is the -// same as a move, make sure that the extra case for the last item disappears. - -#[no_mangle] -// CHECK-LABEL: @iter_repeat_n_next -pub fn iter_repeat_n_next(it: &mut std::iter::RepeatN<NotCopy>) -> Option<NotCopy> { - // CHECK-NEXT: start: - // CHECK-NOT: br - // CHECK: %[[COUNT:.+]] = load i64 - // CHECK-NEXT: %[[COUNT_ZERO:.+]] = icmp eq i64 %[[COUNT]], 0 - // CHECK-NEXT: br i1 %[[COUNT_ZERO]], label %[[EMPTY:.+]], label %[[NOT_EMPTY:.+]] - - // CHECK: [[NOT_EMPTY]]: - // CHECK-NEXT: %[[DEC:.+]] = add i64 %[[COUNT]], -1 - // CHECK-NEXT: store i64 %[[DEC]] - // CHECK-NOT: br - // CHECK: %[[VAL:.+]] = load i16 - // CHECK-NEXT: br label %[[EMPTY]] - - // CHECK: [[EMPTY]]: - // CHECK-NOT: br - // CHECK: phi i16 [ undef, %start ], [ %[[VAL]], %[[NOT_EMPTY]] ] - // CHECK-NOT: br - // CHECK: ret - - it.next() -} - -// And as a result, using the iterator can optimize without special cases for -// the last iteration, like `memset`ing all the items in one call. - -#[no_mangle] -// CHECK-LABEL: @vec_extend_via_iter_repeat_n -pub fn vec_extend_via_iter_repeat_n() -> Vec<u8> { - // CHECK: %[[ADDR:.+]] = tail call dereferenceable_or_null(1234) ptr @__rust_alloc(i64 1234, i64 1) - // CHECK: tail call void @llvm.memset.p0.i64(ptr noundef nonnull align 1 dereferenceable(1234) %[[ADDR]], i8 42, i64 1234, - - let n = 1234_usize; - let mut v = Vec::with_capacity(n); - v.extend(std::iter::repeat_n(42_u8, n)); - v -} diff --git a/src/test/codegen/layout-size-checks.rs b/src/test/codegen/layout-size-checks.rs deleted file mode 100644 index d067cc10a..000000000 --- a/src/test/codegen/layout-size-checks.rs +++ /dev/null @@ -1,31 +0,0 @@ -// compile-flags: -O -// only-x86_64 -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] - -use std::alloc::Layout; - -type RGB48 = [u16; 3]; - -// CHECK-LABEL: @layout_array_rgb48 -#[no_mangle] -pub fn layout_array_rgb48(n: usize) -> Layout { - // CHECK-NOT: llvm.umul.with.overflow.i64 - // CHECK: icmp ugt i64 %n, 1537228672809129301 - // CHECK-NOT: llvm.umul.with.overflow.i64 - // CHECK: mul nuw nsw i64 %n, 6 - // CHECK-NOT: llvm.umul.with.overflow.i64 - Layout::array::<RGB48>(n).unwrap() -} - -// CHECK-LABEL: @layout_array_i32 -#[no_mangle] -pub fn layout_array_i32(n: usize) -> Layout { - // CHECK-NOT: llvm.umul.with.overflow.i64 - // CHECK: icmp ugt i64 %n, 2305843009213693951 - // CHECK-NOT: llvm.umul.with.overflow.i64 - // CHECK: shl nuw nsw i64 %n, 2 - // CHECK-NOT: llvm.umul.with.overflow.i64 - Layout::array::<i32>(n).unwrap() -} diff --git a/src/test/codegen/lifetime_start_end.rs b/src/test/codegen/lifetime_start_end.rs deleted file mode 100644 index 471a0b8ce..000000000 --- a/src/test/codegen/lifetime_start_end.rs +++ /dev/null @@ -1,34 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes -Zmir-opt-level=0 - -#![crate_type = "lib"] - -// CHECK-LABEL: @test -#[no_mangle] -pub fn test() { - let a = 0u8; - &a; // keep variable in an alloca - -// CHECK: call void @llvm.lifetime.start{{.*}}(i{{[0-9 ]+}}, {{i8\*|ptr}} %a) - - { - let b = &Some(a); - &b; // keep variable in an alloca - -// CHECK: call void @llvm.lifetime.start{{.*}}(i{{[0-9 ]+}}, {{.*}}) - -// CHECK: call void @llvm.lifetime.start{{.*}}(i{{[0-9 ]+}}, {{.*}}) - -// CHECK: call void @llvm.lifetime.end{{.*}}(i{{[0-9 ]+}}, {{.*}}) - -// CHECK: call void @llvm.lifetime.end{{.*}}(i{{[0-9 ]+}}, {{.*}}) - } - - let c = 1u8; - &c; // keep variable in an alloca - -// CHECK: call void @llvm.lifetime.start{{.*}}(i{{[0-9 ]+}}, {{i8\*|ptr}} %c) - -// CHECK: call void @llvm.lifetime.end{{.*}}(i{{[0-9 ]+}}, {{i8\*|ptr}} %c) - -// CHECK: call void @llvm.lifetime.end{{.*}}(i{{[0-9 ]+}}, {{i8\*|ptr}} %a) -} diff --git a/src/test/codegen/link-dead-code.rs b/src/test/codegen/link-dead-code.rs deleted file mode 100644 index de5a237c5..000000000 --- a/src/test/codegen/link-dead-code.rs +++ /dev/null @@ -1,22 +0,0 @@ -// compile-flags:-Clink-dead-code - -#![crate_type = "rlib"] - -// This test makes sure that, when -Clink-dead-code is specified, we generate -// code for functions that would otherwise be skipped. - -// CHECK-LABEL: ; link_dead_code::const_fn -// CHECK-NEXT: ; Function Attrs: -// CHECK-NEXT: define hidden -const fn const_fn() -> i32 { 1 } - -// CHECK-LABEL: ; link_dead_code::inline_fn -// CHECK-NEXT: ; Function Attrs: -// CHECK-NEXT: define hidden -#[inline] -fn inline_fn() -> i32 { 2 } - -// CHECK-LABEL: ; link_dead_code::private_fn -// CHECK-NEXT: ; Function Attrs: -// CHECK-NEXT: define hidden -fn private_fn() -> i32 { 3 } diff --git a/src/test/codegen/link_section.rs b/src/test/codegen/link_section.rs deleted file mode 100644 index 88b8692b0..000000000 --- a/src/test/codegen/link_section.rs +++ /dev/null @@ -1,35 +0,0 @@ -// ignore-emscripten default visibility is hidden -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -// CHECK: @VAR1 = constant <{ [4 x i8] }> <{ [4 x i8] c"\01\00\00\00" }>, section ".test_one" -#[no_mangle] -#[link_section = ".test_one"] -#[cfg(target_endian = "little")] -pub static VAR1: u32 = 1; - -#[no_mangle] -#[link_section = ".test_one"] -#[cfg(target_endian = "big")] -pub static VAR1: u32 = 0x01000000; - -pub enum E { - A(u32), - B(f32) -} - -// CHECK: @VAR2 = constant {{.*}}, section ".test_two" -#[no_mangle] -#[link_section = ".test_two"] -pub static VAR2: E = E::A(666); - -// CHECK: @VAR3 = constant {{.*}}, section ".test_three" -#[no_mangle] -#[link_section = ".test_three"] -pub static VAR3: E = E::B(1.); - -// CHECK: define void @fn1() {{.*}} section ".test_four" { -#[no_mangle] -#[link_section = ".test_four"] -pub fn fn1() {} diff --git a/src/test/codegen/loads.rs b/src/test/codegen/loads.rs deleted file mode 100644 index f448306ba..000000000 --- a/src/test/codegen/loads.rs +++ /dev/null @@ -1,152 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Zmir-opt-level=0 - -#![crate_type = "lib"] - -use std::mem::MaybeUninit; -use std::num::NonZeroU16; - -pub struct Bytes { - a: u8, - b: u8, - c: u8, - d: u8, -} - -#[derive(Copy, Clone)] -pub enum MyBool { - True, - False, -} - -#[repr(align(16))] -pub struct Align16(u128); - -// CHECK: @ptr_alignment_helper({{.*}}align [[PTR_ALIGNMENT:[0-9]+]] -#[no_mangle] -pub fn ptr_alignment_helper(x: &&()) {} - -// CHECK-LABEL: @load_ref -#[no_mangle] -pub fn load_ref<'a>(x: &&'a i32) -> &'a i32 { - // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META:[0-9]+]], !noundef !{{[0-9]+}} - *x -} - -// CHECK-LABEL: @load_ref_higher_alignment -#[no_mangle] -pub fn load_ref_higher_alignment<'a>(x: &&'a Align16) -> &'a Align16 { - // CHECK: load {{%Align16\*|i128\*|ptr}}, {{%Align16\*\*|i128\*\*|ptr}} %x, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_16_META:[0-9]+]], !noundef !{{[0-9]+}} - *x -} - -// CHECK-LABEL: @load_scalar_pair -#[no_mangle] -pub fn load_scalar_pair<'a>(x: &(&'a i32, &'a Align16)) -> (&'a i32, &'a Align16) { - // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %{{.+}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META]], !noundef !{{[0-9]+}} - // CHECK: load {{i64\*|ptr}}, {{i64\*\*|ptr}} %{{.+}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_16_META]], !noundef !{{[0-9]+}} - *x -} - -// CHECK-LABEL: @load_raw_pointer -#[no_mangle] -pub fn load_raw_pointer<'a>(x: &*const i32) -> *const i32 { - // loaded raw pointer should not have !nonnull, !align, or !noundef metadata - // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x, align [[PTR_ALIGNMENT]]{{$}} - *x -} - -// CHECK-LABEL: @load_box -#[no_mangle] -pub fn load_box<'a>(x: Box<Box<i32>>) -> Box<i32> { - // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %{{.*}}, align [[PTR_ALIGNMENT]], !nonnull !{{[0-9]+}}, !align ![[ALIGN_4_META]], !noundef !{{[0-9]+}} - *x -} - -// CHECK-LABEL: @load_bool -#[no_mangle] -pub fn load_bool(x: &bool) -> bool { - // CHECK: load i8, {{i8\*|ptr}} %x, align 1, !range ![[BOOL_RANGE:[0-9]+]], !noundef !{{[0-9]+}} - *x -} - -// CHECK-LABEL: @load_maybeuninit_bool -#[no_mangle] -pub fn load_maybeuninit_bool(x: &MaybeUninit<bool>) -> MaybeUninit<bool> { - // CHECK: load i8, {{i8\*|ptr}} %x, align 1{{$}} - *x -} - -// CHECK-LABEL: @load_enum_bool -#[no_mangle] -pub fn load_enum_bool(x: &MyBool) -> MyBool { - // CHECK: load i8, {{i8\*|ptr}} %x, align 1, !range ![[BOOL_RANGE]], !noundef !{{[0-9]+}} - *x -} - -// CHECK-LABEL: @load_maybeuninit_enum_bool -#[no_mangle] -pub fn load_maybeuninit_enum_bool(x: &MaybeUninit<MyBool>) -> MaybeUninit<MyBool> { - // CHECK: load i8, {{i8\*|ptr}} %x, align 1{{$}} - *x -} - -// CHECK-LABEL: @load_int -#[no_mangle] -pub fn load_int(x: &u16) -> u16 { - // CHECK: load i16, {{i16\*|ptr}} %x, align 2{{$}} - *x -} - -// CHECK-LABEL: @load_nonzero_int -#[no_mangle] -pub fn load_nonzero_int(x: &NonZeroU16) -> NonZeroU16 { - // CHECK: load i16, {{i16\*|ptr}} %x, align 2, !range ![[NONZEROU16_RANGE:[0-9]+]], !noundef !{{[0-9]+}} - *x -} - -// CHECK-LABEL: @load_option_nonzero_int -#[no_mangle] -pub fn load_option_nonzero_int(x: &Option<NonZeroU16>) -> Option<NonZeroU16> { - // CHECK: load i16, {{i16\*|ptr}} %x, align 2{{$}} - *x -} - -// CHECK-LABEL: @borrow -#[no_mangle] -pub fn borrow(x: &i32) -> &i32 { - // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x{{.*}}, !nonnull - &x; // keep variable in an alloca - x -} - -// CHECK-LABEL: @_box -#[no_mangle] -pub fn _box(x: Box<i32>) -> i32 { - // CHECK: load {{i32\*|ptr}}, {{i32\*\*|ptr}} %x{{.*}}, align [[PTR_ALIGNMENT]] - *x -} - -// CHECK-LABEL: small_array_alignment -// The array is loaded as i32, but its alignment is lower, go with 1 byte to avoid target -// dependent alignment -#[no_mangle] -pub fn small_array_alignment(x: [i8; 4]) -> [i8; 4] { - // CHECK: [[VAR:%[0-9]+]] = load i32, {{i32\*|ptr}} %{{.*}}, align 1 - // CHECK: ret i32 [[VAR]] - x -} - -// CHECK-LABEL: small_struct_alignment -// The struct is loaded as i32, but its alignment is lower, go with 1 byte to avoid target -// dependent alignment -#[no_mangle] -pub fn small_struct_alignment(x: Bytes) -> Bytes { - // CHECK: [[VAR:%[0-9]+]] = load i32, {{i32\*|ptr}} %{{.*}}, align 1 - // CHECK: ret i32 [[VAR]] - x -} - -// CHECK-DAG: ![[BOOL_RANGE]] = !{i8 0, i8 2} -// CHECK-DAG: ![[NONZEROU16_RANGE]] = !{i16 1, i16 0} -// CHECK-DAG: ![[ALIGN_4_META]] = !{i64 4} -// CHECK-DAG: ![[ALIGN_16_META]] = !{i64 16} diff --git a/src/test/codegen/local-generics-in-exe-internalized.rs b/src/test/codegen/local-generics-in-exe-internalized.rs deleted file mode 100644 index e5430fbf1..000000000 --- a/src/test/codegen/local-generics-in-exe-internalized.rs +++ /dev/null @@ -1,14 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Zshare-generics=yes - -// Check that local generics are internalized if they are in the same CGU - -// CHECK-LABEL: ; local_generics_in_exe_internalized::foo -// CHECK-NEXT: ; Function Attrs: -// CHECK-NEXT: define internal -pub fn foo<T>(x: T, y: T) -> (T, T) { - (x, y) -} - -fn main() { - let _ = foo(0u8, 1u8); -} diff --git a/src/test/codegen/lto-removes-invokes.rs b/src/test/codegen/lto-removes-invokes.rs deleted file mode 100644 index 3979a97dc..000000000 --- a/src/test/codegen/lto-removes-invokes.rs +++ /dev/null @@ -1,21 +0,0 @@ -// compile-flags: -C lto -C panic=abort -O -// no-prefer-dynamic - -fn main() { - foo(); -} - -#[no_mangle] -#[inline(never)] -fn foo() { - let _a = Box::new(3); - bar(); -// CHECK-LABEL: define dso_local void @foo -// CHECK: call void @bar -} - -#[inline(never)] -#[no_mangle] -fn bar() { - println!("hello!"); -} diff --git a/src/test/codegen/mainsubprogram.rs b/src/test/codegen/mainsubprogram.rs deleted file mode 100644 index 790db3343..000000000 --- a/src/test/codegen/mainsubprogram.rs +++ /dev/null @@ -1,13 +0,0 @@ -// This test depends on a patch that was committed to upstream LLVM -// before 4.0, formerly backported to the Rust LLVM fork. - -// ignore-windows -// ignore-macos - -// compile-flags: -g -C no-prepopulate-passes - -// CHECK-LABEL: @main -// CHECK: {{.*}}DISubprogram{{.*}}name: "main",{{.*}}DI{{(SP)?}}FlagMainSubprogram{{.*}} - -pub fn main() { -} diff --git a/src/test/codegen/mainsubprogramstart.rs b/src/test/codegen/mainsubprogramstart.rs deleted file mode 100644 index d4de9f59a..000000000 --- a/src/test/codegen/mainsubprogramstart.rs +++ /dev/null @@ -1,14 +0,0 @@ -// ignore-windows -// ignore-macos - -// compile-flags: -g -C no-prepopulate-passes - -#![feature(start)] - -// CHECK-LABEL: @main -// CHECK: {{.*}}DISubprogram{{.*}}name: "start",{{.*}}DI{{(SP)?}}FlagMainSubprogram{{.*}} - -#[start] -fn start(_: isize, _: *const *const u8) -> isize { - return 0; -} diff --git a/src/test/codegen/match-optimized.rs b/src/test/codegen/match-optimized.rs deleted file mode 100644 index 36402cc73..000000000 --- a/src/test/codegen/match-optimized.rs +++ /dev/null @@ -1,60 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -O - -#![crate_type = "lib"] - -pub enum E { - A, - B, - C, -} - -// CHECK-LABEL: @exhaustive_match -#[no_mangle] -pub fn exhaustive_match(e: E) -> u8 { -// CHECK: switch{{.*}}, label %[[OTHERWISE:[a-zA-Z0-9_]+]] [ -// CHECK-NEXT: i[[TY:[0-9]+]] [[DISCR:[0-9]+]], label %[[A:[a-zA-Z0-9_]+]] -// CHECK-NEXT: i[[TY:[0-9]+]] [[DISCR:[0-9]+]], label %[[B:[a-zA-Z0-9_]+]] -// CHECK-NEXT: i[[TY:[0-9]+]] [[DISCR:[0-9]+]], label %[[C:[a-zA-Z0-9_]+]] -// CHECK-NEXT: ] -// CHECK: [[OTHERWISE]]: -// CHECK-NEXT: unreachable -// -// CHECK: [[A]]: -// CHECK-NEXT: store i8 0, {{i8\*|ptr}} %1, align 1 -// CHECK-NEXT: br label %[[EXIT:[a-zA-Z0-9_]+]] -// CHECK: [[B]]: -// CHECK-NEXT: store i8 1, {{i8\*|ptr}} %1, align 1 -// CHECK-NEXT: br label %[[EXIT]] -// CHECK: [[C]]: -// CHECK-NEXT: store i8 2, {{i8\*|ptr}} %1, align 1 -// CHECK-NEXT: br label %[[EXIT]] - match e { - E::A => 0, - E::B => 1, - E::C => 2, - } -} - -#[repr(u16)] -pub enum E2 { - A = 13, - B = 42, -} - -// For optimized code we produce a switch with an unreachable target as the `otherwise` so LLVM -// knows the possible values. Compare with `src/test/codegen/match-unoptimized.rs`. - -// CHECK-LABEL: @exhaustive_match_2 -#[no_mangle] -pub fn exhaustive_match_2(e: E2) -> u8 { - // CHECK: switch i16 %{{.+}}, label %[[UNREACH:.+]] [ - // CHECK-NEXT: i16 13, - // CHECK-NEXT: i16 42, - // CHECK-NEXT: ] - // CHECK: [[UNREACH]]: - // CHECK-NEXT: unreachable - match e { - E2::A => 0, - E2::B => 1, - } -} diff --git a/src/test/codegen/match-optimizes-away.rs b/src/test/codegen/match-optimizes-away.rs deleted file mode 100644 index 8f66c518c..000000000 --- a/src/test/codegen/match-optimizes-away.rs +++ /dev/null @@ -1,34 +0,0 @@ -// -// no-system-llvm -// compile-flags: -O -#![crate_type="lib"] - -pub enum Three { A, B, C } - -#[repr(u16)] -pub enum Four { A, B, C, D } - -#[no_mangle] -pub fn three_valued(x: Three) -> Three { - // CHECK-LABEL: @three_valued - // CHECK-NEXT: {{^.*:$}} - // CHECK-NEXT: ret i8 %0 - match x { - Three::A => Three::A, - Three::B => Three::B, - Three::C => Three::C, - } -} - -#[no_mangle] -pub fn four_valued(x: Four) -> Four { - // CHECK-LABEL: @four_valued - // CHECK-NEXT: {{^.*:$}} - // CHECK-NEXT: ret i16 %0 - match x { - Four::A => Four::A, - Four::B => Four::B, - Four::C => Four::C, - Four::D => Four::D, - } -} diff --git a/src/test/codegen/match-unoptimized.rs b/src/test/codegen/match-unoptimized.rs deleted file mode 100644 index be40b29e3..000000000 --- a/src/test/codegen/match-unoptimized.rs +++ /dev/null @@ -1,23 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Copt-level=0 - -#![crate_type = "lib"] - -#[repr(u16)] -pub enum E2 { - A = 13, - B = 42, -} - -// For unoptimized code we produce a `br` instead of a `switch`. Compare with -// `src/test/codegen/match-optimized.rs` - -// CHECK-LABEL: @exhaustive_match_2 -#[no_mangle] -pub fn exhaustive_match_2(e: E2) -> u8 { - // CHECK: %[[CMP:.+]] = icmp eq i16 %{{.+}}, 13 - // CHECK-NEXT: br i1 %[[CMP:.+]], - match e { - E2::A => 0, - E2::B => 1, - } -} diff --git a/src/test/codegen/mem-replace-direct-memcpy.rs b/src/test/codegen/mem-replace-direct-memcpy.rs deleted file mode 100644 index e8bbf0e1b..000000000 --- a/src/test/codegen/mem-replace-direct-memcpy.rs +++ /dev/null @@ -1,24 +0,0 @@ -// This test ensures that `mem::replace::<T>` only ever calls `@llvm.memcpy` -// with `size_of::<T>()` as the size, and never goes through any wrapper that -// may e.g. multiply `size_of::<T>()` with a variable "count" (which is only -// known to be `1` after inlining). - -// compile-flags: -C no-prepopulate-passes -Zinline-mir=no -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] - -pub fn replace_byte(dst: &mut u8, src: u8) -> u8 { - std::mem::replace(dst, src) -} - -// NOTE(eddyb) the `CHECK-NOT`s ensure that the only calls of `@llvm.memcpy` in -// the entire output, are the two direct calls we want, from `ptr::replace`. - -// CHECK-NOT: call void @llvm.memcpy -// CHECK: ; core::mem::replace -// CHECK-NOT: call void @llvm.memcpy -// CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 1 %{{.*}}, i{{.*}} 1, i1 false) -// CHECK-NOT: call void @llvm.memcpy -// CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 1 %{{.*}}, i{{.*}} 1, i1 false) -// CHECK-NOT: call void @llvm.memcpy diff --git a/src/test/codegen/merge-functions.rs b/src/test/codegen/merge-functions.rs deleted file mode 100644 index 8e8fe5c96..000000000 --- a/src/test/codegen/merge-functions.rs +++ /dev/null @@ -1,17 +0,0 @@ -// min-llvm-version: 14.0 -// revisions: O Os -//[Os] compile-flags: -Copt-level=s -//[O] compile-flags: -O -#![crate_type = "lib"] - -// CHECK: @func{{2|1}} = {{.*}}alias{{.*}}@func{{1|2}} - -#[no_mangle] -pub fn func1(c: char) -> bool { - c == 's' || c == 'm' || c == 'h' || c == 'd' || c == 'w' -} - -#[no_mangle] -pub fn func2(c: char) -> bool { - matches!(c, 's' | 'm' | 'h' | 'd' | 'w') -} diff --git a/src/test/codegen/mir-inlined-line-numbers.rs b/src/test/codegen/mir-inlined-line-numbers.rs deleted file mode 100644 index 19d83f0ee..000000000 --- a/src/test/codegen/mir-inlined-line-numbers.rs +++ /dev/null @@ -1,25 +0,0 @@ -// compile-flags: -O -g - -#![crate_type = "lib"] - -#[inline(always)] -fn foo() { - bar(); -} - -#[inline(never)] -#[no_mangle] -fn bar() { - panic!(); -} - -#[no_mangle] -pub fn example() { - foo(); -} - -// CHECK-LABEL: @example -// CHECK: tail call void @bar(), !dbg [[DBG_ID:![0-9]+]] -// CHECK: [[DBG_ID]] = !DILocation(line: 7, -// CHECK-SAME: inlinedAt: [[INLINE_ID:![0-9]+]]) -// CHECK: [[INLINE_ID]] = !DILocation(line: 18, diff --git a/src/test/codegen/mir_zst_stores.rs b/src/test/codegen/mir_zst_stores.rs deleted file mode 100644 index 17e7ba309..000000000 --- a/src/test/codegen/mir_zst_stores.rs +++ /dev/null @@ -1,17 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -use std::marker::PhantomData; - -#[derive(Copy, Clone)] -struct Zst { phantom: PhantomData<Zst> } - -// CHECK-LABEL: @mir -// CHECK-NOT: store{{.*}}undef -#[no_mangle] -pub fn mir() { - let x = Zst { phantom: PhantomData }; - let y = (x, 0); - drop(y); - drop((0, x)); -} diff --git a/src/test/codegen/naked-functions.rs b/src/test/codegen/naked-functions.rs deleted file mode 100644 index 51c7a0c61..000000000 --- a/src/test/codegen/naked-functions.rs +++ /dev/null @@ -1,32 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// needs-asm-support -// only-x86_64 - -#![crate_type = "lib"] -#![feature(naked_functions)] -use std::arch::asm; - -// CHECK: Function Attrs: naked -// CHECK-NEXT: define{{.*}}void @naked_empty() -#[no_mangle] -#[naked] -pub unsafe extern "C" fn naked_empty() { - // CHECK-NEXT: {{.+}}: - // CHECK-NEXT: call void asm - // CHECK-NEXT: unreachable - asm!("ret", - options(noreturn)); -} - -// CHECK: Function Attrs: naked -// CHECK-NEXT: define{{.*}}i{{[0-9]+}} @naked_with_args_and_return(i64 %a, i64 %b) -#[no_mangle] -#[naked] -pub unsafe extern "C" fn naked_with_args_and_return(a: isize, b: isize) -> isize { - // CHECK-NEXT: {{.+}}: - // CHECK-NEXT: call void asm - // CHECK-NEXT: unreachable - asm!("lea rax, [rdi + rsi]", - "ret", - options(noreturn)); -} diff --git a/src/test/codegen/naked-nocoverage.rs b/src/test/codegen/naked-nocoverage.rs deleted file mode 100644 index 91a6260bf..000000000 --- a/src/test/codegen/naked-nocoverage.rs +++ /dev/null @@ -1,19 +0,0 @@ -// Checks that naked functions are not instrumented by -Cinstrument-coverage. -// Regression test for issue #105170. -// -// needs-asm-support -// needs-profiler-support -// compile-flags: -Cinstrument-coverage -#![crate_type = "lib"] -#![feature(naked_functions)] -use std::arch::asm; - -#[naked] -#[no_mangle] -pub unsafe extern "C" fn f() { - // CHECK: define void @f() - // CHECK-NEXT: start: - // CHECK-NEXT: call void asm - // CHECK-NEXT: unreachable - asm!("", options(noreturn)); -} diff --git a/src/test/codegen/naked-noinline.rs b/src/test/codegen/naked-noinline.rs deleted file mode 100644 index c0ac69f4e..000000000 --- a/src/test/codegen/naked-noinline.rs +++ /dev/null @@ -1,31 +0,0 @@ -// Checks that naked functions are never inlined. -// compile-flags: -O -Zmir-opt-level=3 -// needs-asm-support -// ignore-wasm32 -#![crate_type = "lib"] -#![feature(naked_functions)] - -use std::arch::asm; - -#[naked] -#[no_mangle] -pub unsafe extern "C" fn f() { - // Check that f has naked and noinline attributes. - // - // CHECK: define void @f() unnamed_addr [[ATTR:#[0-9]+]] - // CHECK-NEXT: start: - // CHECK-NEXT: call void asm - asm!("", options(noreturn)); -} - -#[no_mangle] -pub unsafe fn g() { - // Check that call to f is not inlined. - // - // CHECK-LABEL: define void @g() - // CHECK-NEXT: start: - // CHECK-NEXT: call void @f() - f(); -} - -// CHECK: attributes [[ATTR]] = { naked{{.*}}noinline{{.*}} } diff --git a/src/test/codegen/no-assumes-on-casts.rs b/src/test/codegen/no-assumes-on-casts.rs deleted file mode 100644 index b5cfa2775..000000000 --- a/src/test/codegen/no-assumes-on-casts.rs +++ /dev/null @@ -1,19 +0,0 @@ -#![crate_type = "lib"] - -// compile-flags: -Cno-prepopulate-passes - -// CHECK-LABEL: fna -#[no_mangle] -pub fn fna(a: i16) -> i32 { - a as i32 -// CHECK-NOT: assume -// CHECK: sext -} - -// CHECK-LABEL: fnb -#[no_mangle] -pub fn fnb(a: u16) -> u32 { - a as u32 -// CHECK-NOT: assume -// CHECK: zext -} diff --git a/src/test/codegen/no-dllimport-w-cross-lang-lto.rs b/src/test/codegen/no-dllimport-w-cross-lang-lto.rs deleted file mode 100644 index 33fc2bc15..000000000 --- a/src/test/codegen/no-dllimport-w-cross-lang-lto.rs +++ /dev/null @@ -1,13 +0,0 @@ -// This test makes sure that functions get annotated with the proper -// "target-cpu" attribute in LLVM. - -// no-prefer-dynamic -// only-msvc -// compile-flags: -C linker-plugin-lto - -#![crate_type = "rlib"] - -// CHECK-NOT: @{{.*}}__imp_{{.*}}GLOBAL{{.*}} = global i8* - -pub static GLOBAL: u32 = 0; -pub static mut GLOBAL2: u32 = 0; diff --git a/src/test/codegen/no-plt.rs b/src/test/codegen/no-plt.rs deleted file mode 100644 index b36e9ae88..000000000 --- a/src/test/codegen/no-plt.rs +++ /dev/null @@ -1,17 +0,0 @@ -// compile-flags: -C relocation-model=pic -Z plt=no - -#![crate_type = "lib"] - -// We need a function which is normally called through the PLT. -extern "C" { - // CHECK: Function Attrs:{{.*}}nonlazybind - fn getenv(name: *const u8) -> *mut u8; -} - -// Ensure the function gets referenced. -pub unsafe fn call_through_plt() -> *mut u8 { - getenv(b"\0".as_ptr()) -} - -// Ensure intrinsics also skip the PLT -// CHECK: !"RtLibUseGOT" diff --git a/src/test/codegen/noalias-box-off.rs b/src/test/codegen/noalias-box-off.rs deleted file mode 100644 index afd17c7c1..000000000 --- a/src/test/codegen/noalias-box-off.rs +++ /dev/null @@ -1,8 +0,0 @@ -// compile-flags: -O -Z box-noalias=no - -#![crate_type = "lib"] - -// CHECK-LABEL: @box_should_not_have_noalias_if_disabled( -// CHECK-NOT: noalias -#[no_mangle] -pub fn box_should_not_have_noalias_if_disabled(_b: Box<u8>) {} diff --git a/src/test/codegen/noalias-box.rs b/src/test/codegen/noalias-box.rs deleted file mode 100644 index a3d1f093d..000000000 --- a/src/test/codegen/noalias-box.rs +++ /dev/null @@ -1,8 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @box_should_have_noalias_by_default( -// CHECK: noalias -#[no_mangle] -pub fn box_should_have_noalias_by_default(_b: Box<u8>) {} diff --git a/src/test/codegen/noalias-refcell.rs b/src/test/codegen/noalias-refcell.rs deleted file mode 100644 index dba73937a..000000000 --- a/src/test/codegen/noalias-refcell.rs +++ /dev/null @@ -1,14 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes -Z mutable-noalias=yes - -#![crate_type = "lib"] - -use std::cell::{Ref, RefCell, RefMut}; - -// Make sure that none of the arguments get a `noalias` attribute, because -// the `RefCell` might alias writes after either `Ref`/`RefMut` is dropped. - -// CHECK-LABEL: @maybe_aliased( -// CHECK-NOT: noalias -// CHECK-SAME: %_refcell -#[no_mangle] -pub unsafe fn maybe_aliased(_: Ref<'_, i32>, _: RefMut<'_, i32>, _refcell: &RefCell<i32>) {} diff --git a/src/test/codegen/noalias-rwlockreadguard.rs b/src/test/codegen/noalias-rwlockreadguard.rs deleted file mode 100644 index 7f7b46c85..000000000 --- a/src/test/codegen/noalias-rwlockreadguard.rs +++ /dev/null @@ -1,14 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes -Z mutable-noalias=yes - -#![crate_type = "lib"] - -use std::sync::{RwLock, RwLockReadGuard}; - -// Make sure that `RwLockReadGuard` does not get a `noalias` attribute, because -// the `RwLock` might alias writes after it is dropped. - -// CHECK-LABEL: @maybe_aliased( -// CHECK-NOT: noalias -// CHECK-SAME: %_data -#[no_mangle] -pub unsafe fn maybe_aliased(_: RwLockReadGuard<'_, i32>, _data: &RwLock<i32>) {} diff --git a/src/test/codegen/noalias-unpin.rs b/src/test/codegen/noalias-unpin.rs deleted file mode 100644 index 8ca9b98ee..000000000 --- a/src/test/codegen/noalias-unpin.rs +++ /dev/null @@ -1,15 +0,0 @@ -// compile-flags: -O -Z mutable-noalias=yes - -#![crate_type = "lib"] - -pub struct SelfRef { - self_ref: *mut SelfRef, - _pin: std::marker::PhantomPinned -} - -// CHECK-LABEL: @test_self_ref( -// CHECK-NOT: noalias -#[no_mangle] -pub unsafe fn test_self_ref(s: &mut SelfRef) { - (*s.self_ref).self_ref = std::ptr::null_mut(); -} diff --git a/src/test/codegen/non-terminate/infinite-loop-1.rs b/src/test/codegen/non-terminate/infinite-loop-1.rs deleted file mode 100644 index fa9c66b47..000000000 --- a/src/test/codegen/non-terminate/infinite-loop-1.rs +++ /dev/null @@ -1,17 +0,0 @@ -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] - -fn infinite_loop() -> u8 { - loop {} -} - -// CHECK-LABEL: @test -#[no_mangle] -fn test() -> u8 { - // CHECK-NOT: unreachable - // CHECK: br label %{{.+}} - // CHECK-NOT: unreachable - let x = infinite_loop(); - x -} diff --git a/src/test/codegen/non-terminate/infinite-loop-2.rs b/src/test/codegen/non-terminate/infinite-loop-2.rs deleted file mode 100644 index 81d62ab33..000000000 --- a/src/test/codegen/non-terminate/infinite-loop-2.rs +++ /dev/null @@ -1,19 +0,0 @@ -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] - -fn infinite_loop() -> u8 { - let i = 2; - while i > 1 {} - 1 -} - -// CHECK-LABEL: @test -#[no_mangle] -fn test() -> u8 { - // CHECK-NOT: unreachable - // CHECK: br label %{{.+}} - // CHECK-NOT: unreachable - let x = infinite_loop(); - x -} diff --git a/src/test/codegen/non-terminate/infinite-recursion.rs b/src/test/codegen/non-terminate/infinite-recursion.rs deleted file mode 100644 index 6d1f2d4bf..000000000 --- a/src/test/codegen/non-terminate/infinite-recursion.rs +++ /dev/null @@ -1,14 +0,0 @@ -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] - -#![allow(unconditional_recursion)] - -// CHECK-LABEL: @infinite_recursion -#[no_mangle] -fn infinite_recursion() -> u8 { - // CHECK-NOT: ret i8 undef - // CHECK: br label %{{.+}} - // CHECK-NOT: ret i8 undef - infinite_recursion() -} diff --git a/src/test/codegen/non-terminate/nonempty-infinite-loop.rs b/src/test/codegen/non-terminate/nonempty-infinite-loop.rs deleted file mode 100644 index 5e25e04fc..000000000 --- a/src/test/codegen/non-terminate/nonempty-infinite-loop.rs +++ /dev/null @@ -1,28 +0,0 @@ -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] - -// Verify that we don't miscompile this even if rustc didn't apply the trivial loop detection to -// insert the sideeffect intrinsic. - -fn infinite_loop() -> u8 { - let mut x = 0; - // CHECK-NOT: sideeffect - loop { - if x == 42 { - x = 0; - } else { - x = 42; - } - } -} - -// CHECK-LABEL: @test -#[no_mangle] -fn test() -> u8 { - // CHECK-NOT: unreachable - // CHECK: br label %{{.+}} - // CHECK-NOT: unreachable - let x = infinite_loop(); - x -} diff --git a/src/test/codegen/noreturn-uninhabited.rs b/src/test/codegen/noreturn-uninhabited.rs deleted file mode 100644 index 49f93cf62..000000000 --- a/src/test/codegen/noreturn-uninhabited.rs +++ /dev/null @@ -1,31 +0,0 @@ -// compile-flags: -g -C no-prepopulate-passes - -#![crate_type = "lib"] - -#[derive(Clone, Copy)] -pub enum EmptyEnum {} - -#[no_mangle] -pub fn empty(x: &EmptyEnum) -> EmptyEnum { - // CHECK: @empty({{.*}}) unnamed_addr #0 - // CHECK-NOT: ret void - // CHECK: call void @llvm.trap() - // CHECK: unreachable - *x -} - -pub struct Foo(String, EmptyEnum); - -#[no_mangle] -pub fn foo(x: String, y: &EmptyEnum) -> Foo { - // CHECK: @foo({{.*}}) unnamed_addr #0 - // CHECK-NOT: ret %Foo - // CHECK: call void @llvm.trap() - // CHECK: unreachable - Foo(x, *y) -} - -// CHECK: attributes #0 = {{{.*}} noreturn {{.*}}} - -// CHECK: DISubprogram(name: "empty", {{.*}} DIFlagNoReturn -// CHECK: DISubprogram(name: "foo", {{.*}} DIFlagNoReturn diff --git a/src/test/codegen/noreturnflag.rs b/src/test/codegen/noreturnflag.rs deleted file mode 100644 index 95c100571..000000000 --- a/src/test/codegen/noreturnflag.rs +++ /dev/null @@ -1,22 +0,0 @@ -// compile-flags: -g -C no-prepopulate-passes - -#![crate_type = "lib"] - -#[no_mangle] -pub fn foo() -> ! { -// CHECK: @foo() unnamed_addr #0 - loop {} -} - -pub enum EmptyEnum {} - -#[no_mangle] -pub fn bar() -> EmptyEnum { -// CHECK: @bar() unnamed_addr #0 - loop {} -} - -// CHECK: attributes #0 = {{{.*}} noreturn {{.*}}} - -// CHECK: DISubprogram(name: "foo", {{.*}} DIFlagNoReturn -// CHECK: DISubprogram(name: "bar", {{.*}} DIFlagNoReturn diff --git a/src/test/codegen/nounwind.rs b/src/test/codegen/nounwind.rs deleted file mode 100644 index f639c60b8..000000000 --- a/src/test/codegen/nounwind.rs +++ /dev/null @@ -1,16 +0,0 @@ -// aux-build:nounwind.rs -// compile-flags: -C no-prepopulate-passes -C panic=abort -C metadata=a -// ignore-windows -// ignore-android - -#![crate_type = "lib"] - -extern crate nounwind; - -#[no_mangle] -pub fn foo() { - nounwind::bar(); -// CHECK: @foo() unnamed_addr #0 -// CHECK: @bar() unnamed_addr #0 -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -} diff --git a/src/test/codegen/nrvo.rs b/src/test/codegen/nrvo.rs deleted file mode 100644 index fddb0d1fb..000000000 --- a/src/test/codegen/nrvo.rs +++ /dev/null @@ -1,17 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// Ensure that we do not call `memcpy` for the following function. -// `memset` and `init` should be called directly on the return pointer. -#[no_mangle] -pub fn nrvo(init: fn(&mut [u8; 4096])) -> [u8; 4096] { - // CHECK-LABEL: nrvo - // CHECK: @llvm.memset - // CHECK-NOT: @llvm.memcpy - // CHECK: ret - // CHECK-EMPTY - let mut buf = [0; 4096]; - init(&mut buf); - buf -} diff --git a/src/test/codegen/optimize-attr-1.rs b/src/test/codegen/optimize-attr-1.rs deleted file mode 100644 index 22abe06e7..000000000 --- a/src/test/codegen/optimize-attr-1.rs +++ /dev/null @@ -1,50 +0,0 @@ -// revisions: NO-OPT SIZE-OPT SPEED-OPT -//[NO-OPT] compile-flags: -Copt-level=0 -Ccodegen-units=1 -//[SIZE-OPT] compile-flags: -Copt-level=s -Ccodegen-units=1 -//[SPEED-OPT] compile-flags: -Copt-level=3 -Ccodegen-units=1 - -#![feature(optimize_attribute)] -#![crate_type="rlib"] - -// CHECK-LABEL: define{{.*}}i32 @nothing -// CHECK-SAME: [[NOTHING_ATTRS:#[0-9]+]] -// NO-OPT: ret i32 4 -// SIZE-OPT: ret i32 4 -// SPEEC-OPT: ret i32 4 -#[no_mangle] -pub fn nothing() -> i32 { - 2 + 2 -} - -// CHECK-LABEL: define{{.*}}i32 @size -// CHECK-SAME: [[SIZE_ATTRS:#[0-9]+]] -// NO-OPT: ret i32 6 -// SIZE-OPT: ret i32 6 -// SPEED-OPT: ret i32 6 -#[optimize(size)] -#[no_mangle] -pub fn size() -> i32 { - 3 + 3 -} - -// CHECK-LABEL: define{{.*}}i32 @speed -// NO-OPT-SAME: [[NOTHING_ATTRS]] -// SPEED-OPT-SAME: [[NOTHING_ATTRS]] -// SIZE-OPT-SAME: [[SPEED_ATTRS:#[0-9]+]] -// NO-OPT: ret i32 8 -// SIZE-OPT: ret i32 8 -// SPEED-OPT: ret i32 8 -#[optimize(speed)] -#[no_mangle] -pub fn speed() -> i32 { - 4 + 4 -} - -// NO-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}} -// SPEED-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}} -// SIZE-OPT-DAG: attributes [[NOTHING_ATTRS]] = {{.*}}optsize{{.*}} -// SIZE-OPT-DAG: attributes [[SIZE_ATTRS]] = {{.*}}minsize{{.*}}optsize{{.*}} - -// SIZE-OPT: attributes [[SPEED_ATTRS]] -// SIZE-OPT-NOT: minsize -// SIZE-OPT-NOT: optsize diff --git a/src/test/codegen/option-nonzero-eq.rs b/src/test/codegen/option-nonzero-eq.rs deleted file mode 100644 index 598dcc19b..000000000 --- a/src/test/codegen/option-nonzero-eq.rs +++ /dev/null @@ -1,34 +0,0 @@ -// compile-flags: -O -Zmerge-functions=disabled - -#![crate_type = "lib"] - -extern crate core; -use core::num::{NonZeroU32, NonZeroI64}; -use core::ptr::NonNull; - -// CHECK-lABEL: @non_zero_eq -#[no_mangle] -pub fn non_zero_eq(l: Option<NonZeroU32>, r: Option<NonZeroU32>) -> bool { - // CHECK: start: - // CHECK-NEXT: icmp eq i32 - // CHECK-NEXT: ret i1 - l == r -} - -// CHECK-lABEL: @non_zero_signed_eq -#[no_mangle] -pub fn non_zero_signed_eq(l: Option<NonZeroI64>, r: Option<NonZeroI64>) -> bool { - // CHECK: start: - // CHECK-NEXT: icmp eq i64 - // CHECK-NEXT: ret i1 - l == r -} - -// CHECK-lABEL: @non_null_eq -#[no_mangle] -pub fn non_null_eq(l: Option<NonNull<u8>>, r: Option<NonNull<u8>>) -> bool { - // CHECK: start: - // CHECK-NEXT: icmp eq {{(i8\*|ptr)}} - // CHECK-NEXT: ret i1 - l == r -} diff --git a/src/test/codegen/packed.rs b/src/test/codegen/packed.rs deleted file mode 100644 index fd63b4f0a..000000000 --- a/src/test/codegen/packed.rs +++ /dev/null @@ -1,153 +0,0 @@ -// -// compile-flags: -O -C no-prepopulate-passes - -#![crate_type = "lib"] - -#[repr(packed)] -pub struct Packed1 { - dealign: u8, - data: u32 -} - -#[repr(packed(2))] -pub struct Packed2 { - dealign: u8, - data: u32 -} - -// CHECK-LABEL: @write_pkd1 -#[no_mangle] -pub fn write_pkd1(pkd: &mut Packed1) -> u32 { -// CHECK: %{{.*}} = load i32, {{i32\*|ptr}} %{{.*}}, align 1 -// CHECK: store i32 42, {{i32\*|ptr}} %{{.*}}, align 1 - let result = pkd.data; - pkd.data = 42; - result -} - -// CHECK-LABEL: @write_pkd2 -#[no_mangle] -pub fn write_pkd2(pkd: &mut Packed2) -> u32 { -// CHECK: %{{.*}} = load i32, {{i32\*|ptr}} %{{.*}}, align 2 -// CHECK: store i32 42, {{i32\*|ptr}} %{{.*}}, align 2 - let result = pkd.data; - pkd.data = 42; - result -} - -pub struct Array([i32; 8]); -#[repr(packed)] -pub struct BigPacked1 { - dealign: u8, - data: Array -} - -#[repr(packed(2))] -pub struct BigPacked2 { - dealign: u8, - data: Array -} - -// CHECK-LABEL: @call_pkd1 -#[no_mangle] -pub fn call_pkd1(f: fn() -> Array) -> BigPacked1 { -// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array -// CHECK: call void %{{.*}}({{%Array\*|ptr}} noalias nocapture noundef sret{{.*}} dereferenceable(32) [[ALLOCA]]) -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false) - // check that calls whose destination is a field of a packed struct - // go through an alloca rather than calling the function with an - // unaligned destination. - BigPacked1 { dealign: 0, data: f() } -} - -// CHECK-LABEL: @call_pkd2 -#[no_mangle] -pub fn call_pkd2(f: fn() -> Array) -> BigPacked2 { -// CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array -// CHECK: call void %{{.*}}({{%Array\*|ptr}} noalias nocapture noundef sret{{.*}} dereferenceable(32) [[ALLOCA]]) -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 2 %{{.*}}, {{i8\*|ptr}} align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false) - // check that calls whose destination is a field of a packed struct - // go through an alloca rather than calling the function with an - // unaligned destination. - BigPacked2 { dealign: 0, data: f() } -} - -// CHECK-LABEL: @write_packed_array1 -// CHECK: store i32 0, {{i32\*|ptr}} %{{.+}}, align 1 -// CHECK: store i32 1, {{i32\*|ptr}} %{{.+}}, align 1 -// CHECK: store i32 2, {{i32\*|ptr}} %{{.+}}, align 1 -#[no_mangle] -pub fn write_packed_array1(p: &mut BigPacked1) { - p.data.0[0] = 0; - p.data.0[1] = 1; - p.data.0[2] = 2; -} - -// CHECK-LABEL: @write_packed_array2 -// CHECK: store i32 0, {{i32\*|ptr}} %{{.+}}, align 2 -// CHECK: store i32 1, {{i32\*|ptr}} %{{.+}}, align 2 -// CHECK: store i32 2, {{i32\*|ptr}} %{{.+}}, align 2 -#[no_mangle] -pub fn write_packed_array2(p: &mut BigPacked2) { - p.data.0[0] = 0; - p.data.0[1] = 1; - p.data.0[2] = 2; -} - -// CHECK-LABEL: @repeat_packed_array1 -// CHECK: store i32 42, {{i32\*|ptr}} %{{.+}}, align 1 -#[no_mangle] -pub fn repeat_packed_array1(p: &mut BigPacked1) { - p.data.0 = [42; 8]; -} - -// CHECK-LABEL: @repeat_packed_array2 -// CHECK: store i32 42, {{i32\*|ptr}} %{{.+}}, align 2 -#[no_mangle] -pub fn repeat_packed_array2(p: &mut BigPacked2) { - p.data.0 = [42; 8]; -} - -#[repr(packed)] -#[derive(Copy, Clone)] -pub struct Packed1Pair(u8, u32); - -#[repr(packed(2))] -#[derive(Copy, Clone)] -pub struct Packed2Pair(u8, u32); - -// CHECK-LABEL: @pkd1_pair -#[no_mangle] -pub fn pkd1_pair(pair1: &mut Packed1Pair, pair2: &mut Packed1Pair) { -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 1 %{{.*}}, i{{[0-9]+}} 5, i1 false) - *pair2 = *pair1; -} - -// CHECK-LABEL: @pkd2_pair -#[no_mangle] -pub fn pkd2_pair(pair1: &mut Packed2Pair, pair2: &mut Packed2Pair) { -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 2 %{{.*}}, {{i8\*|ptr}} align 2 %{{.*}}, i{{[0-9]+}} 6, i1 false) - *pair2 = *pair1; -} - -#[repr(packed)] -#[derive(Copy, Clone)] -pub struct Packed1NestedPair((u32, u32)); - -#[repr(packed(2))] -#[derive(Copy, Clone)] -pub struct Packed2NestedPair((u32, u32)); - -// CHECK-LABEL: @pkd1_nested_pair -#[no_mangle] -pub fn pkd1_nested_pair(pair1: &mut Packed1NestedPair, pair2: &mut Packed1NestedPair) { -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 %{{.*}}, {{i8\*|ptr}} align 1 %{{.*}}, i{{[0-9]+}} 8, i1 false) - *pair2 = *pair1; -} - -// CHECK-LABEL: @pkd2_nested_pair -#[no_mangle] -pub fn pkd2_nested_pair(pair1: &mut Packed2NestedPair, pair2: &mut Packed2NestedPair) { -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 2 %{{.*}}, {{i8\*|ptr}} align 2 %{{.*}}, i{{[0-9]+}} 8, i1 false) - *pair2 = *pair1; -} diff --git a/src/test/codegen/panic-abort-windows.rs b/src/test/codegen/panic-abort-windows.rs deleted file mode 100644 index 2ee29762d..000000000 --- a/src/test/codegen/panic-abort-windows.rs +++ /dev/null @@ -1,18 +0,0 @@ -// This test is for *-windows only. -// only-windows - -// compile-flags: -C no-prepopulate-passes -C panic=abort -O - -#![crate_type = "lib"] - -// CHECK: Function Attrs: nounwind uwtable -// CHECK-NEXT: define void @normal_uwtable() -#[no_mangle] -pub fn normal_uwtable() { -} - -// CHECK: Function Attrs: nounwind uwtable -// CHECK-NEXT: define void @extern_uwtable() -#[no_mangle] -pub extern fn extern_uwtable() { -} diff --git a/src/test/codegen/panic-in-drop-abort.rs b/src/test/codegen/panic-in-drop-abort.rs deleted file mode 100644 index 7a84484c4..000000000 --- a/src/test/codegen/panic-in-drop-abort.rs +++ /dev/null @@ -1,57 +0,0 @@ -// compile-flags: -Z panic-in-drop=abort -O -// ignore-msvc - -// Ensure that unwinding code paths are eliminated from the output after -// optimization. - -// This test uses ignore-msvc, because the expected optimization does not happen on targets using -// SEH exceptions with the new LLVM pass manager anymore, see -// https://github.com/llvm/llvm-project/issues/51311. - -// CHECK-NOT: {{(call|invoke).*}}should_not_appear_in_output - -#![crate_type = "lib"] -use std::any::Any; -use std::mem::forget; - -pub struct ExternDrop; -impl Drop for ExternDrop { - #[inline(always)] - fn drop(&mut self) { - // This call may potentially unwind. - extern "Rust" { - fn extern_drop(); - } - unsafe { - extern_drop(); - } - } -} - -struct AssertNeverDrop; -impl Drop for AssertNeverDrop { - #[inline(always)] - fn drop(&mut self) { - // This call should be optimized away as unreachable. - extern "C" { - fn should_not_appear_in_output(); - } - unsafe { - should_not_appear_in_output(); - } - } -} - -#[no_mangle] -pub fn normal_drop(x: ExternDrop) { - let guard = AssertNeverDrop; - drop(x); - forget(guard); -} - -#[no_mangle] -pub fn indirect_drop(x: Box<dyn Any>) { - let guard = AssertNeverDrop; - drop(x); - forget(guard); -} diff --git a/src/test/codegen/panic-unwind-default-uwtable.rs b/src/test/codegen/panic-unwind-default-uwtable.rs deleted file mode 100644 index 4c85008cf..000000000 --- a/src/test/codegen/panic-unwind-default-uwtable.rs +++ /dev/null @@ -1,6 +0,0 @@ -// compile-flags: -C panic=unwind -C no-prepopulate-passes - -#![crate_type = "lib"] - -// CHECK: attributes #{{.*}} uwtable -pub fn foo() {} diff --git a/src/test/codegen/personality_lifetimes.rs b/src/test/codegen/personality_lifetimes.rs deleted file mode 100644 index 2104022f5..000000000 --- a/src/test/codegen/personality_lifetimes.rs +++ /dev/null @@ -1,32 +0,0 @@ -// ignore-msvc -// ignore-wasm32-bare compiled with panic=abort by default - -// compile-flags: -O -C no-prepopulate-passes - -#![crate_type="lib"] - -struct S; - -impl Drop for S { - fn drop(&mut self) { - } -} - -fn might_unwind() { -} - -// CHECK-LABEL: @test -#[no_mangle] -pub fn test() { - let _s = S; - // Check that the personality slot alloca gets a lifetime start in each cleanup block, not just - // in the first one. - // CHECK: [[SLOT:%[0-9]+]] = alloca { {{i8\*|ptr}}, i32 } - // CHECK-LABEL: cleanup: - // CHECK: call void @llvm.lifetime.start.{{.*}}({{.*}}) - // CHECK-LABEL: cleanup1: - // CHECK: call void @llvm.lifetime.start.{{.*}}({{.*}}) - might_unwind(); - let _t = S; - might_unwind(); -} diff --git a/src/test/codegen/pgo-instrumentation.rs b/src/test/codegen/pgo-instrumentation.rs deleted file mode 100644 index 05c2d2fc0..000000000 --- a/src/test/codegen/pgo-instrumentation.rs +++ /dev/null @@ -1,22 +0,0 @@ -// Test that `-Cprofile-generate` creates expected instrumentation artifacts in LLVM IR. - -// needs-profiler-support -// compile-flags: -Cprofile-generate -Ccodegen-units=1 - -// CHECK: @__llvm_profile_raw_version = -// CHECK-DAG: @__profc_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = {{.*}}global -// CHECK-DAG: @__profd_{{.*}}pgo_instrumentation{{.*}}some_function{{.*}} = {{.*}}global -// CHECK-DAG: @__profc_{{.*}}pgo_instrumentation{{.*}}some_other_function{{.*}} = {{.*}}global -// CHECK-DAG: @__profd_{{.*}}pgo_instrumentation{{.*}}some_other_function{{.*}} = {{.*}}global -// CHECK: @__llvm_profile_filename = {{.*}}"default_%m.profraw\00"{{.*}} - -#![crate_type="lib"] - -#[inline(never)] -fn some_function() { - -} - -pub fn some_other_function() { - some_function(); -} diff --git a/src/test/codegen/pic-relocation-model.rs b/src/test/codegen/pic-relocation-model.rs deleted file mode 100644 index 602a08067..000000000 --- a/src/test/codegen/pic-relocation-model.rs +++ /dev/null @@ -1,19 +0,0 @@ -// compile-flags: -C relocation-model=pic - -#![crate_type = "rlib"] - -// CHECK: define i8 @call_foreign_fn() -#[no_mangle] -pub fn call_foreign_fn() -> u8 { - unsafe { - foreign_fn() - } -} - -// (Allow but do not require `zeroext` here, because it is not worth effort to -// spell out which targets have it and which ones do not; see rust#97800.) - -// CHECK: declare{{( zeroext)?}} i8 @foreign_fn() -extern "C" {fn foreign_fn() -> u8;} - -// CHECK: !{i32 {{[78]}}, !"PIC Level", i32 2} diff --git a/src/test/codegen/pie-relocation-model.rs b/src/test/codegen/pie-relocation-model.rs deleted file mode 100644 index ec44edc06..000000000 --- a/src/test/codegen/pie-relocation-model.rs +++ /dev/null @@ -1,22 +0,0 @@ -// compile-flags: -C relocation-model=pie -// only-x86_64-unknown-linux-gnu - -#![crate_type = "rlib"] - -// With PIE we know local functions cannot be interpositioned, we can mark them -// as dso_local. -// CHECK: define dso_local i8 @call_foreign_fn() -#[no_mangle] -pub fn call_foreign_fn() -> u8 { - unsafe { - foreign_fn() - } -} - -// External functions are still marked as non-dso_local, since we don't know if the symbol -// is defined in the binary or in the shared library. -// CHECK: declare zeroext i8 @foreign_fn() -extern "C" {fn foreign_fn() -> u8;} - -// CHECK: !{i32 {{[78]}}, !"PIC Level", i32 2} -// CHECK: !{i32 7, !"PIE Level", i32 2} diff --git a/src/test/codegen/refs.rs b/src/test/codegen/refs.rs deleted file mode 100644 index 0b796754d..000000000 --- a/src/test/codegen/refs.rs +++ /dev/null @@ -1,23 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -Zmir-opt-level=0 - -#![crate_type = "lib"] - -// Hack to get the correct size for the length part in slices -// CHECK: @helper([[USIZE:i[0-9]+]] %_1) -#[no_mangle] -pub fn helper(_: usize) { -} - -// CHECK-LABEL: @ref_dst -#[no_mangle] -pub fn ref_dst(s: &[u8]) { - // We used to generate an extra alloca and memcpy to ref the dst, so check that we copy - // directly to the alloca for "x" -// CHECK: [[X0:%[0-9]+]] = getelementptr inbounds { {{\[0 x i8\]\*|ptr}}, [[USIZE]] }, {{.*}} %x, i32 0, i32 0 -// CHECK: store {{\[0 x i8\]\*|ptr}} %s.0, {{.*}} [[X0]] -// CHECK: [[X1:%[0-9]+]] = getelementptr inbounds { {{\[0 x i8\]\*|ptr}}, [[USIZE]] }, {{.*}} %x, i32 0, i32 1 -// CHECK: store [[USIZE]] %s.1, {{.*}} [[X1]] - - let x = &*s; - &x; // keep variable in an alloca -} diff --git a/src/test/codegen/remap_path_prefix/aux_mod.rs b/src/test/codegen/remap_path_prefix/aux_mod.rs deleted file mode 100644 index 44cc4bb72..000000000 --- a/src/test/codegen/remap_path_prefix/aux_mod.rs +++ /dev/null @@ -1,6 +0,0 @@ -// ignore-test: this is not a test - -#[inline] -pub fn some_aux_mod_function() -> i32 { - 1234 -} diff --git a/src/test/codegen/remap_path_prefix/auxiliary/remap_path_prefix_aux.rs b/src/test/codegen/remap_path_prefix/auxiliary/remap_path_prefix_aux.rs deleted file mode 100644 index 887915955..000000000 --- a/src/test/codegen/remap_path_prefix/auxiliary/remap_path_prefix_aux.rs +++ /dev/null @@ -1,8 +0,0 @@ -// - -// compile-flags: -g --remap-path-prefix={{cwd}}=/the/aux-cwd --remap-path-prefix={{src-base}}/remap_path_prefix/auxiliary=/the/aux-src - -#[inline] -pub fn some_aux_function() -> i32 { - 1234 -} diff --git a/src/test/codegen/remap_path_prefix/auxiliary/xcrate-generic.rs b/src/test/codegen/remap_path_prefix/auxiliary/xcrate-generic.rs deleted file mode 100644 index 59092dbf6..000000000 --- a/src/test/codegen/remap_path_prefix/auxiliary/xcrate-generic.rs +++ /dev/null @@ -1,6 +0,0 @@ -// -// compile-flags: -g --remap-path-prefix={{cwd}}=/the/aux-cwd --remap-path-prefix={{src-base}}/remap_path_prefix/auxiliary=/the/aux-src - -#![crate_type = "lib"] - -pub fn foo<T>() {} diff --git a/src/test/codegen/remap_path_prefix/issue-73167-remap-std.rs b/src/test/codegen/remap_path_prefix/issue-73167-remap-std.rs deleted file mode 100644 index b66abc6be..000000000 --- a/src/test/codegen/remap_path_prefix/issue-73167-remap-std.rs +++ /dev/null @@ -1,15 +0,0 @@ -// ignore-windows - -// compile-flags: -g -C no-prepopulate-passes -Z simulate-remapped-rust-src-base=/rustc/xyz - -// Here we check that importing std will not cause real path to std source files -// to leak. If rustc was compiled with remap-debuginfo = true, this should be -// true automatically. If paths to std library hasn't been remapped, we use the -// above simulate-remapped-rust-src-base option to do it temporarily - -// CHECK: !DIFile(filename: "{{/rustc/.*/library/std/src/panic.rs}}" -fn main() { - std::thread::spawn(|| { - println!("hello"); - }); -} diff --git a/src/test/codegen/remap_path_prefix/main.rs b/src/test/codegen/remap_path_prefix/main.rs deleted file mode 100644 index 9bef743dd..000000000 --- a/src/test/codegen/remap_path_prefix/main.rs +++ /dev/null @@ -1,28 +0,0 @@ -// ignore-windows -// - -// compile-flags: -g -C no-prepopulate-passes --remap-path-prefix={{cwd}}=/the/cwd --remap-path-prefix={{src-base}}=/the/src -Zinline-mir=no -// aux-build:remap_path_prefix_aux.rs - -extern crate remap_path_prefix_aux; - -// Here we check that submodules and include files are found using the path without -// remapping. This test requires that rustc is called with an absolute path. -mod aux_mod; -include!("aux_mod.rs"); - -// Here we check that the expansion of the file!() macro is mapped. -// CHECK: @alloc2 = private unnamed_addr constant <{ [34 x i8] }> <{ [34 x i8] c"/the/src/remap_path_prefix/main.rs" }>, align 1 -pub static FILE_PATH: &'static str = file!(); - -fn main() { - remap_path_prefix_aux::some_aux_function(); - aux_mod::some_aux_mod_function(); - some_aux_mod_function(); -} - -// Here we check that local debuginfo is mapped correctly. -// CHECK: !DIFile(filename: "/the/src/remap_path_prefix/main.rs", directory: "" - -// And here that debuginfo from other crates are expanded to absolute paths. -// CHECK: !DIFile(filename: "/the/aux-src/remap_path_prefix_aux.rs", directory: "" diff --git a/src/test/codegen/remap_path_prefix/xcrate-generic.rs b/src/test/codegen/remap_path_prefix/xcrate-generic.rs deleted file mode 100644 index 7a9d2ca9b..000000000 --- a/src/test/codegen/remap_path_prefix/xcrate-generic.rs +++ /dev/null @@ -1,14 +0,0 @@ -// ignore-windows -// compile-flags: -g -C metadata=foo -C no-prepopulate-passes -// aux-build:xcrate-generic.rs - -#![crate_type = "lib"] - -extern crate xcrate_generic; - -pub fn foo() { - xcrate_generic::foo::<u32>(); -} - -// Here we check that local debuginfo is mapped correctly. -// CHECK: !DIFile(filename: "/the/aux-src/xcrate-generic.rs", directory: "" diff --git a/src/test/codegen/repeat-trusted-len.rs b/src/test/codegen/repeat-trusted-len.rs deleted file mode 100644 index 87c8fe135..000000000 --- a/src/test/codegen/repeat-trusted-len.rs +++ /dev/null @@ -1,20 +0,0 @@ -// compile-flags: -O -// - -#![crate_type = "lib"] - -use std::iter; - -// CHECK-LABEL: @repeat_take_collect -#[no_mangle] -pub fn repeat_take_collect() -> Vec<u8> { -// CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}align 1{{.*}} %{{[0-9]+}}, i8 42, i{{[0-9]+}} 100000, i1 false) - iter::repeat(42).take(100000).collect() -} - -// CHECK-LABEL: @repeat_with_take_collect -#[no_mangle] -pub fn repeat_with_take_collect() -> Vec<u8> { -// CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}align 1{{.*}} %{{[0-9]+}}, i8 13, i{{[0-9]+}} 12345, i1 false) - iter::repeat_with(|| 13).take(12345).collect() -} diff --git a/src/test/codegen/repr-transparent-aggregates-1.rs b/src/test/codegen/repr-transparent-aggregates-1.rs deleted file mode 100644 index 9d18c5f03..000000000 --- a/src/test/codegen/repr-transparent-aggregates-1.rs +++ /dev/null @@ -1,86 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes -// - -// ignore-arm -// ignore-aarch64 -// ignore-mips -// ignore-mips64 -// ignore-powerpc -// ignore-powerpc64 -// ignore-riscv64 see codegen/riscv-abi -// ignore-windows -// See repr-transparent.rs - -#![feature(transparent_unions)] - -#![crate_type="lib"] - - -#[derive(Clone, Copy)] -#[repr(C)] -pub struct BigS([u32; 16]); - -#[repr(transparent)] -pub struct TsBigS(BigS); - -#[repr(transparent)] -pub union TuBigS { - field: BigS, -} - -#[repr(transparent)] -pub enum TeBigS { - Variant(BigS), -} - -// CHECK: define{{.*}}void @test_BigS({{%BigS\*|ptr}} [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], {{%BigS\*|ptr}} [[BIGS_ARG_ATTRS1:.*]] byval(%BigS) [[BIGS_ARG_ATTRS2:.*]]) -#[no_mangle] -pub extern "C" fn test_BigS(_: BigS) -> BigS { loop {} } - -// CHECK: define{{.*}}void @test_TsBigS({{%TsBigS\*|ptr}} [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], {{%TsBigS\*|ptr}} [[BIGS_ARG_ATTRS1]] byval(%TsBigS) [[BIGS_ARG_ATTRS2:.*]]) -#[no_mangle] -pub extern "C" fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} } - -// CHECK: define{{.*}}void @test_TuBigS({{%TuBigS\*|ptr}} [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], {{%TuBigS\*|ptr}} [[BIGS_ARG_ATTRS1]] byval(%TuBigS) [[BIGS_ARG_ATTRS2:.*]]) -#[no_mangle] -pub extern "C" fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} } - -// CHECK: define{{.*}}void @test_TeBigS({{%"TeBigS::Variant"\*|ptr}} [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], {{%"TeBigS::Variant"\*|ptr}} [[BIGS_ARG_ATTRS1]] byval(%"TeBigS::Variant") [[BIGS_ARG_ATTRS2]]) -#[no_mangle] -pub extern "C" fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} } - - -#[derive(Clone, Copy)] -#[repr(C)] -pub union BigU { - foo: [u32; 16], -} - -#[repr(transparent)] -pub struct TsBigU(BigU); - -#[repr(transparent)] -pub union TuBigU { - field: BigU, -} - -#[repr(transparent)] -pub enum TeBigU { - Variant(BigU), -} - -// CHECK: define{{.*}}void @test_BigU({{%BigU\*|ptr}} [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], {{%BigU\*|ptr}} [[BIGU_ARG_ATTRS1:.*]] byval(%BigU) [[BIGU_ARG_ATTRS2:.*]]) -#[no_mangle] -pub extern "C" fn test_BigU(_: BigU) -> BigU { loop {} } - -// CHECK: define{{.*}}void @test_TsBigU({{%TsBigU\*|ptr}} [[BIGU_RET_ATTRS1:.*]] sret(%TsBigU) [[BIGU_RET_ATTRS2:.*]], {{%TsBigU\*|ptr}} [[BIGU_ARG_ATTRS1]] byval(%TsBigU) [[BIGU_ARG_ATTRS2]]) -#[no_mangle] -pub extern "C" fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} } - -// CHECK: define{{.*}}void @test_TuBigU({{%TuBigU\*|ptr}} [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2:.*]], {{%TuBigU\*|ptr}} [[BIGU_ARG_ATTRS1]] byval(%TuBigU) [[BIGU_ARG_ATTRS2]]) -#[no_mangle] -pub extern "C" fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} } - -// CHECK: define{{.*}}void @test_TeBigU({{%"TeBigU::Variant"\*|ptr}} [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2:.*]], {{%"TeBigU::Variant"\*|ptr}} [[BIGU_ARG_ATTRS1]] byval(%"TeBigU::Variant") [[BIGU_ARG_ATTRS2]]) -#[no_mangle] -pub extern "C" fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} } diff --git a/src/test/codegen/repr-transparent-aggregates-2.rs b/src/test/codegen/repr-transparent-aggregates-2.rs deleted file mode 100644 index df7e88f08..000000000 --- a/src/test/codegen/repr-transparent-aggregates-2.rs +++ /dev/null @@ -1,90 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// - -// ignore-aarch64 -// ignore-emscripten -// ignore-mips64 -// ignore-powerpc -// ignore-powerpc64 -// ignore-powerpc64le -// ignore-riscv64 see codegen/riscv-abi -// ignore-s390x -// ignore-sparc -// ignore-sparc64 -// ignore-x86 -// ignore-x86_64 -// See repr-transparent.rs - -#![feature(transparent_unions)] - -#![crate_type="lib"] - - -#[derive(Clone, Copy)] -#[repr(C)] -pub struct BigS([u32; 16]); - -#[repr(transparent)] -pub struct TsBigS(BigS); - -#[repr(transparent)] -pub union TuBigS { - field: BigS, -} - -#[repr(transparent)] -pub enum TeBigS { - Variant(BigS), -} - -// CHECK: define void @test_BigS({{%BigS\*|ptr}} [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], [16 x i32] -#[no_mangle] -pub extern fn test_BigS(_: BigS) -> BigS { loop {} } - -// CHECK: define void @test_TsBigS({{%TsBigS\*|ptr}} [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], [16 x i32] -#[no_mangle] -pub extern fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} } - -// CHECK: define void @test_TuBigS({{%TuBigS\*|ptr}} [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], [16 x i32] -#[no_mangle] -pub extern fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} } - -// CHECK: define void @test_TeBigS({{%"TeBigS::Variant"\*|ptr}} [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], [16 x i32] -#[no_mangle] -pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} } - - -#[derive(Clone, Copy)] -#[repr(C)] -pub union BigU { - foo: [u32; 16], -} - -#[repr(transparent)] -pub struct TsBigU(BigU); - -#[repr(transparent)] -pub union TuBigU { - field: BigU, -} - -#[repr(transparent)] -pub enum TeBigU { - Variant(BigU), -} - -// CHECK: define void @test_BigU({{%BigU\*|ptr}} [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], [16 x i32] -#[no_mangle] -pub extern fn test_BigU(_: BigU) -> BigU { loop {} } - -// CHECK: define void @test_TsBigU({{%TsBigU\*|ptr}} [[BIGU_RET_ATTRS1]] sret(%TsBigU) [[BIGU_RET_ATTRS2]], [16 x i32] -#[no_mangle] -pub extern fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} } - -// CHECK: define void @test_TuBigU({{%TuBigU\*|ptr}} [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2]], [16 x i32] -#[no_mangle] -pub extern fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} } - -// CHECK: define void @test_TeBigU({{%"TeBigU::Variant"\*|ptr}} [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2]], [16 x i32] -#[no_mangle] -pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} } diff --git a/src/test/codegen/repr-transparent-aggregates-3.rs b/src/test/codegen/repr-transparent-aggregates-3.rs deleted file mode 100644 index 0db17e6b1..000000000 --- a/src/test/codegen/repr-transparent-aggregates-3.rs +++ /dev/null @@ -1,79 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// - -// only-mips64 -// See repr-transparent.rs - -#![feature(transparent_unions)] - -#![crate_type="lib"] - - -#[derive(Clone, Copy)] -#[repr(C)] -pub struct BigS([u32; 16]); - -#[repr(transparent)] -pub struct TsBigS(BigS); - -#[repr(transparent)] -pub union TuBigS { - field: BigS, -} - -#[repr(transparent)] -pub enum TeBigS { - Variant(BigS), -} - -// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], [8 x i64] -#[no_mangle] -pub extern fn test_BigS(_: BigS) -> BigS { loop {} } - -// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], [8 x i64] -#[no_mangle] -pub extern fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} } - -// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], [8 x i64] -#[no_mangle] -pub extern fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} } - -// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], [8 x i64] -#[no_mangle] -pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} } - - -#[derive(Clone, Copy)] -#[repr(C)] -pub union BigU { - foo: [u32; 16], -} - -#[repr(transparent)] -pub struct TsBigU(BigU); - -#[repr(transparent)] -pub union TuBigU { - field: BigU, -} - -#[repr(transparent)] -pub enum TeBigU { - Variant(BigU), -} - -// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], [8 x i64] -#[no_mangle] -pub extern fn test_BigU(_: BigU) -> BigU { loop {} } - -// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS1]] sret(%TsBigU) [[BIGU_RET_ATTRS2]], [8 x i64] -#[no_mangle] -pub extern fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} } - -// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2]], [8 x i64] -#[no_mangle] -pub extern fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} } - -// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2]], [8 x i64] -#[no_mangle] -pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} } diff --git a/src/test/codegen/repr-transparent-sysv64.rs b/src/test/codegen/repr-transparent-sysv64.rs deleted file mode 100644 index 886b0dd9e..000000000 --- a/src/test/codegen/repr-transparent-sysv64.rs +++ /dev/null @@ -1,28 +0,0 @@ -// only-x86_64 - -// compile-flags: -C no-prepopulate-passes - -#![crate_type="lib"] - -#[repr(C)] -pub struct Rgb8 { r: u8, g: u8, b: u8 } - -#[repr(transparent)] -pub struct Rgb8Wrap(Rgb8); - -// CHECK: i24 @test_Rgb8Wrap(i24{{( %0)?}}) -#[no_mangle] -pub extern "sysv64" fn test_Rgb8Wrap(_: Rgb8Wrap) -> Rgb8Wrap { loop {} } - -#[repr(C)] -pub union FloatBits { - float: f32, - bits: u32, -} - -#[repr(transparent)] -pub struct SmallUnion(FloatBits); - -// CHECK: i32 @test_SmallUnion(i32{{( %0)?}}) -#[no_mangle] -pub extern "sysv64" fn test_SmallUnion(_: SmallUnion) -> SmallUnion { loop {} } diff --git a/src/test/codegen/repr-transparent.rs b/src/test/codegen/repr-transparent.rs deleted file mode 100644 index c68ba8460..000000000 --- a/src/test/codegen/repr-transparent.rs +++ /dev/null @@ -1,169 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes - -// ignore-riscv64 riscv64 has an i128 type used with test_Vector -// see codegen/riscv-abi for riscv functiona call tests - -#![crate_type="lib"] -#![feature(repr_simd, transparent_unions)] - -use std::marker::PhantomData; - -#[derive(Copy, Clone)] -pub struct Zst1; -#[derive(Copy, Clone)] -pub struct Zst2(()); - -#[derive(Copy, Clone)] -#[repr(transparent)] -pub struct F32(f32); - -// CHECK: define{{.*}}float @test_F32(float %_1) -#[no_mangle] -pub extern "C" fn test_F32(_: F32) -> F32 { loop {} } - -#[repr(transparent)] -pub struct Ptr(*mut u8); - -// CHECK: define{{.*}}{{i8\*|ptr}} @test_Ptr({{i8\*|ptr}} %_1) -#[no_mangle] -pub extern "C" fn test_Ptr(_: Ptr) -> Ptr { loop {} } - -#[repr(transparent)] -pub struct WithZst(u64, Zst1); - -// CHECK: define{{.*}}i64 @test_WithZst(i64 %_1) -#[no_mangle] -pub extern "C" fn test_WithZst(_: WithZst) -> WithZst { loop {} } - -#[repr(transparent)] -pub struct WithZeroSizedArray(*const f32, [i8; 0]); - -// Apparently we use i32* when newtype-unwrapping f32 pointers. Whatever. -// CHECK: define{{.*}}{{i32\*|ptr}} @test_WithZeroSizedArray({{i32\*|ptr}} %_1) -#[no_mangle] -pub extern "C" fn test_WithZeroSizedArray(_: WithZeroSizedArray) -> WithZeroSizedArray { loop {} } - -#[repr(transparent)] -pub struct Generic<T>(T); - -// CHECK: define{{.*}}double @test_Generic(double %_1) -#[no_mangle] -pub extern "C" fn test_Generic(_: Generic<f64>) -> Generic<f64> { loop {} } - -#[repr(transparent)] -pub struct GenericPlusZst<T>(T, Zst2); - -#[repr(u8)] -pub enum Bool { True, False, FileNotFound } - -// CHECK: define{{( dso_local)?}} noundef{{( zeroext)?}} i8 @test_Gpz(i8 noundef{{( zeroext)?}} %_1) -#[no_mangle] -pub extern "C" fn test_Gpz(_: GenericPlusZst<Bool>) -> GenericPlusZst<Bool> { loop {} } - -#[repr(transparent)] -pub struct LifetimePhantom<'a, T: 'a>(*const T, PhantomData<&'a T>); - -// CHECK: define{{.*}}{{i16\*|ptr}} @test_LifetimePhantom({{i16\*|ptr}} %_1) -#[no_mangle] -pub extern "C" fn test_LifetimePhantom(_: LifetimePhantom<i16>) -> LifetimePhantom<i16> { loop {} } - -// This works despite current alignment resrictions because PhantomData is always align(1) -#[repr(transparent)] -pub struct UnitPhantom<T, U> { val: T, unit: PhantomData<U> } - -pub struct Px; - -// CHECK: define{{.*}}float @test_UnitPhantom(float %_1) -#[no_mangle] -pub extern "C" fn test_UnitPhantom(_: UnitPhantom<f32, Px>) -> UnitPhantom<f32, Px> { loop {} } - -#[repr(transparent)] -pub struct TwoZsts(Zst1, i8, Zst2); - -// CHECK: define{{( dso_local)?}}{{( signext)?}} i8 @test_TwoZsts(i8{{( signext)?}} %_1) -#[no_mangle] -pub extern "C" fn test_TwoZsts(_: TwoZsts) -> TwoZsts { loop {} } - -#[repr(transparent)] -pub struct Nested1(Zst2, Generic<f64>); - -// CHECK: define{{.*}}double @test_Nested1(double %_1) -#[no_mangle] -pub extern "C" fn test_Nested1(_: Nested1) -> Nested1 { loop {} } - -#[repr(transparent)] -pub struct Nested2(Nested1, Zst1); - -// CHECK: define{{.*}}double @test_Nested2(double %_1) -#[no_mangle] -pub extern "C" fn test_Nested2(_: Nested2) -> Nested2 { loop {} } - -#[repr(simd)] -struct f32x4(f32, f32, f32, f32); - -#[repr(transparent)] -pub struct Vector(f32x4); - -// CHECK: define{{.*}}<4 x float> @test_Vector(<4 x float> %_1) -#[no_mangle] -pub extern "C" fn test_Vector(_: Vector) -> Vector { loop {} } - -trait Mirror { type It: ?Sized; } -impl<T: ?Sized> Mirror for T { type It = Self; } - -#[repr(transparent)] -pub struct StructWithProjection(<f32 as Mirror>::It); - -// CHECK: define{{.*}}float @test_Projection(float %_1) -#[no_mangle] -pub extern "C" fn test_Projection(_: StructWithProjection) -> StructWithProjection { loop {} } - -#[repr(transparent)] -pub enum EnumF32 { - Variant(F32) -} - -// CHECK: define{{.*}}float @test_EnumF32(float %_1) -#[no_mangle] -pub extern "C" fn test_EnumF32(_: EnumF32) -> EnumF32 { loop {} } - -#[repr(transparent)] -pub enum EnumF32WithZsts { - Variant(Zst1, F32, Zst2) -} - -// CHECK: define{{.*}}float @test_EnumF32WithZsts(float %_1) -#[no_mangle] -pub extern "C" fn test_EnumF32WithZsts(_: EnumF32WithZsts) -> EnumF32WithZsts { loop {} } - -#[repr(transparent)] -pub union UnionF32 { - field: F32, -} - -// CHECK: define{{.*}}float @test_UnionF32(float %_1) -#[no_mangle] -pub extern "C" fn test_UnionF32(_: UnionF32) -> UnionF32 { loop {} } - -#[repr(transparent)] -pub union UnionF32WithZsts { - zst1: Zst1, - field: F32, - zst2: Zst2, -} - -// CHECK: define{{.*}}float @test_UnionF32WithZsts(float %_1) -#[no_mangle] -pub extern "C" fn test_UnionF32WithZsts(_: UnionF32WithZsts) -> UnionF32WithZsts { loop {} } - - -// All that remains to be tested are aggregates. They are tested in separate files called repr- -// transparent-*.rs with `only-*` or `ignore-*` directives, because the expected LLVM IR -// function signatures vary so much that it's not reasonably possible to cover all of them with a -// single CHECK line. -// -// You may be wondering why we don't just compare the return types and argument types for equality -// with FileCheck regex captures. Well, rustc doesn't perform newtype unwrapping on newtypes -// containing aggregates. This is OK on all ABIs we support, but because LLVM has not gotten rid of -// pointee types yet, the IR function signature will be syntactically different (%Foo* vs -// %FooWrapper*). diff --git a/src/test/codegen/riscv-abi/call-llvm-intrinsics.rs b/src/test/codegen/riscv-abi/call-llvm-intrinsics.rs deleted file mode 100644 index 31a88f2c0..000000000 --- a/src/test/codegen/riscv-abi/call-llvm-intrinsics.rs +++ /dev/null @@ -1,30 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -// only-riscv64 - -#![feature(link_llvm_intrinsics)] -#![crate_type = "lib"] - -struct A; - -impl Drop for A { - fn drop(&mut self) { - println!("A"); - } -} - -extern "C" { - #[link_name = "llvm.sqrt.f32"] - fn sqrt(x: f32) -> f32; -} - -pub fn do_call() { - let _a = A; - - unsafe { - // Ensure that we `call` LLVM intrinsics instead of trying to `invoke` them - // CHECK: store float 4.000000e+00, float* %{{.}}, align 4 - // CHECK: call float @llvm.sqrt.f32(float %{{.}} - sqrt(4.0); - } -} diff --git a/src/test/codegen/riscv-abi/riscv64-lp64-lp64f-lp64d-abi.rs b/src/test/codegen/riscv-abi/riscv64-lp64-lp64f-lp64d-abi.rs deleted file mode 100644 index 61c4b7b51..000000000 --- a/src/test/codegen/riscv-abi/riscv64-lp64-lp64f-lp64d-abi.rs +++ /dev/null @@ -1,189 +0,0 @@ -// compile-flags: --target riscv64gc-unknown-linux-gnu -O -C no-prepopulate-passes -// needs-llvm-components: riscv - -#![crate_type = "lib"] -#![no_core] -#![feature(no_core, lang_items)] -#![allow(improper_ctypes)] - -#[lang = "sized"] -trait Sized {} -#[lang = "copy"] -trait Copy {} -impl Copy for bool {} -impl Copy for i8 {} -impl Copy for u8 {} -impl Copy for i32 {} -impl Copy for i64 {} -impl Copy for u64 {} -impl Copy for f32 {} -impl Copy for f64 {} - -// CHECK: define void @f_void() -#[no_mangle] -pub extern "C" fn f_void() {} - -// CHECK: define noundef zeroext i1 @f_scalar_0(i1 noundef zeroext %a) -#[no_mangle] -pub extern "C" fn f_scalar_0(a: bool) -> bool { - a -} - -// CHECK: define signext i8 @f_scalar_1(i8 signext %x) -#[no_mangle] -pub extern "C" fn f_scalar_1(x: i8) -> i8 { - x -} - -// CHECK: define zeroext i8 @f_scalar_2(i8 zeroext %x) -#[no_mangle] -pub extern "C" fn f_scalar_2(x: u8) -> u8 { - x -} - -// CHECK: define signext i32 @f_scalar_3(i32 signext %x) -#[no_mangle] -pub extern "C" fn f_scalar_3(x: i32) -> u32 { - x as u32 -} - -// CHECK: define i64 @f_scalar_4(i64 %x) -#[no_mangle] -pub extern "C" fn f_scalar_4(x: i64) -> i64 { - x -} - -// CHECK: define float @f_fp_scalar_1(float %0) -#[no_mangle] -pub extern "C" fn f_fp_scalar_1(x: f32) -> f32 { - x -} -// CHECK: define double @f_fp_scalar_2(double %0) -#[no_mangle] -pub extern "C" fn f_fp_scalar_2(x: f64) -> f64 { - x -} - -#[repr(C)] -pub struct Empty {} - -// CHECK: define void @f_agg_empty_struct() -#[no_mangle] -pub extern "C" fn f_agg_empty_struct(e: Empty) -> Empty { - e -} - -#[repr(C)] -pub struct Tiny { - a: u16, - b: u16, - c: u16, - d: u16, -} - -// CHECK: define void @f_agg_tiny(i64 %0) -#[no_mangle] -pub extern "C" fn f_agg_tiny(mut e: Tiny) { -} - -// CHECK: define i64 @f_agg_tiny_ret() -#[no_mangle] -pub extern "C" fn f_agg_tiny_ret() -> Tiny { - Tiny { a: 1, b: 2, c: 3, d: 4 } -} - -#[repr(C)] -pub struct Small { - a: i64, - b: *mut i64, -} - -// CHECK: define void @f_agg_small([2 x i64] %0) -#[no_mangle] -pub extern "C" fn f_agg_small(mut x: Small) { -} - -// CHECK: define [2 x i64] @f_agg_small_ret() -#[no_mangle] -pub extern "C" fn f_agg_small_ret() -> Small { - Small { a: 1, b: 0 as *mut _ } -} - -#[repr(C)] -pub struct SmallAligned { - a: i128, -} - -// CHECK: define void @f_agg_small_aligned(i128 %0) -#[no_mangle] -pub extern "C" fn f_agg_small_aligned(mut x: SmallAligned) { -} - -#[repr(C)] -pub struct Large { - a: i64, - b: i64, - c: i64, - d: i64, -} - -// CHECK: define void @f_agg_large({{%Large\*|ptr}} {{.*}}%x) -#[no_mangle] -pub extern "C" fn f_agg_large(mut x: Large) { -} - -// CHECK: define void @f_agg_large_ret({{%Large\*|ptr}} {{.*}}sret{{.*}}, i32 signext %i, i8 signext %j) -#[no_mangle] -pub extern "C" fn f_agg_large_ret(i: i32, j: i8) -> Large { - Large { a: 1, b: 2, c: 3, d: 4 } -} - -// CHECK: define void @f_scalar_stack_1(i64 %0, [2 x i64] %1, i128 %2, {{%Large\*|ptr}} {{.*}}%d, i8 zeroext %e, i8 signext %f, i8 %g, i8 %h) -#[no_mangle] -pub extern "C" fn f_scalar_stack_1( - a: Tiny, - b: Small, - c: SmallAligned, - d: Large, - e: u8, - f: i8, - g: u8, - h: i8, -) { -} - -// CHECK: define void @f_scalar_stack_2({{%Large\*|ptr}} {{.*}}sret{{.*}} %0, i64 %a, i128 %1, i128 %2, i64 %d, i8 zeroext %e, i8 %f, i8 %g) -#[no_mangle] -pub extern "C" fn f_scalar_stack_2( - a: u64, - b: SmallAligned, - c: SmallAligned, - d: u64, - e: u8, - f: i8, - g: u8, -) -> Large { - Large { a: a as i64, b: e as i64, c: f as i64, d: g as i64 } -} - -extern "C" { - fn f_va_callee(_: i32, ...) -> i32; -} - -#[no_mangle] -pub unsafe extern "C" fn f_va_caller() { - // CHECK: call signext i32 (i32, ...) @f_va_callee(i32 signext 1, i32 signext 2, i64 3, double {{.*}}, double {{.*}}, i64 {{.*}}, [2 x i64] {{.*}}, i128 {{.*}}, {{%Large\*|ptr}} {{.*}}) - f_va_callee( - 1, - 2i32, - 3i64, - 4.0f64, - 5.0f64, - Tiny { a: 1, b: 2, c: 3, d: 4 }, - Small { a: 10, b: 0 as *mut _ }, - SmallAligned { a: 11 }, - Large { a: 12, b: 13, c: 14, d: 15 }, - ); - // CHECK: call signext i32 (i32, ...) @f_va_callee(i32 signext 1, i32 signext 2, i32 signext 3, i32 signext 4, i128 {{.*}}, i32 signext 6, i32 signext 7, i32 8, i32 9) - f_va_callee(1, 2i32, 3i32, 4i32, SmallAligned { a: 5 }, 6i32, 7i32, 8i32, 9i32); -} diff --git a/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs b/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs deleted file mode 100644 index 1555acadf..000000000 --- a/src/test/codegen/riscv-abi/riscv64-lp64d-abi.rs +++ /dev/null @@ -1,293 +0,0 @@ -// -// compile-flags: -C no-prepopulate-passes -// only-riscv64 -// only-linux -#![crate_type = "lib"] - -// CHECK: define void @f_fpr_tracking(double %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, i8 zeroext %i) -#[no_mangle] -pub extern "C" fn f_fpr_tracking( - a: f64, - b: f64, - c: f64, - d: f64, - e: f64, - f: f64, - g: f64, - h: f64, - i: u8, -) { -} - -#[repr(C)] -pub struct Double { - f: f64, -} - -#[repr(C)] -pub struct DoubleDouble { - f: f64, - g: f64, -} - -#[repr(C)] -pub struct DoubleFloat { - f: f64, - g: f32, -} - -// CHECK: define void @f_double_s_arg(double %0) -#[no_mangle] -pub extern "C" fn f_double_s_arg(a: Double) {} - -// CHECK: define double @f_ret_double_s() -#[no_mangle] -pub extern "C" fn f_ret_double_s() -> Double { - Double { f: 1. } -} - -// CHECK: define void @f_double_double_s_arg({ double, double } %0) -#[no_mangle] -pub extern "C" fn f_double_double_s_arg(a: DoubleDouble) {} - -// CHECK: define { double, double } @f_ret_double_double_s() -#[no_mangle] -pub extern "C" fn f_ret_double_double_s() -> DoubleDouble { - DoubleDouble { f: 1., g: 2. } -} - -// CHECK: define void @f_double_float_s_arg({ double, float } %0) -#[no_mangle] -pub extern "C" fn f_double_float_s_arg(a: DoubleFloat) {} - -// CHECK: define { double, float } @f_ret_double_float_s() -#[no_mangle] -pub extern "C" fn f_ret_double_float_s() -> DoubleFloat { - DoubleFloat { f: 1., g: 2. } -} - -// CHECK: define void @f_double_double_s_arg_insufficient_fprs(double %0, double %1, double %2, double %3, double %4, double %5, double %6, [2 x i64] %7) -#[no_mangle] -pub extern "C" fn f_double_double_s_arg_insufficient_fprs( - a: f64, - b: f64, - c: f64, - d: f64, - e: f64, - f: f64, - g: f64, - h: DoubleDouble, -) { -} - -#[repr(C)] -pub struct DoubleInt8 { - f: f64, - i: i8, -} - -#[repr(C)] -pub struct DoubleUInt8 { - f: f64, - i: u8, -} - -#[repr(C)] -pub struct DoubleInt32 { - f: f64, - i: i32, -} - -#[repr(C)] -pub struct DoubleInt64 { - f: f64, - i: i64, -} - -// CHECK: define void @f_double_int8_s_arg({ double, i8 } %0) -#[no_mangle] -pub extern "C" fn f_double_int8_s_arg(a: DoubleInt8) {} - -// CHECK: define { double, i8 } @f_ret_double_int8_s() -#[no_mangle] -pub extern "C" fn f_ret_double_int8_s() -> DoubleInt8 { - DoubleInt8 { f: 1., i: 2 } -} - -// CHECK: define void @f_double_int32_s_arg({ double, i32 } %0) -#[no_mangle] -pub extern "C" fn f_double_int32_s_arg(a: DoubleInt32) {} - -// CHECK: define { double, i32 } @f_ret_double_int32_s() -#[no_mangle] -pub extern "C" fn f_ret_double_int32_s() -> DoubleInt32 { - DoubleInt32 { f: 1., i: 2 } -} - -// CHECK: define void @f_double_uint8_s_arg({ double, i8 } %0) -#[no_mangle] -pub extern "C" fn f_double_uint8_s_arg(a: DoubleUInt8) {} - -// CHECK: define { double, i8 } @f_ret_double_uint8_s() -#[no_mangle] -pub extern "C" fn f_ret_double_uint8_s() -> DoubleUInt8 { - DoubleUInt8 { f: 1., i: 2 } -} - -// CHECK: define void @f_double_int64_s_arg({ double, i64 } %0) -#[no_mangle] -pub extern "C" fn f_double_int64_s_arg(a: DoubleInt64) {} - -// CHECK: define { double, i64 } @f_ret_double_int64_s() -#[no_mangle] -pub extern "C" fn f_ret_double_int64_s() -> DoubleInt64 { - DoubleInt64 { f: 1., i: 2 } -} - -// CHECK: define void @f_double_int8_s_arg_insufficient_gprs(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, [2 x i64] %0) -#[no_mangle] -pub extern "C" fn f_double_int8_s_arg_insufficient_gprs( - a: i32, - b: i32, - c: i32, - d: i32, - e: i32, - f: i32, - g: i32, - h: i32, - i: DoubleInt8, -) { -} - -// CHECK: define void @f_struct_double_int8_insufficient_fprs(float %0, double %1, double %2, double %3, double %4, double %5, double %6, double %7, [2 x i64] %8) -#[no_mangle] -pub extern "C" fn f_struct_double_int8_insufficient_fprs( - a: f32, - b: f64, - c: f64, - d: f64, - e: f64, - f: f64, - g: f64, - h: f64, - i: DoubleInt8, -) { -} - -#[repr(C)] -pub struct DoubleArr1 { - a: [f64; 1], -} - -// CHECK: define void @f_doublearr1_s_arg(double %0) -#[no_mangle] -pub extern "C" fn f_doublearr1_s_arg(a: DoubleArr1) {} - -// CHECK: define double @f_ret_doublearr1_s() -#[no_mangle] -pub extern "C" fn f_ret_doublearr1_s() -> DoubleArr1 { - DoubleArr1 { a: [1.] } -} - -#[repr(C)] -pub struct DoubleArr2 { - a: [f64; 2], -} - -// CHECK: define void @f_doublearr2_s_arg({ double, double } %0) -#[no_mangle] -pub extern "C" fn f_doublearr2_s_arg(a: DoubleArr2) {} - -// CHECK: define { double, double } @f_ret_doublearr2_s() -#[no_mangle] -pub extern "C" fn f_ret_doublearr2_s() -> DoubleArr2 { - DoubleArr2 { a: [1., 2.] } -} - -#[repr(C)] -pub struct Tricky1 { - f: [f64; 1], -} - -#[repr(C)] -pub struct DoubleArr2Tricky1 { - g: [Tricky1; 2], -} - -// CHECK: define void @f_doublearr2_tricky1_s_arg({ double, double } %0) -#[no_mangle] -pub extern "C" fn f_doublearr2_tricky1_s_arg(a: DoubleArr2Tricky1) {} - -// CHECK: define { double, double } @f_ret_doublearr2_tricky1_s() -#[no_mangle] -pub extern "C" fn f_ret_doublearr2_tricky1_s() -> DoubleArr2Tricky1 { - DoubleArr2Tricky1 { g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] } -} - -#[repr(C)] -pub struct EmptyStruct {} - -#[repr(C)] -pub struct DoubleArr2Tricky2 { - s: EmptyStruct, - g: [Tricky1; 2], -} - -// CHECK: define void @f_doublearr2_tricky2_s_arg({ double, double } %0) -#[no_mangle] -pub extern "C" fn f_doublearr2_tricky2_s_arg(a: DoubleArr2Tricky2) {} - -// CHECK: define { double, double } @f_ret_doublearr2_tricky2_s() -#[no_mangle] -pub extern "C" fn f_ret_doublearr2_tricky2_s() -> DoubleArr2Tricky2 { - DoubleArr2Tricky2 { s: EmptyStruct {}, g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] } -} - -#[repr(C)] -pub struct IntDoubleInt { - a: i32, - b: f64, - c: i32, -} - -// CHECK: define void @f_int_double_int_s_arg(%IntDoubleInt* {{.*}}%a) -#[no_mangle] -pub extern "C" fn f_int_double_int_s_arg(a: IntDoubleInt) {} - -// CHECK: define void @f_ret_int_double_int_s(%IntDoubleInt* {{.*}}sret -#[no_mangle] -pub extern "C" fn f_ret_int_double_int_s() -> IntDoubleInt { - IntDoubleInt { a: 1, b: 2., c: 3 } -} - -#[repr(C)] -pub struct CharCharDouble { - a: u8, - b: u8, - c: f64, -} - -// CHECK: define void @f_char_char_double_s_arg([2 x i64] %0) -#[no_mangle] -pub extern "C" fn f_char_char_double_s_arg(a: CharCharDouble) {} - -// CHECK: define [2 x i64] @f_ret_char_char_double_s() -#[no_mangle] -pub extern "C" fn f_ret_char_char_double_s() -> CharCharDouble { - CharCharDouble { a: 1, b: 2, c: 3. } -} - -#[repr(C)] -pub union DoubleU { - a: f64, -} - -// CHECK: define void @f_double_u_arg(i64 %0) -#[no_mangle] -pub extern "C" fn f_double_u_arg(a: DoubleU) {} - -// CHECK: define i64 @f_ret_double_u() -#[no_mangle] -pub extern "C" fn f_ret_double_u() -> DoubleU { - unsafe { DoubleU { a: 1. } } -} diff --git a/src/test/codegen/riscv-abi/riscv64-lp64f-lp64d-abi.rs b/src/test/codegen/riscv-abi/riscv64-lp64f-lp64d-abi.rs deleted file mode 100644 index f08fabed4..000000000 --- a/src/test/codegen/riscv-abi/riscv64-lp64f-lp64d-abi.rs +++ /dev/null @@ -1,277 +0,0 @@ -// -// compile-flags: -C no-prepopulate-passes -// only-riscv64 -// only-linux -#![crate_type = "lib"] - -// CHECK: define void @f_fpr_tracking(float %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, i8 zeroext %i) -#[no_mangle] -pub extern "C" fn f_fpr_tracking( - a: f32, - b: f32, - c: f32, - d: f32, - e: f32, - f: f32, - g: f32, - h: f32, - i: u8, -) { -} - -#[repr(C)] -pub struct Float { - f: f32, -} - -#[repr(C)] -pub struct FloatFloat { - f: f32, - g: f32, -} - -// CHECK: define void @f_float_s_arg(float %0) -#[no_mangle] -pub extern "C" fn f_float_s_arg(a: Float) {} - -// CHECK: define float @f_ret_float_s() -#[no_mangle] -pub extern "C" fn f_ret_float_s() -> Float { - Float { f: 1. } -} - -// CHECK: define void @f_float_float_s_arg({ float, float } %0) -#[no_mangle] -pub extern "C" fn f_float_float_s_arg(a: FloatFloat) {} - -// CHECK: define { float, float } @f_ret_float_float_s() -#[no_mangle] -pub extern "C" fn f_ret_float_float_s() -> FloatFloat { - FloatFloat { f: 1., g: 2. } -} - -// CHECK: define void @f_float_float_s_arg_insufficient_fprs(float %0, float %1, float %2, float %3, float %4, float %5, float %6, i64 %7) -#[no_mangle] -pub extern "C" fn f_float_float_s_arg_insufficient_fprs( - a: f32, - b: f32, - c: f32, - d: f32, - e: f32, - f: f32, - g: f32, - h: FloatFloat, -) { -} - -#[repr(C)] -pub struct FloatInt8 { - f: f32, - i: i8, -} - -#[repr(C)] -pub struct FloatUInt8 { - f: f32, - i: u8, -} - -#[repr(C)] -pub struct FloatInt32 { - f: f32, - i: i32, -} - -#[repr(C)] -pub struct FloatInt64 { - f: f32, - i: i64, -} - -// CHECK: define void @f_float_int8_s_arg({ float, i8 } %0) -#[no_mangle] -pub extern "C" fn f_float_int8_s_arg(a: FloatInt8) {} - -// CHECK: define { float, i8 } @f_ret_float_int8_s() -#[no_mangle] -pub extern "C" fn f_ret_float_int8_s() -> FloatInt8 { - FloatInt8 { f: 1., i: 2 } -} - -// CHECK: define void @f_float_int32_s_arg({ float, i32 } %0) -#[no_mangle] -pub extern "C" fn f_float_int32_s_arg(a: FloatInt32) {} - -// CHECK: define { float, i32 } @f_ret_float_int32_s() -#[no_mangle] -pub extern "C" fn f_ret_float_int32_s() -> FloatInt32 { - FloatInt32 { f: 1., i: 2 } -} - -// CHECK: define void @f_float_uint8_s_arg({ float, i8 } %0) -#[no_mangle] -pub extern "C" fn f_float_uint8_s_arg(a: FloatUInt8) {} - -// CHECK: define { float, i8 } @f_ret_float_uint8_s() -#[no_mangle] -pub extern "C" fn f_ret_float_uint8_s() -> FloatUInt8 { - FloatUInt8 { f: 1., i: 2 } -} - -// CHECK: define void @f_float_int64_s_arg({ float, i64 } %0) -#[no_mangle] -pub extern "C" fn f_float_int64_s_arg(a: FloatInt64) {} - -// CHECK: define { float, i64 } @f_ret_float_int64_s() -#[no_mangle] -pub extern "C" fn f_ret_float_int64_s() -> FloatInt64 { - FloatInt64 { f: 1., i: 2 } -} - -// CHECK: define void @f_float_int8_s_arg_insufficient_gprs(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, i64 %0) -#[no_mangle] -pub extern "C" fn f_float_int8_s_arg_insufficient_gprs( - a: i32, - b: i32, - c: i32, - d: i32, - e: i32, - f: i32, - g: i32, - h: i32, - i: FloatInt8, -) { -} - -// CHECK: define void @f_struct_float_int8_insufficient_fprs(float %0, float %1, float %2, float %3, float %4, float %5, float %6, float %7, i64 %8) -#[no_mangle] -pub extern "C" fn f_struct_float_int8_insufficient_fprs( - a: f32, - b: f32, - c: f32, - d: f32, - e: f32, - f: f32, - g: f32, - h: f32, - i: FloatInt8, -) { -} - -#[repr(C)] -pub struct FloatArr1 { - a: [f32; 1], -} - -// CHECK: define void @f_floatarr1_s_arg(float %0) -#[no_mangle] -pub extern "C" fn f_floatarr1_s_arg(a: FloatArr1) {} - -// CHECK: define float @f_ret_floatarr1_s() -#[no_mangle] -pub extern "C" fn f_ret_floatarr1_s() -> FloatArr1 { - FloatArr1 { a: [1.] } -} - -#[repr(C)] -pub struct FloatArr2 { - a: [f32; 2], -} - -// CHECK: define void @f_floatarr2_s_arg({ float, float } %0) -#[no_mangle] -pub extern "C" fn f_floatarr2_s_arg(a: FloatArr2) {} - -// CHECK: define { float, float } @f_ret_floatarr2_s() -#[no_mangle] -pub extern "C" fn f_ret_floatarr2_s() -> FloatArr2 { - FloatArr2 { a: [1., 2.] } -} - -#[repr(C)] -pub struct Tricky1 { - f: [f32; 1], -} - -#[repr(C)] -pub struct FloatArr2Tricky1 { - g: [Tricky1; 2], -} - -// CHECK: define void @f_floatarr2_tricky1_s_arg({ float, float } %0) -#[no_mangle] -pub extern "C" fn f_floatarr2_tricky1_s_arg(a: FloatArr2Tricky1) {} - -// CHECK: define { float, float } @f_ret_floatarr2_tricky1_s() -#[no_mangle] -pub extern "C" fn f_ret_floatarr2_tricky1_s() -> FloatArr2Tricky1 { - FloatArr2Tricky1 { g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] } -} - -#[repr(C)] -pub struct EmptyStruct {} - -#[repr(C)] -pub struct FloatArr2Tricky2 { - s: EmptyStruct, - g: [Tricky1; 2], -} - -// CHECK: define void @f_floatarr2_tricky2_s_arg({ float, float } %0) -#[no_mangle] -pub extern "C" fn f_floatarr2_tricky2_s_arg(a: FloatArr2Tricky2) {} - -// CHECK: define { float, float } @f_ret_floatarr2_tricky2_s() -#[no_mangle] -pub extern "C" fn f_ret_floatarr2_tricky2_s() -> FloatArr2Tricky2 { - FloatArr2Tricky2 { s: EmptyStruct {}, g: [Tricky1 { f: [1.] }, Tricky1 { f: [2.] }] } -} - -#[repr(C)] -pub struct IntFloatInt { - a: i32, - b: f32, - c: i32, -} - -// CHECK: define void @f_int_float_int_s_arg([2 x i64] %0) -#[no_mangle] -pub extern "C" fn f_int_float_int_s_arg(a: IntFloatInt) {} - -// CHECK: define [2 x i64] @f_ret_int_float_int_s() -#[no_mangle] -pub extern "C" fn f_ret_int_float_int_s() -> IntFloatInt { - IntFloatInt { a: 1, b: 2., c: 3 } -} - -#[repr(C)] -pub struct CharCharFloat { - a: u8, - b: u8, - c: f32, -} - -// CHECK: define void @f_char_char_float_s_arg(i64 %0) -#[no_mangle] -pub extern "C" fn f_char_char_float_s_arg(a: CharCharFloat) {} - -// CHECK: define i64 @f_ret_char_char_float_s() -#[no_mangle] -pub extern "C" fn f_ret_char_char_float_s() -> CharCharFloat { - CharCharFloat { a: 1, b: 2, c: 3. } -} - -#[repr(C)] -pub union FloatU { - a: f32, -} - -// CHECK: define void @f_float_u_arg(i64 %0) -#[no_mangle] -pub extern "C" fn f_float_u_arg(a: FloatU) {} - -// CHECK: define i64 @f_ret_float_u() -#[no_mangle] -pub extern "C" fn f_ret_float_u() -> FloatU { - unsafe { FloatU { a: 1. } } -} diff --git a/src/test/codegen/sanitizer-cfi-add-canonical-jump-tables-flag.rs b/src/test/codegen/sanitizer-cfi-add-canonical-jump-tables-flag.rs deleted file mode 100644 index c42fbba74..000000000 --- a/src/test/codegen/sanitizer-cfi-add-canonical-jump-tables-flag.rs +++ /dev/null @@ -1,11 +0,0 @@ -// Verifies that "CFI Canonical Jump Tables" module flag is added. -// -// needs-sanitizer-cfi -// compile-flags: -Clto -Ctarget-feature=-crt-static -Zsanitizer=cfi - -#![crate_type="lib"] - -pub fn foo() { -} - -// CHECK: !{{[0-9]+}} = !{i32 2, !"CFI Canonical Jump Tables", i32 1} diff --git a/src/test/codegen/sanitizer-cfi-emit-type-checks.rs b/src/test/codegen/sanitizer-cfi-emit-type-checks.rs deleted file mode 100644 index 8be5186de..000000000 --- a/src/test/codegen/sanitizer-cfi-emit-type-checks.rs +++ /dev/null @@ -1,20 +0,0 @@ -// Verifies that pointer type membership tests for indirect calls are emitted. -// -// needs-sanitizer-cfi -// compile-flags: -Clto -Cno-prepopulate-passes -Ctarget-feature=-crt-static -Zsanitizer=cfi - -#![crate_type="lib"] - -pub fn foo(f: fn(i32) -> i32, arg: i32) -> i32 { - // CHECK-LABEL: define{{.*}}foo{{.*}}!type !{{[0-9]+}} - // CHECK: start: - // CHECK: [[TT:%.+]] = call i1 @llvm.type.test({{i8\*|ptr}} {{%f|%0}}, metadata !"{{[[:print:]]+}}") - // CHECK-NEXT: br i1 [[TT]], label %type_test.pass, label %type_test.fail - // CHECK: type_test.pass: - // CHECK-NEXT: {{%.+}} = call i32 %f(i32 %arg) - // CHECK-NEXT: br label %bb1 - // CHECK: type_test.fail: - // CHECK-NEXT: call void @llvm.trap() - // CHECK-NEXT: unreachable - f(arg) -} diff --git a/src/test/codegen/sanitizer-cfi-emit-type-metadata-id-itanium-cxx-abi.rs b/src/test/codegen/sanitizer-cfi-emit-type-metadata-id-itanium-cxx-abi.rs deleted file mode 100644 index ece2adbdf..000000000 --- a/src/test/codegen/sanitizer-cfi-emit-type-metadata-id-itanium-cxx-abi.rs +++ /dev/null @@ -1,575 +0,0 @@ -// Verifies that type metadata identifiers for functions are emitted correctly. -// -// needs-sanitizer-cfi -// compile-flags: -Clto -Cno-prepopulate-passes -Ctarget-feature=-crt-static -Zsanitizer=cfi - -#![crate_type="lib"] -#![allow(dead_code)] -#![allow(incomplete_features)] -#![allow(unused_must_use)] -#![feature(adt_const_params, extern_types, inline_const, type_alias_impl_trait)] - -extern crate core; -use core::ffi::c_void; -use std::marker::PhantomData; - -// User-defined type (structure) -pub struct Struct1<T> { - member1: T, -} - -// User-defined type (enum) -pub enum Enum1<T> { - Variant1(T), -} - -// User-defined type (union) -pub union Union1<T> { - member1: std::mem::ManuallyDrop<T>, -} - -// Extern type -extern { - pub type type1; -} - -// Trait -pub trait Trait1<T> { - fn foo(&self) { } -} - -// Trait implementation -impl<T> Trait1<T> for i32 { - fn foo(&self) { } -} - -// Trait implementation -impl<T> Trait1<T> for Struct1<T> { - fn foo(&self) { } -} - -// impl Trait type aliases for helping with defining other types (see below) -pub type Type1 = impl Send; -pub type Type2 = impl Send; -pub type Type3 = impl Send; -pub type Type4 = impl Send; -pub type Type5 = impl Send; -pub type Type6 = impl Send; -pub type Type7 = impl Send; -pub type Type8 = impl Send; -pub type Type9 = impl Send; -pub type Type10 = impl Send; -pub type Type11 = impl Send; - -pub fn fn1<'a>() { - // Closure - let closure1 = || { }; - let _: Type1 = closure1; - - // Constructor - pub struct Foo(i32); - let _: Type2 = Foo; - - // Type in extern path - extern { - fn foo(); - } - let _: Type3 = foo; - - // Type in closure path - || { - pub struct Foo; - let _: Type4 = Foo; - }; - - // Type in const path - const { - pub struct Foo; - fn foo() -> Type5 { Foo } - }; - - // Type in impl path - impl<T> Struct1<T> { - fn foo(&self) { } - } - let _: Type6 = <Struct1<i32>>::foo; - - // Trait method - let _: Type7 = <dyn Trait1<i32>>::foo; - - // Trait method - let _: Type8 = <i32 as Trait1<i32>>::foo; - - // Trait method - let _: Type9 = <Struct1<i32> as Trait1<i32>>::foo; - - // Const generics - pub struct Qux<T, const N: usize>([T; N]); - let _: Type10 = Qux([0; 32]); - - // Lifetimes/regions - pub struct Quux<'a>(&'a i32); - pub struct Quuux<'a, 'b>(&'a i32, &'b Quux<'b>); - let _: Type11 = Quuux; -} - -// repr(transparent) user-defined type -struct Foo(i32); - -#[repr(transparent)] -pub struct Type12 { - member1: (), - member2: PhantomData<i32>, - member3: Foo, -} - -// Self-referencing repr(transparent) user-defined type -#[repr(transparent)] -pub struct Type13<'a> { - member1: (), - member2: PhantomData<i32>, - member3: &'a Type13<'a>, -} - -pub fn foo0(_: ()) { } -// CHECK: define{{.*}}foo0{{.*}}!type ![[TYPE0:[0-9]+]] -pub fn foo1(_: c_void, _: ()) { } -// CHECK: define{{.*}}foo1{{.*}}!type ![[TYPE1:[0-9]+]] -pub fn foo2(_: (), _: c_void, _: c_void) { } -// CHECK: define{{.*}}foo2{{.*}}!type ![[TYPE2:[0-9]+]] -pub fn foo3(_: *mut c_void) { } -// CHECK: define{{.*}}foo3{{.*}}!type ![[TYPE3:[0-9]+]] -pub fn foo4(_: *mut c_void, _: *mut ()) { } -// CHECK: define{{.*}}foo4{{.*}}!type ![[TYPE4:[0-9]+]] -pub fn foo5(_: *mut (), _: *mut c_void, _: *mut c_void) { } -// CHECK: define{{.*}}foo5{{.*}}!type ![[TYPE5:[0-9]+]] -pub fn foo6(_: *const c_void) { } -// CHECK: define{{.*}}foo6{{.*}}!type ![[TYPE6:[0-9]+]] -pub fn foo7(_: *const c_void, _: *const ()) { } -// CHECK: define{{.*}}foo7{{.*}}!type ![[TYPE7:[0-9]+]] -pub fn foo8(_: *const (), _: *const c_void, _: *const c_void) { } -// CHECK: define{{.*}}foo8{{.*}}!type ![[TYPE8:[0-9]+]] -pub fn foo9(_: bool) { } -// CHECK: define{{.*}}foo9{{.*}}!type ![[TYPE9:[0-9]+]] -pub fn foo10(_: bool, _: bool) { } -// CHECK: define{{.*}}foo10{{.*}}!type ![[TYPE10:[0-9]+]] -pub fn foo11(_: bool, _: bool, _: bool) { } -// CHECK: define{{.*}}foo11{{.*}}!type ![[TYPE11:[0-9]+]] -pub fn foo12(_: i8) { } -// CHECK: define{{.*}}foo12{{.*}}!type ![[TYPE12:[0-9]+]] -pub fn foo13(_: i8, _: i8) { } -// CHECK: define{{.*}}foo13{{.*}}!type ![[TYPE13:[0-9]+]] -pub fn foo14(_: i8, _: i8, _: i8) { } -// CHECK: define{{.*}}foo14{{.*}}!type ![[TYPE14:[0-9]+]] -pub fn foo15(_: i16) { } -// CHECK: define{{.*}}foo15{{.*}}!type ![[TYPE15:[0-9]+]] -pub fn foo16(_: i16, _: i16) { } -// CHECK: define{{.*}}foo16{{.*}}!type ![[TYPE16:[0-9]+]] -pub fn foo17(_: i16, _: i16, _: i16) { } -// CHECK: define{{.*}}foo17{{.*}}!type ![[TYPE17:[0-9]+]] -pub fn foo18(_: i32) { } -// CHECK: define{{.*}}foo18{{.*}}!type ![[TYPE18:[0-9]+]] -pub fn foo19(_: i32, _: i32) { } -// CHECK: define{{.*}}foo19{{.*}}!type ![[TYPE19:[0-9]+]] -pub fn foo20(_: i32, _: i32, _: i32) { } -// CHECK: define{{.*}}foo20{{.*}}!type ![[TYPE20:[0-9]+]] -pub fn foo21(_: i64) { } -// CHECK: define{{.*}}foo21{{.*}}!type ![[TYPE21:[0-9]+]] -pub fn foo22(_: i64, _: i64) { } -// CHECK: define{{.*}}foo22{{.*}}!type ![[TYPE22:[0-9]+]] -pub fn foo23(_: i64, _: i64, _: i64) { } -// CHECK: define{{.*}}foo23{{.*}}!type ![[TYPE23:[0-9]+]] -pub fn foo24(_: i128) { } -// CHECK: define{{.*}}foo24{{.*}}!type ![[TYPE24:[0-9]+]] -pub fn foo25(_: i128, _: i128) { } -// CHECK: define{{.*}}foo25{{.*}}!type ![[TYPE25:[0-9]+]] -pub fn foo26(_: i128, _: i128, _: i128) { } -// CHECK: define{{.*}}foo26{{.*}}!type ![[TYPE26:[0-9]+]] -pub fn foo27(_: isize) { } -// CHECK: define{{.*}}foo27{{.*}}!type ![[TYPE27:[0-9]+]] -pub fn foo28(_: isize, _: isize) { } -// CHECK: define{{.*}}foo28{{.*}}!type ![[TYPE28:[0-9]+]] -pub fn foo29(_: isize, _: isize, _: isize) { } -// CHECK: define{{.*}}foo29{{.*}}!type ![[TYPE29:[0-9]+]] -pub fn foo30(_: u8) { } -// CHECK: define{{.*}}foo30{{.*}}!type ![[TYPE30:[0-9]+]] -pub fn foo31(_: u8, _: u8) { } -// CHECK: define{{.*}}foo31{{.*}}!type ![[TYPE31:[0-9]+]] -pub fn foo32(_: u8, _: u8, _: u8) { } -// CHECK: define{{.*}}foo32{{.*}}!type ![[TYPE32:[0-9]+]] -pub fn foo33(_: u16) { } -// CHECK: define{{.*}}foo33{{.*}}!type ![[TYPE33:[0-9]+]] -pub fn foo34(_: u16, _: u16) { } -// CHECK: define{{.*}}foo34{{.*}}!type ![[TYPE34:[0-9]+]] -pub fn foo35(_: u16, _: u16, _: u16) { } -// CHECK: define{{.*}}foo35{{.*}}!type ![[TYPE35:[0-9]+]] -pub fn foo36(_: u32) { } -// CHECK: define{{.*}}foo36{{.*}}!type ![[TYPE36:[0-9]+]] -pub fn foo37(_: u32, _: u32) { } -// CHECK: define{{.*}}foo37{{.*}}!type ![[TYPE37:[0-9]+]] -pub fn foo38(_: u32, _: u32, _: u32) { } -// CHECK: define{{.*}}foo38{{.*}}!type ![[TYPE38:[0-9]+]] -pub fn foo39(_: u64) { } -// CHECK: define{{.*}}foo39{{.*}}!type ![[TYPE39:[0-9]+]] -pub fn foo40(_: u64, _: u64) { } -// CHECK: define{{.*}}foo40{{.*}}!type ![[TYPE40:[0-9]+]] -pub fn foo41(_: u64, _: u64, _: u64) { } -// CHECK: define{{.*}}foo41{{.*}}!type ![[TYPE41:[0-9]+]] -pub fn foo42(_: u128) { } -// CHECK: define{{.*}}foo42{{.*}}!type ![[TYPE42:[0-9]+]] -pub fn foo43(_: u128, _: u128) { } -// CHECK: define{{.*}}foo43{{.*}}!type ![[TYPE43:[0-9]+]] -pub fn foo44(_: u128, _: u128, _: u128) { } -// CHECK: define{{.*}}foo44{{.*}}!type ![[TYPE44:[0-9]+]] -pub fn foo45(_: usize) { } -// CHECK: define{{.*}}foo45{{.*}}!type ![[TYPE45:[0-9]+]] -pub fn foo46(_: usize, _: usize) { } -// CHECK: define{{.*}}foo46{{.*}}!type ![[TYPE46:[0-9]+]] -pub fn foo47(_: usize, _: usize, _: usize) { } -// CHECK: define{{.*}}foo47{{.*}}!type ![[TYPE47:[0-9]+]] -pub fn foo48(_: f32) { } -// CHECK: define{{.*}}foo48{{.*}}!type ![[TYPE48:[0-9]+]] -pub fn foo49(_: f32, _: f32) { } -// CHECK: define{{.*}}foo49{{.*}}!type ![[TYPE49:[0-9]+]] -pub fn foo50(_: f32, _: f32, _: f32) { } -// CHECK: define{{.*}}foo50{{.*}}!type ![[TYPE50:[0-9]+]] -pub fn foo51(_: f64) { } -// CHECK: define{{.*}}foo51{{.*}}!type ![[TYPE51:[0-9]+]] -pub fn foo52(_: f64, _: f64) { } -// CHECK: define{{.*}}foo52{{.*}}!type ![[TYPE52:[0-9]+]] -pub fn foo53(_: f64, _: f64, _: f64) { } -// CHECK: define{{.*}}foo53{{.*}}!type ![[TYPE53:[0-9]+]] -pub fn foo54(_: char) { } -// CHECK: define{{.*}}foo54{{.*}}!type ![[TYPE54:[0-9]+]] -pub fn foo55(_: char, _: char) { } -// CHECK: define{{.*}}foo55{{.*}}!type ![[TYPE55:[0-9]+]] -pub fn foo56(_: char, _: char, _: char) { } -// CHECK: define{{.*}}foo56{{.*}}!type ![[TYPE56:[0-9]+]] -pub fn foo57(_: &str) { } -// CHECK: define{{.*}}foo57{{.*}}!type ![[TYPE57:[0-9]+]] -pub fn foo58(_: &str, _: &str) { } -// CHECK: define{{.*}}foo58{{.*}}!type ![[TYPE58:[0-9]+]] -pub fn foo59(_: &str, _: &str, _: &str) { } -// CHECK: define{{.*}}foo59{{.*}}!type ![[TYPE59:[0-9]+]] -pub fn foo60(_: (i32, i32)) { } -// CHECK: define{{.*}}foo60{{.*}}!type ![[TYPE60:[0-9]+]] -pub fn foo61(_: (i32, i32), _: (i32, i32)) { } -// CHECK: define{{.*}}foo61{{.*}}!type ![[TYPE61:[0-9]+]] -pub fn foo62(_: (i32, i32), _: (i32, i32), _: (i32, i32)) { } -// CHECK: define{{.*}}foo62{{.*}}!type ![[TYPE62:[0-9]+]] -pub fn foo63(_: [i32; 32]) { } -// CHECK: define{{.*}}foo63{{.*}}!type ![[TYPE63:[0-9]+]] -pub fn foo64(_: [i32; 32], _: [i32; 32]) { } -// CHECK: define{{.*}}foo64{{.*}}!type ![[TYPE64:[0-9]+]] -pub fn foo65(_: [i32; 32], _: [i32; 32], _: [i32; 32]) { } -// CHECK: define{{.*}}foo65{{.*}}!type ![[TYPE65:[0-9]+]] -pub fn foo66(_: &[i32]) { } -// CHECK: define{{.*}}foo66{{.*}}!type ![[TYPE66:[0-9]+]] -pub fn foo67(_: &[i32], _: &[i32]) { } -// CHECK: define{{.*}}foo67{{.*}}!type ![[TYPE67:[0-9]+]] -pub fn foo68(_: &[i32], _: &[i32], _: &[i32]) { } -// CHECK: define{{.*}}foo68{{.*}}!type ![[TYPE68:[0-9]+]] -pub fn foo69(_: &Struct1::<i32>) { } -// CHECK: define{{.*}}foo69{{.*}}!type ![[TYPE69:[0-9]+]] -pub fn foo70(_: &Struct1::<i32>, _: &Struct1::<i32>) { } -// CHECK: define{{.*}}foo70{{.*}}!type ![[TYPE70:[0-9]+]] -pub fn foo71(_: &Struct1::<i32>, _: &Struct1::<i32>, _: &Struct1::<i32>) { } -// CHECK: define{{.*}}foo71{{.*}}!type ![[TYPE71:[0-9]+]] -pub fn foo72(_: &Enum1::<i32>) { } -// CHECK: define{{.*}}foo72{{.*}}!type ![[TYPE72:[0-9]+]] -pub fn foo73(_: &Enum1::<i32>, _: &Enum1::<i32>) { } -// CHECK: define{{.*}}foo73{{.*}}!type ![[TYPE73:[0-9]+]] -pub fn foo74(_: &Enum1::<i32>, _: &Enum1::<i32>, _: &Enum1::<i32>) { } -// CHECK: define{{.*}}foo74{{.*}}!type ![[TYPE74:[0-9]+]] -pub fn foo75(_: &Union1::<i32>) { } -// CHECK: define{{.*}}foo75{{.*}}!type ![[TYPE75:[0-9]+]] -pub fn foo76(_: &Union1::<i32>, _: &Union1::<i32>) { } -// CHECK: define{{.*}}foo76{{.*}}!type ![[TYPE76:[0-9]+]] -pub fn foo77(_: &Union1::<i32>, _: &Union1::<i32>, _: &Union1::<i32>) { } -// CHECK: define{{.*}}foo77{{.*}}!type ![[TYPE77:[0-9]+]] -pub fn foo78(_: *mut type1) { } -// CHECK: define{{.*}}foo78{{.*}}!type ![[TYPE78:[0-9]+]] -pub fn foo79(_: *mut type1, _: *mut type1) { } -// CHECK: define{{.*}}foo79{{.*}}!type ![[TYPE79:[0-9]+]] -pub fn foo80(_: *mut type1, _: *mut type1, _: *mut type1) { } -// CHECK: define{{.*}}foo80{{.*}}!type ![[TYPE80:[0-9]+]] -pub fn foo81(_: &mut i32) { } -// CHECK: define{{.*}}foo81{{.*}}!type ![[TYPE81:[0-9]+]] -pub fn foo82(_: &mut i32, _: &i32) { } -// CHECK: define{{.*}}foo82{{.*}}!type ![[TYPE82:[0-9]+]] -pub fn foo83(_: &mut i32, _: &i32, _: &i32) { } -// CHECK: define{{.*}}foo83{{.*}}!type ![[TYPE83:[0-9]+]] -pub fn foo84(_: &i32) { } -// CHECK: define{{.*}}foo84{{.*}}!type ![[TYPE84:[0-9]+]] -pub fn foo85(_: &i32, _: &mut i32) { } -// CHECK: define{{.*}}foo85{{.*}}!type ![[TYPE85:[0-9]+]] -pub fn foo86(_: &i32, _: &mut i32, _: &mut i32) { } -// CHECK: define{{.*}}foo86{{.*}}!type ![[TYPE86:[0-9]+]] -pub fn foo87(_: *mut i32) { } -// CHECK: define{{.*}}foo87{{.*}}!type ![[TYPE87:[0-9]+]] -pub fn foo88(_: *mut i32, _: *const i32) { } -// CHECK: define{{.*}}foo88{{.*}}!type ![[TYPE88:[0-9]+]] -pub fn foo89(_: *mut i32, _: *const i32, _: *const i32) { } -// CHECK: define{{.*}}foo89{{.*}}!type ![[TYPE89:[0-9]+]] -pub fn foo90(_: *const i32) { } -// CHECK: define{{.*}}foo90{{.*}}!type ![[TYPE90:[0-9]+]] -pub fn foo91(_: *const i32, _: *mut i32) { } -// CHECK: define{{.*}}foo91{{.*}}!type ![[TYPE91:[0-9]+]] -pub fn foo92(_: *const i32, _: *mut i32, _: *mut i32) { } -// CHECK: define{{.*}}foo92{{.*}}!type ![[TYPE92:[0-9]+]] -pub fn foo93(_: fn(i32) -> i32) { } -// CHECK: define{{.*}}foo93{{.*}}!type ![[TYPE93:[0-9]+]] -pub fn foo94(_: fn(i32) -> i32, _: fn(i32) -> i32) { } -// CHECK: define{{.*}}foo94{{.*}}!type ![[TYPE94:[0-9]+]] -pub fn foo95(_: fn(i32) -> i32, _: fn(i32) -> i32, _: fn(i32) -> i32) { } -// CHECK: define{{.*}}foo95{{.*}}!type ![[TYPE95:[0-9]+]] -pub fn foo96(_: &dyn Fn(i32) -> i32) { } -// CHECK: define{{.*}}foo96{{.*}}!type ![[TYPE96:[0-9]+]] -pub fn foo97(_: &dyn Fn(i32) -> i32, _: &dyn Fn(i32) -> i32) { } -// CHECK: define{{.*}}foo97{{.*}}!type ![[TYPE97:[0-9]+]] -pub fn foo98(_: &dyn Fn(i32) -> i32, _: &dyn Fn(i32) -> i32, _: &dyn Fn(i32) -> i32) { } -// CHECK: define{{.*}}foo98{{.*}}!type ![[TYPE98:[0-9]+]] -pub fn foo99(_: &dyn FnMut(i32) -> i32) { } -// CHECK: define{{.*}}foo99{{.*}}!type ![[TYPE99:[0-9]+]] -pub fn foo100(_: &dyn FnMut(i32) -> i32, _: &dyn FnMut(i32) -> i32) { } -// CHECK: define{{.*}}foo100{{.*}}!type ![[TYPE100:[0-9]+]] -pub fn foo101(_: &dyn FnMut(i32) -> i32, _: &dyn FnMut(i32) -> i32, _: &dyn FnMut(i32) -> i32) { } -// CHECK: define{{.*}}foo101{{.*}}!type ![[TYPE101:[0-9]+]] -pub fn foo102(_: &dyn FnOnce(i32) -> i32) { } -// CHECK: define{{.*}}foo102{{.*}}!type ![[TYPE102:[0-9]+]] -pub fn foo103(_: &dyn FnOnce(i32) -> i32, _: &dyn FnOnce(i32) -> i32) { } -// CHECK: define{{.*}}foo103{{.*}}!type ![[TYPE103:[0-9]+]] -pub fn foo104(_: &dyn FnOnce(i32) -> i32, _: &dyn FnOnce(i32) -> i32, _: &dyn FnOnce(i32) -> i32) {} -// CHECK: define{{.*}}foo104{{.*}}!type ![[TYPE104:[0-9]+]] -pub fn foo105(_: &dyn Send) { } -// CHECK: define{{.*}}foo105{{.*}}!type ![[TYPE105:[0-9]+]] -pub fn foo106(_: &dyn Send, _: &dyn Send) { } -// CHECK: define{{.*}}foo106{{.*}}!type ![[TYPE106:[0-9]+]] -pub fn foo107(_: &dyn Send, _: &dyn Send, _: &dyn Send) { } -// CHECK: define{{.*}}foo107{{.*}}!type ![[TYPE107:[0-9]+]] -pub fn foo108(_: Type1) { } -// CHECK: define{{.*}}foo108{{.*}}!type ![[TYPE108:[0-9]+]] -pub fn foo109(_: Type1, _: Type1) { } -// CHECK: define{{.*}}foo109{{.*}}!type ![[TYPE109:[0-9]+]] -pub fn foo110(_: Type1, _: Type1, _: Type1) { } -// CHECK: define{{.*}}foo110{{.*}}!type ![[TYPE110:[0-9]+]] -pub fn foo111(_: Type2) { } -// CHECK: define{{.*}}foo111{{.*}}!type ![[TYPE111:[0-9]+]] -pub fn foo112(_: Type2, _: Type2) { } -// CHECK: define{{.*}}foo112{{.*}}!type ![[TYPE112:[0-9]+]] -pub fn foo113(_: Type2, _: Type2, _: Type2) { } -// CHECK: define{{.*}}foo113{{.*}}!type ![[TYPE113:[0-9]+]] -pub fn foo114(_: Type3) { } -// CHECK: define{{.*}}foo114{{.*}}!type ![[TYPE114:[0-9]+]] -pub fn foo115(_: Type3, _: Type3) { } -// CHECK: define{{.*}}foo115{{.*}}!type ![[TYPE115:[0-9]+]] -pub fn foo116(_: Type3, _: Type3, _: Type3) { } -// CHECK: define{{.*}}foo116{{.*}}!type ![[TYPE116:[0-9]+]] -pub fn foo117(_: Type4) { } -// CHECK: define{{.*}}foo117{{.*}}!type ![[TYPE117:[0-9]+]] -pub fn foo118(_: Type4, _: Type4) { } -// CHECK: define{{.*}}foo118{{.*}}!type ![[TYPE118:[0-9]+]] -pub fn foo119(_: Type4, _: Type4, _: Type4) { } -// CHECK: define{{.*}}foo119{{.*}}!type ![[TYPE119:[0-9]+]] -pub fn foo120(_: Type5) { } -// CHECK: define{{.*}}foo120{{.*}}!type ![[TYPE120:[0-9]+]] -pub fn foo121(_: Type5, _: Type5) { } -// CHECK: define{{.*}}foo121{{.*}}!type ![[TYPE121:[0-9]+]] -pub fn foo122(_: Type5, _: Type5, _: Type5) { } -// CHECK: define{{.*}}foo122{{.*}}!type ![[TYPE122:[0-9]+]] -pub fn foo123(_: Type6) { } -// CHECK: define{{.*}}foo123{{.*}}!type ![[TYPE123:[0-9]+]] -pub fn foo124(_: Type6, _: Type6) { } -// CHECK: define{{.*}}foo124{{.*}}!type ![[TYPE124:[0-9]+]] -pub fn foo125(_: Type6, _: Type6, _: Type6) { } -// CHECK: define{{.*}}foo125{{.*}}!type ![[TYPE125:[0-9]+]] -pub fn foo126(_: Type7) { } -// CHECK: define{{.*}}foo126{{.*}}!type ![[TYPE126:[0-9]+]] -pub fn foo127(_: Type7, _: Type7) { } -// CHECK: define{{.*}}foo127{{.*}}!type ![[TYPE127:[0-9]+]] -pub fn foo128(_: Type7, _: Type7, _: Type7) { } -// CHECK: define{{.*}}foo128{{.*}}!type ![[TYPE128:[0-9]+]] -pub fn foo129(_: Type8) { } -// CHECK: define{{.*}}foo129{{.*}}!type ![[TYPE129:[0-9]+]] -pub fn foo130(_: Type8, _: Type8) { } -// CHECK: define{{.*}}foo130{{.*}}!type ![[TYPE130:[0-9]+]] -pub fn foo131(_: Type8, _: Type8, _: Type8) { } -// CHECK: define{{.*}}foo131{{.*}}!type ![[TYPE131:[0-9]+]] -pub fn foo132(_: Type9) { } -// CHECK: define{{.*}}foo132{{.*}}!type ![[TYPE132:[0-9]+]] -pub fn foo133(_: Type9, _: Type9) { } -// CHECK: define{{.*}}foo133{{.*}}!type ![[TYPE133:[0-9]+]] -pub fn foo134(_: Type9, _: Type9, _: Type9) { } -// CHECK: define{{.*}}foo134{{.*}}!type ![[TYPE134:[0-9]+]] -pub fn foo135(_: Type10) { } -// CHECK: define{{.*}}foo135{{.*}}!type ![[TYPE135:[0-9]+]] -pub fn foo136(_: Type10, _: Type10) { } -// CHECK: define{{.*}}foo136{{.*}}!type ![[TYPE136:[0-9]+]] -pub fn foo137(_: Type10, _: Type10, _: Type10) { } -// CHECK: define{{.*}}foo137{{.*}}!type ![[TYPE137:[0-9]+]] -pub fn foo138(_: Type11) { } -// CHECK: define{{.*}}foo138{{.*}}!type ![[TYPE138:[0-9]+]] -pub fn foo139(_: Type11, _: Type11) { } -// CHECK: define{{.*}}foo139{{.*}}!type ![[TYPE139:[0-9]+]] -pub fn foo140(_: Type11, _: Type11, _: Type11) { } -// CHECK: define{{.*}}foo140{{.*}}!type ![[TYPE140:[0-9]+]] -pub fn foo141(_: Type12) { } -// CHECK: define{{.*}}foo141{{.*}}!type ![[TYPE141:[0-9]+]] -pub fn foo142(_: Type12, _: Type12) { } -// CHECK: define{{.*}}foo142{{.*}}!type ![[TYPE142:[0-9]+]] -pub fn foo143(_: Type12, _: Type12, _: Type12) { } -// CHECK: define{{.*}}foo143{{.*}}!type ![[TYPE143:[0-9]+]] -pub fn foo144(_: Type13) { } -// CHECK: define{{.*}}foo144{{.*}}!type ![[TYPE144:[0-9]+]] -pub fn foo145(_: Type13, _: Type13) { } -// CHECK: define{{.*}}foo145{{.*}}!type ![[TYPE145:[0-9]+]] -pub fn foo146(_: Type13, _: Type13, _: Type13) { } -// CHECK: define{{.*}}foo146{{.*}}!type ![[TYPE146:[0-9]+]] - -// CHECK: ![[TYPE0]] = !{i64 0, !"_ZTSFvvE"} -// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFvvvE"} -// CHECK: ![[TYPE2]] = !{i64 0, !"_ZTSFvvvvE"} -// CHECK: ![[TYPE3]] = !{i64 0, !"_ZTSFvPvE"} -// CHECK: ![[TYPE4]] = !{i64 0, !"_ZTSFvPvS_E"} -// CHECK: ![[TYPE5]] = !{i64 0, !"_ZTSFvPvS_S_E"} -// CHECK: ![[TYPE6]] = !{i64 0, !"_ZTSFvPKvE"} -// CHECK: ![[TYPE7]] = !{i64 0, !"_ZTSFvPKvS0_E"} -// CHECK: ![[TYPE8]] = !{i64 0, !"_ZTSFvPKvS0_S0_E"} -// CHECK: ![[TYPE9]] = !{i64 0, !"_ZTSFvbE"} -// CHECK: ![[TYPE10]] = !{i64 0, !"_ZTSFvbbE"} -// CHECK: ![[TYPE11]] = !{i64 0, !"_ZTSFvbbbE"} -// CHECK: ![[TYPE12]] = !{i64 0, !"_ZTSFvu2i8E"} -// CHECK: ![[TYPE13]] = !{i64 0, !"_ZTSFvu2i8S_E"} -// CHECK: ![[TYPE14]] = !{i64 0, !"_ZTSFvu2i8S_S_E"} -// CHECK: ![[TYPE15]] = !{i64 0, !"_ZTSFvu3i16E"} -// CHECK: ![[TYPE16]] = !{i64 0, !"_ZTSFvu3i16S_E"} -// CHECK: ![[TYPE17]] = !{i64 0, !"_ZTSFvu3i16S_S_E"} -// CHECK: ![[TYPE18]] = !{i64 0, !"_ZTSFvu3i32E"} -// CHECK: ![[TYPE19]] = !{i64 0, !"_ZTSFvu3i32S_E"} -// CHECK: ![[TYPE20]] = !{i64 0, !"_ZTSFvu3i32S_S_E"} -// CHECK: ![[TYPE21]] = !{i64 0, !"_ZTSFvu3i64E"} -// CHECK: ![[TYPE22]] = !{i64 0, !"_ZTSFvu3i64S_E"} -// CHECK: ![[TYPE23]] = !{i64 0, !"_ZTSFvu3i64S_S_E"} -// CHECK: ![[TYPE24]] = !{i64 0, !"_ZTSFvu4i128E"} -// CHECK: ![[TYPE25]] = !{i64 0, !"_ZTSFvu4i128S_E"} -// CHECK: ![[TYPE26]] = !{i64 0, !"_ZTSFvu4i128S_S_E"} -// CHECK: ![[TYPE27]] = !{i64 0, !"_ZTSFvu5isizeE"} -// CHECK: ![[TYPE28]] = !{i64 0, !"_ZTSFvu5isizeS_E"} -// CHECK: ![[TYPE29]] = !{i64 0, !"_ZTSFvu5isizeS_S_E"} -// CHECK: ![[TYPE30]] = !{i64 0, !"_ZTSFvu2u8E"} -// CHECK: ![[TYPE31]] = !{i64 0, !"_ZTSFvu2u8S_E"} -// CHECK: ![[TYPE32]] = !{i64 0, !"_ZTSFvu2u8S_S_E"} -// CHECK: ![[TYPE33]] = !{i64 0, !"_ZTSFvu3u16E"} -// CHECK: ![[TYPE34]] = !{i64 0, !"_ZTSFvu3u16S_E"} -// CHECK: ![[TYPE35]] = !{i64 0, !"_ZTSFvu3u16S_S_E"} -// CHECK: ![[TYPE36]] = !{i64 0, !"_ZTSFvu3u32E"} -// CHECK: ![[TYPE37]] = !{i64 0, !"_ZTSFvu3u32S_E"} -// CHECK: ![[TYPE38]] = !{i64 0, !"_ZTSFvu3u32S_S_E"} -// CHECK: ![[TYPE39]] = !{i64 0, !"_ZTSFvu3u64E"} -// CHECK: ![[TYPE40]] = !{i64 0, !"_ZTSFvu3u64S_E"} -// CHECK: ![[TYPE41]] = !{i64 0, !"_ZTSFvu3u64S_S_E"} -// CHECK: ![[TYPE42]] = !{i64 0, !"_ZTSFvu4u128E"} -// CHECK: ![[TYPE43]] = !{i64 0, !"_ZTSFvu4u128S_E"} -// CHECK: ![[TYPE44]] = !{i64 0, !"_ZTSFvu4u128S_S_E"} -// CHECK: ![[TYPE45]] = !{i64 0, !"_ZTSFvu5usizeE"} -// CHECK: ![[TYPE46]] = !{i64 0, !"_ZTSFvu5usizeS_E"} -// CHECK: ![[TYPE47]] = !{i64 0, !"_ZTSFvu5usizeS_S_E"} -// CHECK: ![[TYPE48]] = !{i64 0, !"_ZTSFvu3f32E"} -// CHECK: ![[TYPE49]] = !{i64 0, !"_ZTSFvu3f32S_E"} -// CHECK: ![[TYPE50]] = !{i64 0, !"_ZTSFvu3f32S_S_E"} -// CHECK: ![[TYPE51]] = !{i64 0, !"_ZTSFvu3f64E"} -// CHECK: ![[TYPE52]] = !{i64 0, !"_ZTSFvu3f64S_E"} -// CHECK: ![[TYPE53]] = !{i64 0, !"_ZTSFvu3f64S_S_E"} -// CHECK: ![[TYPE54]] = !{i64 0, !"_ZTSFvu4charE"} -// CHECK: ![[TYPE55]] = !{i64 0, !"_ZTSFvu4charS_E"} -// CHECK: ![[TYPE56]] = !{i64 0, !"_ZTSFvu4charS_S_E"} -// CHECK: ![[TYPE57]] = !{i64 0, !"_ZTSFvu3refIu3strEE"} -// CHECK: ![[TYPE58]] = !{i64 0, !"_ZTSFvu3refIu3strES0_E"} -// CHECK: ![[TYPE59]] = !{i64 0, !"_ZTSFvu3refIu3strES0_S0_E"} -// CHECK: ![[TYPE60]] = !{i64 0, !"_ZTSFvu5tupleIu3i32S_EE"} -// CHECK: ![[TYPE61]] = !{i64 0, !"_ZTSFvu5tupleIu3i32S_ES0_E"} -// CHECK: ![[TYPE62]] = !{i64 0, !"_ZTSFvu5tupleIu3i32S_ES0_S0_E"} -// CHECK: ![[TYPE63]] = !{i64 0, !"_ZTSFvA32u3i32E"} -// CHECK: ![[TYPE64]] = !{i64 0, !"_ZTSFvA32u3i32S0_E"} -// CHECK: ![[TYPE65]] = !{i64 0, !"_ZTSFvA32u3i32S0_S0_E"} -// CHECK: ![[TYPE66]] = !{i64 0, !"_ZTSFvu3refIu5sliceIu3i32EEE"} -// CHECK: ![[TYPE67]] = !{i64 0, !"_ZTSFvu3refIu5sliceIu3i32EES1_E"} -// CHECK: ![[TYPE68]] = !{i64 0, !"_ZTSFvu3refIu5sliceIu3i32EES1_S1_E"} -// CHECK: ![[TYPE69]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi7Struct1Iu3i32EEE"} -// CHECK: ![[TYPE70]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi7Struct1Iu3i32EES1_E"} -// CHECK: ![[TYPE71]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi7Struct1Iu3i32EES1_S1_E"} -// CHECK: ![[TYPE72]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi5Enum1Iu3i32EEE"} -// CHECK: ![[TYPE73]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi5Enum1Iu3i32EES1_E"} -// CHECK: ![[TYPE74]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi5Enum1Iu3i32EES1_S1_E"} -// CHECK: ![[TYPE75]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Union1Iu3i32EEE"} -// CHECK: ![[TYPE76]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Union1Iu3i32EES1_E"} -// CHECK: ![[TYPE77]] = !{i64 0, !"_ZTSFvu3refIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Union1Iu3i32EES1_S1_E"} -// CHECK: ![[TYPE78]] = !{i64 0, !"_ZTSFvP5type1E"} -// CHECK: ![[TYPE79]] = !{i64 0, !"_ZTSFvP5type1S0_E"} -// CHECK: ![[TYPE80]] = !{i64 0, !"_ZTSFvP5type1S0_S0_E"} -// CHECK: ![[TYPE81]] = !{i64 0, !"_ZTSFvU3mutu3refIu3i32EE"} -// CHECK: ![[TYPE82]] = !{i64 0, !"_ZTSFvU3mutu3refIu3i32ES0_E"} -// CHECK: ![[TYPE83]] = !{i64 0, !"_ZTSFvU3mutu3refIu3i32ES0_S0_E"} -// CHECK: ![[TYPE84]] = !{i64 0, !"_ZTSFvu3refIu3i32EE"} -// CHECK: ![[TYPE85]] = !{i64 0, !"_ZTSFvu3refIu3i32EU3mutS0_E"} -// CHECK: ![[TYPE86]] = !{i64 0, !"_ZTSFvu3refIu3i32EU3mutS0_S1_E"} -// CHECK: ![[TYPE87]] = !{i64 0, !"_ZTSFvPu3i32E"} -// CHECK: ![[TYPE88]] = !{i64 0, !"_ZTSFvPu3i32PKS_E"} -// CHECK: ![[TYPE89]] = !{i64 0, !"_ZTSFvPu3i32PKS_S2_E"} -// CHECK: ![[TYPE90]] = !{i64 0, !"_ZTSFvPKu3i32E"} -// CHECK: ![[TYPE91]] = !{i64 0, !"_ZTSFvPKu3i32PS_E"} -// CHECK: ![[TYPE92]] = !{i64 0, !"_ZTSFvPKu3i32PS_S2_E"} -// CHECK: ![[TYPE93]] = !{i64 0, !"_ZTSFvPFu3i32S_EE"} -// CHECK: ![[TYPE94]] = !{i64 0, !"_ZTSFvPFu3i32S_ES0_E"} -// CHECK: ![[TYPE95]] = !{i64 0, !"_ZTSFvPFu3i32S_ES0_S0_E"} -// CHECK: ![[TYPE96]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEEE"} -// CHECK: ![[TYPE97]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEES5_E"} -// CHECK: ![[TYPE98]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function2FnIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEES5_S5_E"} -// CHECK: ![[TYPE99]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEEE"} -// CHECK: ![[TYPE100]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEES5_E"} -// CHECK: ![[TYPE101]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function5FnMutIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEES5_S5_E"} -// CHECK: ![[TYPE102]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEEE"} -// CHECK: ![[TYPE103]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEES5_E"} -// CHECK: ![[TYPE104]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnceIu5tupleIu3i32EEu{{[0-9]+}}NtNtNtNtC{{[[:print:]]+}}_4core3ops8function6FnOnce6OutputIS0_ES_u6regionEES5_S5_E"} -// CHECK: ![[TYPE105]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtC{{[[:print:]]+}}_4core6marker4Sendu6regionEEE"} -// CHECK: ![[TYPE106]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtC{{[[:print:]]+}}_4core6marker4Sendu6regionEES2_E"} -// CHECK: ![[TYPE107]] = !{i64 0, !"_ZTSFvu3refIu3dynIu{{[0-9]+}}NtNtC{{[[:print:]]+}}_4core6marker4Sendu6regionEES2_S2_E"} -// CHECK: ![[TYPE108]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NCNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn111{{[{}][{}]}}closure{{[}][}]}}Iu2i8PFvvEvEE"} -// CHECK: ![[TYPE109]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NCNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn111{{[{}][{}]}}closure{{[}][}]}}Iu2i8PFvvEvES1_E"} -// CHECK: ![[TYPE110]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NCNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn111{{[{}][{}]}}closure{{[}][}]}}Iu2i8PFvvEvES1_S1_E"} -// CHECK: ![[TYPE111]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NcNtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn13Foo15{{[{}][{}]}}constructor{{[}][}]}}E"} -// CHECK: ![[TYPE112]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NcNtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn13Foo15{{[{}][{}]}}constructor{{[}][}]}}S_E"} -// CHECK: ![[TYPE113]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NcNtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn13Foo15{{[{}][{}]}}constructor{{[}][}]}}S_S_E"} -// CHECK: ![[TYPE114]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNFNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn110{{[{}][{}]}}extern{{[}][}]}}3fooE"} -// CHECK: ![[TYPE115]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNFNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn110{{[{}][{}]}}extern{{[}][}]}}3fooS_E"} -// CHECK: ![[TYPE116]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNFNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn110{{[{}][{}]}}extern{{[}][}]}}3fooS_S_E"} -// CHECK: ![[TYPE117]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNCNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn1s0_11{{[{}][{}]}}closure{{[}][}]}}3FooE"} -// CHECK: ![[TYPE118]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNCNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn1s0_11{{[{}][{}]}}closure{{[}][}]}}3FooS_E"} -// CHECK: ![[TYPE119]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNCNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn1s0_11{{[{}][{}]}}closure{{[}][}]}}3FooS_S_E"} -// CHECK: ![[TYPE120]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNkNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn112{{[{}][{}]}}constant{{[}][}]}}3FooE"} -// CHECK: ![[TYPE121]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNkNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn112{{[{}][{}]}}constant{{[}][}]}}3FooS_E"} -// CHECK: ![[TYPE122]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNkNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn112{{[{}][{}]}}constant{{[}][}]}}3FooS_S_E"} -// CHECK: ![[TYPE123]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNINvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn18{{[{}][{}]}}impl{{[}][}]}}3fooIu3i32EE"} -// CHECK: ![[TYPE124]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNINvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn18{{[{}][{}]}}impl{{[}][}]}}3fooIu3i32ES0_E"} -// CHECK: ![[TYPE125]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNINvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn18{{[{}][{}]}}impl{{[}][}]}}3fooIu3i32ES0_S0_E"} -// CHECK: ![[TYPE126]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu3dynIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait1Iu3i32Eu6regionES_EE"} -// CHECK: ![[TYPE127]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu3dynIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait1Iu3i32Eu6regionES_ES3_E"} -// CHECK: ![[TYPE128]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu3dynIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait1Iu3i32Eu6regionES_ES3_S3_E"} -// CHECK: ![[TYPE129]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu3i32S_EE"} -// CHECK: ![[TYPE130]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu3i32S_ES0_E"} -// CHECK: ![[TYPE131]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu3i32S_ES0_S0_E"} -// CHECK: ![[TYPE132]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi7Struct1Iu3i32ES_EE"} -// CHECK: ![[TYPE133]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi7Struct1Iu3i32ES_ES1_E"} -// CHECK: ![[TYPE134]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NvNtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi6Trait13fooIu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi7Struct1Iu3i32ES_ES1_S1_E"} -// CHECK: ![[TYPE135]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn13QuxIu3i32Lu5usize32EEE"} -// CHECK: ![[TYPE136]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn13QuxIu3i32Lu5usize32EES2_E"} -// CHECK: ![[TYPE137]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn13QuxIu3i32Lu5usize32EES2_S2_E"} -// CHECK: ![[TYPE138]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NcNtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn15Quuux15{{[{}][{}]}}constructor{{[}][}]}}Iu6regionS_EE"} -// CHECK: ![[TYPE139]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NcNtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn15Quuux15{{[{}][{}]}}constructor{{[}][}]}}Iu6regionS_ES0_E"} -// CHECK: ![[TYPE140]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NcNtNvC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3fn15Quuux15{{[{}][{}]}}constructor{{[}][}]}}Iu6regionS_ES0_S0_E"} -// CHECK: ![[TYPE141]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3FooE"} -// CHECK: ![[TYPE142]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3FooS_E"} -// CHECK: ![[TYPE143]] = !{i64 0, !"_ZTSFvu{{[0-9]+}}NtC{{[[:print:]]+}}_51sanitizer_cfi_emit_type_metadata_id_itanium_cxx_abi3FooS_S_E"} -// CHECK: ![[TYPE144]] = !{i64 0, !"_ZTSFvu3refIu3refIvEEE"} -// CHECK: ![[TYPE145]] = !{i64 0, !"_ZTSFvu3refIu3refIvEES0_E"} -// CHECK: ![[TYPE146]] = !{i64 0, !"_ZTSFvu3refIu3refIvEES0_S0_E"} diff --git a/src/test/codegen/sanitizer-cfi-emit-type-metadata-itanium-cxx-abi.rs b/src/test/codegen/sanitizer-cfi-emit-type-metadata-itanium-cxx-abi.rs deleted file mode 100644 index bafc4c659..000000000 --- a/src/test/codegen/sanitizer-cfi-emit-type-metadata-itanium-cxx-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// Verifies that type metadata for functions are emitted. -// -// needs-sanitizer-cfi -// compile-flags: -Clto -Cno-prepopulate-passes -Ctarget-feature=-crt-static -Zsanitizer=cfi - -#![crate_type="lib"] - -pub fn foo(f: fn(i32) -> i32, arg: i32) -> i32 { - // CHECK-LABEL: define{{.*}}foo - // CHECK-SAME: {{.*}}!type ![[TYPE1:[0-9]+]] - // CHECK: call i1 @llvm.type.test({{i8\*|ptr}} {{%f|%0}}, metadata !"_ZTSFu3i32S_E") - f(arg) -} - -pub fn bar(f: fn(i32, i32) -> i32, arg1: i32, arg2: i32) -> i32 { - // CHECK-LABEL: define{{.*}}bar - // CHECK-SAME: {{.*}}!type ![[TYPE2:[0-9]+]] - // CHECK: call i1 @llvm.type.test({{i8\*|ptr}} {{%f|%0}}, metadata !"_ZTSFu3i32S_S_E") - f(arg1, arg2) -} - -pub fn baz(f: fn(i32, i32, i32) -> i32, arg1: i32, arg2: i32, arg3: i32) -> i32 { - // CHECK-LABEL: define{{.*}}baz - // CHECK-SAME: {{.*}}!type ![[TYPE3:[0-9]+]] - // CHECK: call i1 @llvm.type.test({{i8\*|ptr}} {{%f|%0}}, metadata !"_ZTSFu3i32S_S_S_E") - f(arg1, arg2, arg3) -} - -// CHECK: ![[TYPE1]] = !{i64 0, !"_ZTSFu3i32PFS_S_ES_E"} -// CHECK: ![[TYPE2]] = !{i64 0, !"_ZTSFu3i32PFS_S_S_ES_S_E"} -// CHECK: ![[TYPE3]] = !{i64 0, !"_ZTSFu3i32PFS_S_S_S_ES_S_S_E"} diff --git a/src/test/codegen/sanitizer-memory-track-orgins.rs b/src/test/codegen/sanitizer-memory-track-orgins.rs deleted file mode 100644 index 4bd50508d..000000000 --- a/src/test/codegen/sanitizer-memory-track-orgins.rs +++ /dev/null @@ -1,30 +0,0 @@ -// Verifies that MemorySanitizer track-origins level can be controlled -// with -Zsanitizer-memory-track-origins option. -// -// needs-sanitizer-memory -// revisions:MSAN-0 MSAN-1 MSAN-2 MSAN-1-LTO MSAN-2-LTO -// -//[MSAN-0] compile-flags: -Zsanitizer=memory -//[MSAN-1] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins=1 -//[MSAN-2] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins -//[MSAN-1-LTO] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins=1 -C lto=fat -//[MSAN-2-LTO] compile-flags: -Zsanitizer=memory -Zsanitizer-memory-track-origins -C lto=fat - -#![crate_type="lib"] - -// MSAN-0-NOT: @__msan_track_origins -// MSAN-1: @__msan_track_origins = weak_odr {{.*}}constant i32 1 -// MSAN-2: @__msan_track_origins = weak_odr {{.*}}constant i32 2 -// MSAN-1-LTO: @__msan_track_origins = weak_odr {{.*}}constant i32 1 -// MSAN-2-LTO: @__msan_track_origins = weak_odr {{.*}}constant i32 2 -// -// MSAN-0-LABEL: define void @copy( -// MSAN-1-LABEL: define void @copy( -// MSAN-2-LABEL: define void @copy( -#[no_mangle] -pub fn copy(dst: &mut i32, src: &i32) { - // MSAN-0-NOT: call i32 @__msan_chain_origin( - // MSAN-1-NOT: call i32 @__msan_chain_origin( - // MSAN-2: call i32 @__msan_chain_origin( - *dst = *src; -} diff --git a/src/test/codegen/sanitizer-no-sanitize-inlining.rs b/src/test/codegen/sanitizer-no-sanitize-inlining.rs deleted file mode 100644 index f4af60bae..000000000 --- a/src/test/codegen/sanitizer-no-sanitize-inlining.rs +++ /dev/null @@ -1,30 +0,0 @@ -// Verifies that no_sanitize attribute prevents inlining when -// given sanitizer is enabled, but has no effect on inlining otherwise. -// -// needs-sanitizer-address -// needs-sanitizer-leak -// revisions: ASAN LSAN -//[ASAN] compile-flags: -Zsanitizer=address -C opt-level=3 -Z mir-opt-level=4 -//[LSAN] compile-flags: -Zsanitizer=leak -C opt-level=3 -Z mir-opt-level=4 - -#![crate_type="lib"] -#![feature(no_sanitize)] - -// ASAN-LABEL: define void @test -// ASAN: call {{.*}} @random_inline -// ASAN: } -// -// LSAN-LABEL: define void @test -// LSAN-NO: call -// LSAN: } -#[no_mangle] -pub fn test(n: &mut u32) { - random_inline(n); -} - -#[no_sanitize(address)] -#[inline] -#[no_mangle] -pub fn random_inline(n: &mut u32) { - *n = 42; -} diff --git a/src/test/codegen/sanitizer-no-sanitize.rs b/src/test/codegen/sanitizer-no-sanitize.rs deleted file mode 100644 index fb9d249da..000000000 --- a/src/test/codegen/sanitizer-no-sanitize.rs +++ /dev/null @@ -1,29 +0,0 @@ -// Verifies that no_sanitize attribute can be used to -// selectively disable sanitizer instrumentation. -// -// needs-sanitizer-address -// compile-flags: -Zsanitizer=address - -#![crate_type="lib"] -#![feature(no_sanitize)] - -// CHECK-LABEL: ; sanitizer_no_sanitize::unsanitized -// CHECK-NEXT: ; Function Attrs: -// CHECK-NOT: sanitize_address -// CHECK: start: -// CHECK-NOT: call void @__asan_report_load -// CHECK: } -#[no_sanitize(address)] -pub fn unsanitized(b: &mut u8) -> u8 { - *b -} - -// CHECK-LABEL: ; sanitizer_no_sanitize::sanitized -// CHECK-NEXT: ; Function Attrs: -// CHECK: sanitize_address -// CHECK: start: -// CHECK: call void @__asan_report_load -// CHECK: } -pub fn sanitized(b: &mut u8) -> u8 { - *b -} diff --git a/src/test/codegen/sanitizer-recover.rs b/src/test/codegen/sanitizer-recover.rs deleted file mode 100644 index 7ce0fa0a2..000000000 --- a/src/test/codegen/sanitizer-recover.rs +++ /dev/null @@ -1,49 +0,0 @@ -// Verifies that AddressSanitizer and MemorySanitizer -// recovery mode can be enabled with -Zsanitizer-recover. -// -// needs-sanitizer-address -// needs-sanitizer-memory -// revisions:ASAN ASAN-RECOVER MSAN MSAN-RECOVER MSAN-RECOVER-LTO -// no-prefer-dynamic -// -//[ASAN] compile-flags: -Zsanitizer=address -//[ASAN-RECOVER] compile-flags: -Zsanitizer=address -Zsanitizer-recover=address -//[MSAN] compile-flags: -Zsanitizer=memory -//[MSAN-RECOVER] compile-flags: -Zsanitizer=memory -Zsanitizer-recover=memory -//[MSAN-RECOVER-LTO] compile-flags: -Zsanitizer=memory -Zsanitizer-recover=memory -C lto=fat -// -// MSAN-NOT: @__msan_keep_going -// MSAN-RECOVER: @__msan_keep_going = weak_odr {{.*}}constant i32 1 -// MSAN-RECOVER-LTO: @__msan_keep_going = weak_odr {{.*}}constant i32 1 - -// ASAN-LABEL: define dso_local i32 @penguin( -// ASAN: call void @__asan_report_load4(i64 %0) -// ASAN: unreachable -// ASAN: } -// -// ASAN-RECOVER-LABEL: define dso_local i32 @penguin( -// ASAN-RECOVER: call void @__asan_report_load4_noabort( -// ASAN-RECOVER-NOT: unreachable -// ASAN: } -// -// MSAN-LABEL: define dso_local i32 @penguin( -// MSAN: call void @__msan_warning{{(_with_origin_noreturn\(i32 0\)|_noreturn\(\))}} -// MSAN: unreachable -// MSAN: } -// -// MSAN-RECOVER-LABEL: define dso_local i32 @penguin( -// MSAN-RECOVER: call void @__msan_warning{{(_with_origin\(i32 0\)|\(\))}} -// MSAN-RECOVER-NOT: unreachable -// MSAN-RECOVER: } -// -// MSAN-RECOVER-LTO-LABEL: define dso_local i32 @penguin( -// MSAN-RECOVER-LTO: call void @__msan_warning{{(_with_origin\(i32 0\)|\(\))}} -// MSAN-RECOVER-LTO-NOT: unreachable -// MSAN-RECOVER-LTO: } -// -#[no_mangle] -pub fn penguin(p: &mut i32) -> i32 { - *p -} - -fn main() {} diff --git a/src/test/codegen/sanitizer_memtag_attr_check.rs b/src/test/codegen/sanitizer_memtag_attr_check.rs deleted file mode 100644 index 2fd362656..000000000 --- a/src/test/codegen/sanitizer_memtag_attr_check.rs +++ /dev/null @@ -1,12 +0,0 @@ -// This tests that the sanitize_memtag attribute is -// applied when enabling the memtag sanitizer. -// -// needs-sanitizer-memtag -// compile-flags: -Zsanitizer=memtag -Ctarget-feature=+mte - -#![crate_type = "lib"] - -// CHECK: ; Function Attrs:{{.*}}sanitize_memtag -pub fn tagged() {} - -// CHECK: attributes #0 = {{.*}}sanitize_memtag diff --git a/src/test/codegen/sanitizer_scs_attr_check.rs b/src/test/codegen/sanitizer_scs_attr_check.rs deleted file mode 100644 index a885d9117..000000000 --- a/src/test/codegen/sanitizer_scs_attr_check.rs +++ /dev/null @@ -1,17 +0,0 @@ -// This tests that the shadowcallstack attribute is -// applied when enabling the shadow-call-stack sanitizer. -// -// needs-sanitizer-shadow-call-stack -// compile-flags: -Zsanitizer=shadow-call-stack - -#![crate_type = "lib"] -#![feature(no_sanitize)] - -// CHECK: ; sanitizer_scs_attr_check::scs -// CHECK-NEXT: ; Function Attrs:{{.*}}shadowcallstack -pub fn scs() {} - -// CHECK: ; sanitizer_scs_attr_check::no_scs -// CHECK-NOT: ; Function Attrs:{{.*}}shadowcallstack -#[no_sanitize(shadow_call_stack)] -pub fn no_scs() {} diff --git a/src/test/codegen/scalar-pair-bool.rs b/src/test/codegen/scalar-pair-bool.rs deleted file mode 100644 index 264f28fdb..000000000 --- a/src/test/codegen/scalar-pair-bool.rs +++ /dev/null @@ -1,45 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK: define{{.*}}{ i8, i8 } @pair_bool_bool(i1 noundef zeroext %pair.0, i1 noundef zeroext %pair.1) -#[no_mangle] -pub fn pair_bool_bool(pair: (bool, bool)) -> (bool, bool) { - pair -} - -// CHECK: define{{.*}}{ i8, i32 } @pair_bool_i32(i1 noundef zeroext %pair.0, i32 %pair.1) -#[no_mangle] -pub fn pair_bool_i32(pair: (bool, i32)) -> (bool, i32) { - pair -} - -// CHECK: define{{.*}}{ i32, i8 } @pair_i32_bool(i32 %pair.0, i1 noundef zeroext %pair.1) -#[no_mangle] -pub fn pair_i32_bool(pair: (i32, bool)) -> (i32, bool) { - pair -} - -// CHECK: define{{.*}}{ i8, i8 } @pair_and_or(i1 noundef zeroext %_1.0, i1 noundef zeroext %_1.1) -#[no_mangle] -pub fn pair_and_or((a, b): (bool, bool)) -> (bool, bool) { - // Make sure it can operate directly on the unpacked args - // (but it might not be using simple and/or instructions) - // CHECK-DAG: %_1.0 - // CHECK-DAG: %_1.1 - (a && b, a || b) -} - -// CHECK: define{{.*}}void @pair_branches(i1 noundef zeroext %_1.0, i1 noundef zeroext %_1.1) -#[no_mangle] -pub fn pair_branches((a, b): (bool, bool)) { - // Make sure it can branch directly on the unpacked bool args - // CHECK: br i1 %_1.0 - if a { - println!("Hello!"); - } - // CHECK: br i1 %_1.1 - if b { - println!("Goodbye!"); - } -} diff --git a/src/test/codegen/set-discriminant-invalid.rs b/src/test/codegen/set-discriminant-invalid.rs deleted file mode 100644 index bccb9e4c7..000000000 --- a/src/test/codegen/set-discriminant-invalid.rs +++ /dev/null @@ -1,43 +0,0 @@ -// compile-flags: -C opt-level=0 -#![crate_type = "lib"] - -pub enum ApiError {} -#[allow(dead_code)] -pub struct TokioError { - b: bool, -} -pub enum Error { - Api { - source: ApiError, - }, - Ethereum, - Tokio { - source: TokioError, - }, -} -struct Api; -impl IntoError<Error> for Api -{ - type Source = ApiError; - // CHECK-LABEL: @into_error - // CHECK: llvm.trap() - // Also check the next two instructions to make sure we do not match against `trap` - // elsewhere in the code. - // CHECK-NEXT: load - // CHECK-NEXT: ret - #[no_mangle] - fn into_error(self, error: Self::Source) -> Error { - Error::Api { - source: error, - } - } -} - -pub trait IntoError<E> -{ - /// The underlying error - type Source; - - /// Combine the information to produce the error - fn into_error(self, source: Self::Source) -> E; -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-abs.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-abs.rs deleted file mode 100644 index e7bb2327a..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-abs.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fabs<T>(x: T) -> T; -} - -// CHECK-LABEL: @fabs_32x2 -#[no_mangle] -pub unsafe fn fabs_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.fabs.v2f32 - simd_fabs(a) -} - -// CHECK-LABEL: @fabs_32x4 -#[no_mangle] -pub unsafe fn fabs_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.fabs.v4f32 - simd_fabs(a) -} - -// CHECK-LABEL: @fabs_32x8 -#[no_mangle] -pub unsafe fn fabs_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.fabs.v8f32 - simd_fabs(a) -} - -// CHECK-LABEL: @fabs_32x16 -#[no_mangle] -pub unsafe fn fabs_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.fabs.v16f32 - simd_fabs(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @fabs_64x4 -#[no_mangle] -pub unsafe fn fabs_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.fabs.v4f64 - simd_fabs(a) -} - -// CHECK-LABEL: @fabs_64x2 -#[no_mangle] -pub unsafe fn fabs_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.fabs.v2f64 - simd_fabs(a) -} - -// CHECK-LABEL: @fabs_64x8 -#[no_mangle] -pub unsafe fn fabs_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.fabs.v8f64 - simd_fabs(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-ceil.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-ceil.rs deleted file mode 100644 index e33482d75..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-ceil.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_ceil<T>(x: T) -> T; -} - -// CHECK-LABEL: @ceil_32x2 -#[no_mangle] -pub unsafe fn ceil_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.ceil.v2f32 - simd_ceil(a) -} - -// CHECK-LABEL: @ceil_32x4 -#[no_mangle] -pub unsafe fn ceil_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.ceil.v4f32 - simd_ceil(a) -} - -// CHECK-LABEL: @ceil_32x8 -#[no_mangle] -pub unsafe fn ceil_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.ceil.v8f32 - simd_ceil(a) -} - -// CHECK-LABEL: @ceil_32x16 -#[no_mangle] -pub unsafe fn ceil_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.ceil.v16f32 - simd_ceil(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @ceil_64x4 -#[no_mangle] -pub unsafe fn ceil_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.ceil.v4f64 - simd_ceil(a) -} - -// CHECK-LABEL: @ceil_64x2 -#[no_mangle] -pub unsafe fn ceil_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.ceil.v2f64 - simd_ceil(a) -} - -// CHECK-LABEL: @ceil_64x8 -#[no_mangle] -pub unsafe fn ceil_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.ceil.v8f64 - simd_ceil(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-cos.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-cos.rs deleted file mode 100644 index 0f52952bc..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-cos.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fcos<T>(x: T) -> T; -} - -// CHECK-LABEL: @fcos_32x2 -#[no_mangle] -pub unsafe fn fcos_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.cos.v2f32 - simd_fcos(a) -} - -// CHECK-LABEL: @fcos_32x4 -#[no_mangle] -pub unsafe fn fcos_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.cos.v4f32 - simd_fcos(a) -} - -// CHECK-LABEL: @fcos_32x8 -#[no_mangle] -pub unsafe fn fcos_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.cos.v8f32 - simd_fcos(a) -} - -// CHECK-LABEL: @fcos_32x16 -#[no_mangle] -pub unsafe fn fcos_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.cos.v16f32 - simd_fcos(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @fcos_64x4 -#[no_mangle] -pub unsafe fn fcos_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.cos.v4f64 - simd_fcos(a) -} - -// CHECK-LABEL: @fcos_64x2 -#[no_mangle] -pub unsafe fn fcos_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.cos.v2f64 - simd_fcos(a) -} - -// CHECK-LABEL: @fcos_64x8 -#[no_mangle] -pub unsafe fn fcos_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.cos.v8f64 - simd_fcos(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-exp.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-exp.rs deleted file mode 100644 index 1154acf69..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-exp.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fexp<T>(x: T) -> T; -} - -// CHECK-LABEL: @exp_32x2 -#[no_mangle] -pub unsafe fn exp_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.exp.v2f32 - simd_fexp(a) -} - -// CHECK-LABEL: @exp_32x4 -#[no_mangle] -pub unsafe fn exp_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.exp.v4f32 - simd_fexp(a) -} - -// CHECK-LABEL: @exp_32x8 -#[no_mangle] -pub unsafe fn exp_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.exp.v8f32 - simd_fexp(a) -} - -// CHECK-LABEL: @exp_32x16 -#[no_mangle] -pub unsafe fn exp_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.exp.v16f32 - simd_fexp(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @exp_64x4 -#[no_mangle] -pub unsafe fn exp_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.exp.v4f64 - simd_fexp(a) -} - -// CHECK-LABEL: @exp_64x2 -#[no_mangle] -pub unsafe fn exp_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.exp.v2f64 - simd_fexp(a) -} - -// CHECK-LABEL: @exp_64x8 -#[no_mangle] -pub unsafe fn exp_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.exp.v8f64 - simd_fexp(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-exp2.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-exp2.rs deleted file mode 100644 index 929dc9ac8..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-exp2.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fexp2<T>(x: T) -> T; -} - -// CHECK-LABEL: @exp2_32x2 -#[no_mangle] -pub unsafe fn exp2_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.exp2.v2f32 - simd_fexp2(a) -} - -// CHECK-LABEL: @exp2_32x4 -#[no_mangle] -pub unsafe fn exp2_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.exp2.v4f32 - simd_fexp2(a) -} - -// CHECK-LABEL: @exp2_32x8 -#[no_mangle] -pub unsafe fn exp2_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.exp2.v8f32 - simd_fexp2(a) -} - -// CHECK-LABEL: @exp2_32x16 -#[no_mangle] -pub unsafe fn exp2_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.exp2.v16f32 - simd_fexp2(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @exp2_64x4 -#[no_mangle] -pub unsafe fn exp2_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.exp2.v4f64 - simd_fexp2(a) -} - -// CHECK-LABEL: @exp2_64x2 -#[no_mangle] -pub unsafe fn exp2_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.exp2.v2f64 - simd_fexp2(a) -} - -// CHECK-LABEL: @exp2_64x8 -#[no_mangle] -pub unsafe fn exp2_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.exp2.v8f64 - simd_fexp2(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-floor.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-floor.rs deleted file mode 100644 index 56ca644f6..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-floor.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_floor<T>(x: T) -> T; -} - -// CHECK-LABEL: @floor_32x2 -#[no_mangle] -pub unsafe fn floor_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.floor.v2f32 - simd_floor(a) -} - -// CHECK-LABEL: @floor_32x4 -#[no_mangle] -pub unsafe fn floor_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.floor.v4f32 - simd_floor(a) -} - -// CHECK-LABEL: @floor_32x8 -#[no_mangle] -pub unsafe fn floor_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.floor.v8f32 - simd_floor(a) -} - -// CHECK-LABEL: @floor_32x16 -#[no_mangle] -pub unsafe fn floor_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.floor.v16f32 - simd_floor(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @floor_64x4 -#[no_mangle] -pub unsafe fn floor_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.floor.v4f64 - simd_floor(a) -} - -// CHECK-LABEL: @floor_64x2 -#[no_mangle] -pub unsafe fn floor_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.floor.v2f64 - simd_floor(a) -} - -// CHECK-LABEL: @floor_64x8 -#[no_mangle] -pub unsafe fn floor_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.floor.v8f64 - simd_floor(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-fma.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-fma.rs deleted file mode 100644 index fd65cb72b..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-fma.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fma<T>(x: T, b: T, c: T) -> T; -} - -// CHECK-LABEL: @fma_32x2 -#[no_mangle] -pub unsafe fn fma_32x2(a: f32x2, b: f32x2, c: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.fma.v2f32 - simd_fma(a, b, c) -} - -// CHECK-LABEL: @fma_32x4 -#[no_mangle] -pub unsafe fn fma_32x4(a: f32x4, b: f32x4, c: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.fma.v4f32 - simd_fma(a, b, c) -} - -// CHECK-LABEL: @fma_32x8 -#[no_mangle] -pub unsafe fn fma_32x8(a: f32x8, b: f32x8, c: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.fma.v8f32 - simd_fma(a, b, c) -} - -// CHECK-LABEL: @fma_32x16 -#[no_mangle] -pub unsafe fn fma_32x16(a: f32x16, b: f32x16, c: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.fma.v16f32 - simd_fma(a, b, c) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @fma_64x4 -#[no_mangle] -pub unsafe fn fma_64x4(a: f64x4, b: f64x4, c: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.fma.v4f64 - simd_fma(a, b, c) -} - -// CHECK-LABEL: @fma_64x2 -#[no_mangle] -pub unsafe fn fma_64x2(a: f64x2, b: f64x2, c: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.fma.v2f64 - simd_fma(a, b, c) -} - -// CHECK-LABEL: @fma_64x8 -#[no_mangle] -pub unsafe fn fma_64x8(a: f64x8, b: f64x8, c: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.fma.v8f64 - simd_fma(a, b, c) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-fsqrt.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-fsqrt.rs deleted file mode 100644 index adc191925..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-fsqrt.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fsqrt<T>(x: T) -> T; -} - -// CHECK-LABEL: @fsqrt_32x2 -#[no_mangle] -pub unsafe fn fsqrt_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.sqrt.v2f32 - simd_fsqrt(a) -} - -// CHECK-LABEL: @fsqrt_32x4 -#[no_mangle] -pub unsafe fn fsqrt_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.sqrt.v4f32 - simd_fsqrt(a) -} - -// CHECK-LABEL: @fsqrt_32x8 -#[no_mangle] -pub unsafe fn fsqrt_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.sqrt.v8f32 - simd_fsqrt(a) -} - -// CHECK-LABEL: @fsqrt_32x16 -#[no_mangle] -pub unsafe fn fsqrt_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.sqrt.v16f32 - simd_fsqrt(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @fsqrt_64x4 -#[no_mangle] -pub unsafe fn fsqrt_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.sqrt.v4f64 - simd_fsqrt(a) -} - -// CHECK-LABEL: @fsqrt_64x2 -#[no_mangle] -pub unsafe fn fsqrt_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.sqrt.v2f64 - simd_fsqrt(a) -} - -// CHECK-LABEL: @fsqrt_64x8 -#[no_mangle] -pub unsafe fn fsqrt_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.sqrt.v8f64 - simd_fsqrt(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log.rs deleted file mode 100644 index c072519c0..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_flog<T>(x: T) -> T; -} - -// CHECK-LABEL: @log_32x2 -#[no_mangle] -pub unsafe fn log_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.log.v2f32 - simd_flog(a) -} - -// CHECK-LABEL: @log_32x4 -#[no_mangle] -pub unsafe fn log_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.log.v4f32 - simd_flog(a) -} - -// CHECK-LABEL: @log_32x8 -#[no_mangle] -pub unsafe fn log_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.log.v8f32 - simd_flog(a) -} - -// CHECK-LABEL: @log_32x16 -#[no_mangle] -pub unsafe fn log_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.log.v16f32 - simd_flog(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @log_64x4 -#[no_mangle] -pub unsafe fn log_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.log.v4f64 - simd_flog(a) -} - -// CHECK-LABEL: @log_64x2 -#[no_mangle] -pub unsafe fn log_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.log.v2f64 - simd_flog(a) -} - -// CHECK-LABEL: @log_64x8 -#[no_mangle] -pub unsafe fn log_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.log.v8f64 - simd_flog(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log10.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log10.rs deleted file mode 100644 index 5fd648995..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log10.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_flog10<T>(x: T) -> T; -} - -// CHECK-LABEL: @log10_32x2 -#[no_mangle] -pub unsafe fn log10_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.log10.v2f32 - simd_flog10(a) -} - -// CHECK-LABEL: @log10_32x4 -#[no_mangle] -pub unsafe fn log10_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.log10.v4f32 - simd_flog10(a) -} - -// CHECK-LABEL: @log10_32x8 -#[no_mangle] -pub unsafe fn log10_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.log10.v8f32 - simd_flog10(a) -} - -// CHECK-LABEL: @log10_32x16 -#[no_mangle] -pub unsafe fn log10_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.log10.v16f32 - simd_flog10(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @log10_64x4 -#[no_mangle] -pub unsafe fn log10_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.log10.v4f64 - simd_flog10(a) -} - -// CHECK-LABEL: @log10_64x2 -#[no_mangle] -pub unsafe fn log10_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.log10.v2f64 - simd_flog10(a) -} - -// CHECK-LABEL: @log10_64x8 -#[no_mangle] -pub unsafe fn log10_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.log10.v8f64 - simd_flog10(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log2.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log2.rs deleted file mode 100644 index 35175f0ca..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-log2.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_flog2<T>(x: T) -> T; -} - -// CHECK-LABEL: @log2_32x2 -#[no_mangle] -pub unsafe fn log2_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.log2.v2f32 - simd_flog2(a) -} - -// CHECK-LABEL: @log2_32x4 -#[no_mangle] -pub unsafe fn log2_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.log2.v4f32 - simd_flog2(a) -} - -// CHECK-LABEL: @log2_32x8 -#[no_mangle] -pub unsafe fn log2_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.log2.v8f32 - simd_flog2(a) -} - -// CHECK-LABEL: @log2_32x16 -#[no_mangle] -pub unsafe fn log2_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.log2.v16f32 - simd_flog2(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @log2_64x4 -#[no_mangle] -pub unsafe fn log2_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.log2.v4f64 - simd_flog2(a) -} - -// CHECK-LABEL: @log2_64x2 -#[no_mangle] -pub unsafe fn log2_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.log2.v2f64 - simd_flog2(a) -} - -// CHECK-LABEL: @log2_64x8 -#[no_mangle] -pub unsafe fn log2_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.log2.v8f64 - simd_flog2(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-minmax.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-minmax.rs deleted file mode 100644 index 4e0abed78..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-minmax.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fmin<T>(x: T, y: T) -> T; - fn simd_fmax<T>(x: T, y: T) -> T; -} - -// CHECK-LABEL: @fmin -#[no_mangle] -pub unsafe fn fmin(a: f32x4, b: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.minnum.v4f32 - simd_fmin(a, b) -} - -// CHECK-LABEL: @fmax -#[no_mangle] -pub unsafe fn fmax(a: f32x4, b: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.maxnum.v4f32 - simd_fmax(a, b) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-pow.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-pow.rs deleted file mode 100644 index 3b8d611ab..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-pow.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fpow<T>(x: T, b: T) -> T; -} - -// CHECK-LABEL: @fpow_32x2 -#[no_mangle] -pub unsafe fn fpow_32x2(a: f32x2, b: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.pow.v2f32 - simd_fpow(a, b) -} - -// CHECK-LABEL: @fpow_32x4 -#[no_mangle] -pub unsafe fn fpow_32x4(a: f32x4, b: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.pow.v4f32 - simd_fpow(a, b) -} - -// CHECK-LABEL: @fpow_32x8 -#[no_mangle] -pub unsafe fn fpow_32x8(a: f32x8, b: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.pow.v8f32 - simd_fpow(a, b) -} - -// CHECK-LABEL: @fpow_32x16 -#[no_mangle] -pub unsafe fn fpow_32x16(a: f32x16, b: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.pow.v16f32 - simd_fpow(a, b) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @fpow_64x4 -#[no_mangle] -pub unsafe fn fpow_64x4(a: f64x4, b: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.pow.v4f64 - simd_fpow(a, b) -} - -// CHECK-LABEL: @fpow_64x2 -#[no_mangle] -pub unsafe fn fpow_64x2(a: f64x2, b: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.pow.v2f64 - simd_fpow(a, b) -} - -// CHECK-LABEL: @fpow_64x8 -#[no_mangle] -pub unsafe fn fpow_64x8(a: f64x8, b: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.pow.v8f64 - simd_fpow(a, b) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-powi.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-powi.rs deleted file mode 100644 index e80c50c10..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-powi.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fpowi<T>(x: T, b: i32) -> T; -} - -// CHECK-LABEL: @fpowi_32x2 -#[no_mangle] -pub unsafe fn fpowi_32x2(a: f32x2, b: i32) -> f32x2 { - // CHECK: call <2 x float> @llvm.powi.v2f32 - simd_fpowi(a, b) -} - -// CHECK-LABEL: @fpowi_32x4 -#[no_mangle] -pub unsafe fn fpowi_32x4(a: f32x4, b: i32) -> f32x4 { - // CHECK: call <4 x float> @llvm.powi.v4f32 - simd_fpowi(a, b) -} - -// CHECK-LABEL: @fpowi_32x8 -#[no_mangle] -pub unsafe fn fpowi_32x8(a: f32x8, b: i32) -> f32x8 { - // CHECK: call <8 x float> @llvm.powi.v8f32 - simd_fpowi(a, b) -} - -// CHECK-LABEL: @fpowi_32x16 -#[no_mangle] -pub unsafe fn fpowi_32x16(a: f32x16, b: i32) -> f32x16 { - // CHECK: call <16 x float> @llvm.powi.v16f32 - simd_fpowi(a, b) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @fpowi_64x4 -#[no_mangle] -pub unsafe fn fpowi_64x4(a: f64x4, b: i32) -> f64x4 { - // CHECK: call <4 x double> @llvm.powi.v4f64 - simd_fpowi(a, b) -} - -// CHECK-LABEL: @fpowi_64x2 -#[no_mangle] -pub unsafe fn fpowi_64x2(a: f64x2, b: i32) -> f64x2 { - // CHECK: call <2 x double> @llvm.powi.v2f64 - simd_fpowi(a, b) -} - -// CHECK-LABEL: @fpowi_64x8 -#[no_mangle] -pub unsafe fn fpowi_64x8(a: f64x8, b: i32) -> f64x8 { - // CHECK: call <8 x double> @llvm.powi.v8f64 - simd_fpowi(a, b) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-sin.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-float-sin.rs deleted file mode 100644 index 9e3fab49a..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-float-sin.rs +++ /dev/null @@ -1,92 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x2(pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x16(pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32, - pub f32, pub f32, pub f32, pub f32); - -extern "platform-intrinsic" { - fn simd_fsin<T>(x: T) -> T; -} - -// CHECK-LABEL: @fsin_32x2 -#[no_mangle] -pub unsafe fn fsin_32x2(a: f32x2) -> f32x2 { - // CHECK: call <2 x float> @llvm.sin.v2f32 - simd_fsin(a) -} - -// CHECK-LABEL: @fsin_32x4 -#[no_mangle] -pub unsafe fn fsin_32x4(a: f32x4) -> f32x4 { - // CHECK: call <4 x float> @llvm.sin.v4f32 - simd_fsin(a) -} - -// CHECK-LABEL: @fsin_32x8 -#[no_mangle] -pub unsafe fn fsin_32x8(a: f32x8) -> f32x8 { - // CHECK: call <8 x float> @llvm.sin.v8f32 - simd_fsin(a) -} - -// CHECK-LABEL: @fsin_32x16 -#[no_mangle] -pub unsafe fn fsin_32x16(a: f32x16) -> f32x16 { - // CHECK: call <16 x float> @llvm.sin.v16f32 - simd_fsin(a) -} - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x2(pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x4(pub f64, pub f64, pub f64, pub f64); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f64x8(pub f64, pub f64, pub f64, pub f64, - pub f64, pub f64, pub f64, pub f64); - -// CHECK-LABEL: @fsin_64x4 -#[no_mangle] -pub unsafe fn fsin_64x4(a: f64x4) -> f64x4 { - // CHECK: call <4 x double> @llvm.sin.v4f64 - simd_fsin(a) -} - -// CHECK-LABEL: @fsin_64x2 -#[no_mangle] -pub unsafe fn fsin_64x2(a: f64x2) -> f64x2 { - // CHECK: call <2 x double> @llvm.sin.v2f64 - simd_fsin(a) -} - -// CHECK-LABEL: @fsin_64x8 -#[no_mangle] -pub unsafe fn fsin_64x8(a: f64x8) -> f64x8 { - // CHECK: call <8 x double> @llvm.sin.v8f64 - simd_fsin(a) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs deleted file mode 100644 index 6fb0ceb40..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-arithmetic-saturating.rs +++ /dev/null @@ -1,692 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] -#![deny(unused)] - -// signed integer types - -#[repr(simd)] #[derive(Copy, Clone)] pub struct i8x2(i8, i8); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i8x4(i8, i8, i8, i8); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i8x8( - i8, i8, i8, i8, i8, i8, i8, i8, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i8x16( - i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i8x32( - i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, - i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i8x64( - i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, - i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, - i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, - i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, i8, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct i16x2(i16, i16); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i16x4(i16, i16, i16, i16); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i16x8( - i16, i16, i16, i16, i16, i16, i16, i16, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i16x16( - i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i16x32( - i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, - i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, i16, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct i32x2(i32, i32); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i32x4(i32, i32, i32, i32); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i32x8( - i32, i32, i32, i32, i32, i32, i32, i32, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i32x16( - i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, i32, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct i64x2(i64, i64); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i64x4(i64, i64, i64, i64); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i64x8( - i64, i64, i64, i64, i64, i64, i64, i64, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct i128x2(i128, i128); -#[repr(simd)] #[derive(Copy, Clone)] pub struct i128x4(i128, i128, i128, i128); - -// unsigned integer types - -#[repr(simd)] #[derive(Copy, Clone)] pub struct u8x2(u8, u8); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u8x4(u8, u8, u8, u8); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u8x8( - u8, u8, u8, u8, u8, u8, u8, u8, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u8x16( - u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u8x32( - u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, - u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u8x64( - u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, - u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, - u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, - u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, u8, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct u16x2(u16, u16); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u16x4(u16, u16, u16, u16); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u16x8( - u16, u16, u16, u16, u16, u16, u16, u16, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u16x16( - u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u16x32( - u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, - u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, u16, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct u32x2(u32, u32); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u32x4(u32, u32, u32, u32); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u32x8( - u32, u32, u32, u32, u32, u32, u32, u32, -); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u32x16( - u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, u32, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct u64x2(u64, u64); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u64x4(u64, u64, u64, u64); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u64x8( - u64, u64, u64, u64, u64, u64, u64, u64, -); - -#[repr(simd)] #[derive(Copy, Clone)] pub struct u128x2(u128, u128); -#[repr(simd)] #[derive(Copy, Clone)] pub struct u128x4(u128, u128, u128, u128); - -extern "platform-intrinsic" { - fn simd_saturating_add<T>(x: T, y: T) -> T; - fn simd_saturating_sub<T>(x: T, y: T) -> T; -} - -// NOTE(eddyb) `%{{x|_3}}` is used because on some targets (e.g. WASM) -// SIMD vectors are passed directly, resulting in `%x` being a vector, -// while on others they're passed indirectly, resulting in `%x` being -// a pointer to a vector, and `%_3` a vector loaded from that pointer. -// This is controlled by the target spec option `simd_types_indirect`. -// The same applies to `%{{y|_4}}` as well. - -// CHECK-LABEL: @sadd_i8x2 -#[no_mangle] -pub unsafe fn sadd_i8x2(x: i8x2, y: i8x2) -> i8x2 { - // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.sadd.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i8x4 -#[no_mangle] -pub unsafe fn sadd_i8x4(x: i8x4, y: i8x4) -> i8x4 { - // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.sadd.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i8x8 -#[no_mangle] -pub unsafe fn sadd_i8x8(x: i8x8, y: i8x8) -> i8x8 { - // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.sadd.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i8x16 -#[no_mangle] -pub unsafe fn sadd_i8x16(x: i8x16, y: i8x16) -> i8x16 { - // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.sadd.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i8x32 -#[no_mangle] -pub unsafe fn sadd_i8x32(x: i8x32, y: i8x32) -> i8x32 { - // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.sadd.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i8x64 -#[no_mangle] -pub unsafe fn sadd_i8x64(x: i8x64, y: i8x64) -> i8x64 { - // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.sadd.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i16x2 -#[no_mangle] -pub unsafe fn sadd_i16x2(x: i16x2, y: i16x2) -> i16x2 { - // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.sadd.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i16x4 -#[no_mangle] -pub unsafe fn sadd_i16x4(x: i16x4, y: i16x4) -> i16x4 { - // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.sadd.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i16x8 -#[no_mangle] -pub unsafe fn sadd_i16x8(x: i16x8, y: i16x8) -> i16x8 { - // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.sadd.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i16x16 -#[no_mangle] -pub unsafe fn sadd_i16x16(x: i16x16, y: i16x16) -> i16x16 { - // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.sadd.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i16x32 -#[no_mangle] -pub unsafe fn sadd_i16x32(x: i16x32, y: i16x32) -> i16x32 { - // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.sadd.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i32x2 -#[no_mangle] -pub unsafe fn sadd_i32x2(x: i32x2, y: i32x2) -> i32x2 { - // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.sadd.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i32x4 -#[no_mangle] -pub unsafe fn sadd_i32x4(x: i32x4, y: i32x4) -> i32x4 { - // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i32x8 -#[no_mangle] -pub unsafe fn sadd_i32x8(x: i32x8, y: i32x8) -> i32x8 { - // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.sadd.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i32x16 -#[no_mangle] -pub unsafe fn sadd_i32x16(x: i32x16, y: i32x16) -> i32x16 { - // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.sadd.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i64x2 -#[no_mangle] -pub unsafe fn sadd_i64x2(x: i64x2, y: i64x2) -> i64x2 { - // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.sadd.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i64x4 -#[no_mangle] -pub unsafe fn sadd_i64x4(x: i64x4, y: i64x4) -> i64x4 { - // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.sadd.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i64x8 -#[no_mangle] -pub unsafe fn sadd_i64x8(x: i64x8, y: i64x8) -> i64x8 { - // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.sadd.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i128x2 -#[no_mangle] -pub unsafe fn sadd_i128x2(x: i128x2, y: i128x2) -> i128x2 { - // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.sadd.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @sadd_i128x4 -#[no_mangle] -pub unsafe fn sadd_i128x4(x: i128x4, y: i128x4) -> i128x4 { - // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.sadd.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}}) - simd_saturating_add(x, y) -} - - - -// CHECK-LABEL: @uadd_u8x2 -#[no_mangle] -pub unsafe fn uadd_u8x2(x: u8x2, y: u8x2) -> u8x2 { - // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.uadd.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u8x4 -#[no_mangle] -pub unsafe fn uadd_u8x4(x: u8x4, y: u8x4) -> u8x4 { - // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.uadd.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u8x8 -#[no_mangle] -pub unsafe fn uadd_u8x8(x: u8x8, y: u8x8) -> u8x8 { - // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.uadd.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u8x16 -#[no_mangle] -pub unsafe fn uadd_u8x16(x: u8x16, y: u8x16) -> u8x16 { - // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.uadd.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u8x32 -#[no_mangle] -pub unsafe fn uadd_u8x32(x: u8x32, y: u8x32) -> u8x32 { - // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.uadd.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u8x64 -#[no_mangle] -pub unsafe fn uadd_u8x64(x: u8x64, y: u8x64) -> u8x64 { - // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.uadd.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u16x2 -#[no_mangle] -pub unsafe fn uadd_u16x2(x: u16x2, y: u16x2) -> u16x2 { - // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.uadd.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u16x4 -#[no_mangle] -pub unsafe fn uadd_u16x4(x: u16x4, y: u16x4) -> u16x4 { - // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.uadd.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u16x8 -#[no_mangle] -pub unsafe fn uadd_u16x8(x: u16x8, y: u16x8) -> u16x8 { - // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.uadd.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u16x16 -#[no_mangle] -pub unsafe fn uadd_u16x16(x: u16x16, y: u16x16) -> u16x16 { - // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.uadd.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u16x32 -#[no_mangle] -pub unsafe fn uadd_u16x32(x: u16x32, y: u16x32) -> u16x32 { - // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.uadd.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u32x2 -#[no_mangle] -pub unsafe fn uadd_u32x2(x: u32x2, y: u32x2) -> u32x2 { - // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.uadd.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u32x4 -#[no_mangle] -pub unsafe fn uadd_u32x4(x: u32x4, y: u32x4) -> u32x4 { - // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u32x8 -#[no_mangle] -pub unsafe fn uadd_u32x8(x: u32x8, y: u32x8) -> u32x8 { - // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.uadd.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u32x16 -#[no_mangle] -pub unsafe fn uadd_u32x16(x: u32x16, y: u32x16) -> u32x16 { - // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.uadd.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u64x2 -#[no_mangle] -pub unsafe fn uadd_u64x2(x: u64x2, y: u64x2) -> u64x2 { - // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.uadd.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u64x4 -#[no_mangle] -pub unsafe fn uadd_u64x4(x: u64x4, y: u64x4) -> u64x4 { - // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.uadd.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u64x8 -#[no_mangle] -pub unsafe fn uadd_u64x8(x: u64x8, y: u64x8) -> u64x8 { - // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.uadd.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u128x2 -#[no_mangle] -pub unsafe fn uadd_u128x2(x: u128x2, y: u128x2) -> u128x2 { - // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.uadd.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}}) - simd_saturating_add(x, y) -} - -// CHECK-LABEL: @uadd_u128x4 -#[no_mangle] -pub unsafe fn uadd_u128x4(x: u128x4, y: u128x4) -> u128x4 { - // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.uadd.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}}) - simd_saturating_add(x, y) -} - - - - - -// CHECK-LABEL: @ssub_i8x2 -#[no_mangle] -pub unsafe fn ssub_i8x2(x: i8x2, y: i8x2) -> i8x2 { - // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.ssub.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i8x4 -#[no_mangle] -pub unsafe fn ssub_i8x4(x: i8x4, y: i8x4) -> i8x4 { - // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.ssub.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i8x8 -#[no_mangle] -pub unsafe fn ssub_i8x8(x: i8x8, y: i8x8) -> i8x8 { - // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.ssub.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i8x16 -#[no_mangle] -pub unsafe fn ssub_i8x16(x: i8x16, y: i8x16) -> i8x16 { - // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.ssub.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i8x32 -#[no_mangle] -pub unsafe fn ssub_i8x32(x: i8x32, y: i8x32) -> i8x32 { - // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.ssub.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i8x64 -#[no_mangle] -pub unsafe fn ssub_i8x64(x: i8x64, y: i8x64) -> i8x64 { - // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.ssub.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i16x2 -#[no_mangle] -pub unsafe fn ssub_i16x2(x: i16x2, y: i16x2) -> i16x2 { - // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.ssub.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i16x4 -#[no_mangle] -pub unsafe fn ssub_i16x4(x: i16x4, y: i16x4) -> i16x4 { - // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.ssub.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i16x8 -#[no_mangle] -pub unsafe fn ssub_i16x8(x: i16x8, y: i16x8) -> i16x8 { - // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.ssub.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i16x16 -#[no_mangle] -pub unsafe fn ssub_i16x16(x: i16x16, y: i16x16) -> i16x16 { - // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.ssub.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i16x32 -#[no_mangle] -pub unsafe fn ssub_i16x32(x: i16x32, y: i16x32) -> i16x32 { - // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.ssub.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i32x2 -#[no_mangle] -pub unsafe fn ssub_i32x2(x: i32x2, y: i32x2) -> i32x2 { - // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.ssub.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i32x4 -#[no_mangle] -pub unsafe fn ssub_i32x4(x: i32x4, y: i32x4) -> i32x4 { - // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i32x8 -#[no_mangle] -pub unsafe fn ssub_i32x8(x: i32x8, y: i32x8) -> i32x8 { - // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.ssub.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i32x16 -#[no_mangle] -pub unsafe fn ssub_i32x16(x: i32x16, y: i32x16) -> i32x16 { - // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.ssub.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i64x2 -#[no_mangle] -pub unsafe fn ssub_i64x2(x: i64x2, y: i64x2) -> i64x2 { - // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.ssub.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i64x4 -#[no_mangle] -pub unsafe fn ssub_i64x4(x: i64x4, y: i64x4) -> i64x4 { - // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.ssub.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i64x8 -#[no_mangle] -pub unsafe fn ssub_i64x8(x: i64x8, y: i64x8) -> i64x8 { - // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.ssub.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i128x2 -#[no_mangle] -pub unsafe fn ssub_i128x2(x: i128x2, y: i128x2) -> i128x2 { - // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.ssub.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @ssub_i128x4 -#[no_mangle] -pub unsafe fn ssub_i128x4(x: i128x4, y: i128x4) -> i128x4 { - // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.ssub.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}}) - simd_saturating_sub(x, y) -} - - - -// CHECK-LABEL: @usub_u8x2 -#[no_mangle] -pub unsafe fn usub_u8x2(x: u8x2, y: u8x2) -> u8x2 { - // CHECK: %{{[0-9]+}} = call <2 x i8> @llvm.usub.sat.v2i8(<2 x i8> %{{x|_3}}, <2 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u8x4 -#[no_mangle] -pub unsafe fn usub_u8x4(x: u8x4, y: u8x4) -> u8x4 { - // CHECK: %{{[0-9]+}} = call <4 x i8> @llvm.usub.sat.v4i8(<4 x i8> %{{x|_3}}, <4 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u8x8 -#[no_mangle] -pub unsafe fn usub_u8x8(x: u8x8, y: u8x8) -> u8x8 { - // CHECK: %{{[0-9]+}} = call <8 x i8> @llvm.usub.sat.v8i8(<8 x i8> %{{x|_3}}, <8 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u8x16 -#[no_mangle] -pub unsafe fn usub_u8x16(x: u8x16, y: u8x16) -> u8x16 { - // CHECK: %{{[0-9]+}} = call <16 x i8> @llvm.usub.sat.v16i8(<16 x i8> %{{x|_3}}, <16 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u8x32 -#[no_mangle] -pub unsafe fn usub_u8x32(x: u8x32, y: u8x32) -> u8x32 { - // CHECK: %{{[0-9]+}} = call <32 x i8> @llvm.usub.sat.v32i8(<32 x i8> %{{x|_3}}, <32 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u8x64 -#[no_mangle] -pub unsafe fn usub_u8x64(x: u8x64, y: u8x64) -> u8x64 { - // CHECK: %{{[0-9]+}} = call <64 x i8> @llvm.usub.sat.v64i8(<64 x i8> %{{x|_3}}, <64 x i8> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u16x2 -#[no_mangle] -pub unsafe fn usub_u16x2(x: u16x2, y: u16x2) -> u16x2 { - // CHECK: %{{[0-9]+}} = call <2 x i16> @llvm.usub.sat.v2i16(<2 x i16> %{{x|_3}}, <2 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u16x4 -#[no_mangle] -pub unsafe fn usub_u16x4(x: u16x4, y: u16x4) -> u16x4 { - // CHECK: %{{[0-9]+}} = call <4 x i16> @llvm.usub.sat.v4i16(<4 x i16> %{{x|_3}}, <4 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u16x8 -#[no_mangle] -pub unsafe fn usub_u16x8(x: u16x8, y: u16x8) -> u16x8 { - // CHECK: %{{[0-9]+}} = call <8 x i16> @llvm.usub.sat.v8i16(<8 x i16> %{{x|_3}}, <8 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u16x16 -#[no_mangle] -pub unsafe fn usub_u16x16(x: u16x16, y: u16x16) -> u16x16 { - // CHECK: %{{[0-9]+}} = call <16 x i16> @llvm.usub.sat.v16i16(<16 x i16> %{{x|_3}}, <16 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u16x32 -#[no_mangle] -pub unsafe fn usub_u16x32(x: u16x32, y: u16x32) -> u16x32 { - // CHECK: %{{[0-9]+}} = call <32 x i16> @llvm.usub.sat.v32i16(<32 x i16> %{{x|_3}}, <32 x i16> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u32x2 -#[no_mangle] -pub unsafe fn usub_u32x2(x: u32x2, y: u32x2) -> u32x2 { - // CHECK: %{{[0-9]+}} = call <2 x i32> @llvm.usub.sat.v2i32(<2 x i32> %{{x|_3}}, <2 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u32x4 -#[no_mangle] -pub unsafe fn usub_u32x4(x: u32x4, y: u32x4) -> u32x4 { - // CHECK: %{{[0-9]+}} = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %{{x|_3}}, <4 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u32x8 -#[no_mangle] -pub unsafe fn usub_u32x8(x: u32x8, y: u32x8) -> u32x8 { - // CHECK: %{{[0-9]+}} = call <8 x i32> @llvm.usub.sat.v8i32(<8 x i32> %{{x|_3}}, <8 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u32x16 -#[no_mangle] -pub unsafe fn usub_u32x16(x: u32x16, y: u32x16) -> u32x16 { - // CHECK: %{{[0-9]+}} = call <16 x i32> @llvm.usub.sat.v16i32(<16 x i32> %{{x|_3}}, <16 x i32> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u64x2 -#[no_mangle] -pub unsafe fn usub_u64x2(x: u64x2, y: u64x2) -> u64x2 { - // CHECK: %{{[0-9]+}} = call <2 x i64> @llvm.usub.sat.v2i64(<2 x i64> %{{x|_3}}, <2 x i64> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u64x4 -#[no_mangle] -pub unsafe fn usub_u64x4(x: u64x4, y: u64x4) -> u64x4 { - // CHECK: %{{[0-9]+}} = call <4 x i64> @llvm.usub.sat.v4i64(<4 x i64> %{{x|_3}}, <4 x i64> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u64x8 -#[no_mangle] -pub unsafe fn usub_u64x8(x: u64x8, y: u64x8) -> u64x8 { - // CHECK: %{{[0-9]+}} = call <8 x i64> @llvm.usub.sat.v8i64(<8 x i64> %{{x|_3}}, <8 x i64> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u128x2 -#[no_mangle] -pub unsafe fn usub_u128x2(x: u128x2, y: u128x2) -> u128x2 { - // CHECK: %{{[0-9]+}} = call <2 x i128> @llvm.usub.sat.v2i128(<2 x i128> %{{x|_3}}, <2 x i128> %{{y|_4}}) - simd_saturating_sub(x, y) -} - -// CHECK-LABEL: @usub_u128x4 -#[no_mangle] -pub unsafe fn usub_u128x4(x: u128x4, y: u128x4) -> u128x4 { - // CHECK: %{{[0-9]+}} = call <4 x i128> @llvm.usub.sat.v4i128(<4 x i128> %{{x|_3}}, <4 x i128> %{{y|_4}}) - simd_saturating_sub(x, y) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-bitmask.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-bitmask.rs deleted file mode 100644 index 4a98d797b..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-bitmask.rs +++ /dev/null @@ -1,63 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct u32x2(u32, u32); - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct i32x2(i32, i32); - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct i8x16( - i8, i8, i8, i8, i8, i8, i8, i8, - i8, i8, i8, i8, i8, i8, i8, i8, -); - - -extern "platform-intrinsic" { - fn simd_bitmask<T, U>(x: T) -> U; -} - -// NOTE(eddyb) `%{{x|_2}}` is used because on some targets (e.g. WASM) -// SIMD vectors are passed directly, resulting in `%x` being a vector, -// while on others they're passed indirectly, resulting in `%x` being -// a pointer to a vector, and `%_2` a vector loaded from that pointer. -// This is controlled by the target spec option `simd_types_indirect`. - -// CHECK-LABEL: @bitmask_int -#[no_mangle] -pub unsafe fn bitmask_int(x: i32x2) -> u8 { - // CHECK: [[A:%[0-9]+]] = lshr <2 x i32> %{{x|_2}}, <i32 31, i32 31> - // CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1> - // CHECK: [[C:%[0-9]+]] = bitcast <2 x i1> [[B]] to i2 - // CHECK: %{{[0-9]+}} = zext i2 [[C]] to i8 - simd_bitmask(x) -} - -// CHECK-LABEL: @bitmask_uint -#[no_mangle] -pub unsafe fn bitmask_uint(x: u32x2) -> u8 { - // CHECK: [[A:%[0-9]+]] = lshr <2 x i32> %{{x|_2}}, <i32 31, i32 31> - // CHECK: [[B:%[0-9]+]] = trunc <2 x i32> [[A]] to <2 x i1> - // CHECK: [[C:%[0-9]+]] = bitcast <2 x i1> [[B]] to i2 - // CHECK: %{{[0-9]+}} = zext i2 [[C]] to i8 - simd_bitmask(x) -} - -// CHECK-LABEL: @bitmask_int16 -#[no_mangle] -pub unsafe fn bitmask_int16(x: i8x16) -> u16 { - // CHECK: [[A:%[0-9]+]] = lshr <16 x i8> %{{x|_2}}, <i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7, i8 7> - // CHECK: [[B:%[0-9]+]] = trunc <16 x i8> [[A]] to <16 x i1> - // CHECK: %{{[0-9]+}} = bitcast <16 x i1> [[B]] to i16 - // CHECK-NOT: zext - simd_bitmask(x) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-extract-insert.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-extract-insert.rs deleted file mode 100644 index b5b0b1330..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-extract-insert.rs +++ /dev/null @@ -1,47 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics, min_const_generics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct M(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct S<const N: usize>([f32; N]); - -extern "platform-intrinsic" { - fn simd_extract<T, U>(x: T, idx: u32) -> U; - fn simd_insert<T, U>(x: T, idx: u32, b: U) -> T; -} - -// CHECK-LABEL: @extract_m -#[no_mangle] -pub unsafe fn extract_m(v: M, i: u32) -> f32 { - // CHECK: extractelement <4 x float> %{{v|_3}}, i32 %i - simd_extract(v, i) -} - -// CHECK-LABEL: @extract_s -#[no_mangle] -pub unsafe fn extract_s(v: S<4>, i: u32) -> f32 { - // CHECK: extractelement <4 x float> %{{v|_3}}, i32 %i - simd_extract(v, i) -} - -// CHECK-LABEL: @insert_m -#[no_mangle] -pub unsafe fn insert_m(v: M, i: u32, j: f32) -> M { - // CHECK: insertelement <4 x float> %{{v|_4}}, float %j, i32 %i - simd_insert(v, i, j) -} - -// CHECK-LABEL: @insert_s -#[no_mangle] -pub unsafe fn insert_s(v: S<4>, i: u32, j: f32) -> S<4> { - // CHECK: insertelement <4 x float> %{{v|_4}}, float %j, i32 %i - simd_insert(v, i, j) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-gather.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-gather.rs deleted file mode 100644 index cacc32f2f..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-gather.rs +++ /dev/null @@ -1,36 +0,0 @@ -// - -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct Vec2<T>(pub T, pub T); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct Vec4<T>(pub T, pub T, pub T, pub T); - -extern "platform-intrinsic" { - fn simd_gather<T, P, M>(value: T, pointers: P, mask: M) -> T; -} - -// CHECK-LABEL: @gather_f32x2 -#[no_mangle] -pub unsafe fn gather_f32x2(pointers: Vec2<*const f32>, mask: Vec2<i32>, - values: Vec2<f32>) -> Vec2<f32> { - // CHECK: call <2 x float> @llvm.masked.gather.v2f32.{{.+}}(<2 x {{float\*|ptr}}> {{.*}}, i32 {{.*}}, <2 x i1> {{.*}}, <2 x float> {{.*}}) - simd_gather(values, pointers, mask) -} - -// CHECK-LABEL: @gather_pf32x2 -#[no_mangle] -pub unsafe fn gather_pf32x2(pointers: Vec2<*const *const f32>, mask: Vec2<i32>, - values: Vec2<*const f32>) -> Vec2<*const f32> { - // CHECK: call <2 x {{float\*|ptr}}> @llvm.masked.gather.{{.+}}(<2 x {{float\*\*|ptr}}> {{.*}}, i32 {{.*}}, <2 x i1> {{.*}}, <2 x {{float\*|ptr}}> {{.*}}) - simd_gather(values, pointers, mask) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-scatter.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-scatter.rs deleted file mode 100644 index 94ecaf609..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-scatter.rs +++ /dev/null @@ -1,37 +0,0 @@ -// - -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#![allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct Vec2<T>(pub T, pub T); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct Vec4<T>(pub T, pub T, pub T, pub T); - -extern "platform-intrinsic" { - fn simd_scatter<T, P, M>(value: T, pointers: P, mask: M); -} - -// CHECK-LABEL: @scatter_f32x2 -#[no_mangle] -pub unsafe fn scatter_f32x2(pointers: Vec2<*mut f32>, mask: Vec2<i32>, - values: Vec2<f32>) { - // CHECK: call void @llvm.masked.scatter.v2f32.v2p0{{.*}}(<2 x float> {{.*}}, <2 x {{float\*|ptr}}> {{.*}}, i32 {{.*}}, <2 x i1> {{.*}}) - simd_scatter(values, pointers, mask) -} - - -// CHECK-LABEL: @scatter_pf32x2 -#[no_mangle] -pub unsafe fn scatter_pf32x2(pointers: Vec2<*mut *const f32>, mask: Vec2<i32>, - values: Vec2<*const f32>) { - // CHECK: call void @llvm.masked.scatter.v2p0{{.*}}.v2p0{{.*}}(<2 x {{float\*|ptr}}> {{.*}}, <2 x {{float\*\*|ptr}}> {{.*}}, i32 {{.*}}, <2 x i1> {{.*}}) - simd_scatter(values, pointers, mask) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-select.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-select.rs deleted file mode 100644 index 03bb22655..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-generic-select.rs +++ /dev/null @@ -1,37 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![feature(repr_simd, platform_intrinsics)] -#[allow(non_camel_case_types)] - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x4(pub f32, pub f32, pub f32, pub f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct f32x8(f32, f32, f32, f32, f32, f32, f32, f32); - -#[repr(simd)] -#[derive(Copy, Clone, PartialEq, Debug)] -pub struct b8x4(pub i8, pub i8, pub i8, pub i8); - -extern "platform-intrinsic" { - fn simd_select<T, U>(x: T, a: U, b: U) -> U; - fn simd_select_bitmask<T, U>(x: T, a: U, b: U) -> U; -} - -// CHECK-LABEL: @select -#[no_mangle] -pub unsafe fn select(m: b8x4, a: f32x4, b: f32x4) -> f32x4 { - // CHECK: select <4 x i1> - simd_select(m, a, b) -} - -// CHECK-LABEL: @select_bitmask -#[no_mangle] -pub unsafe fn select_bitmask(m: i8, a: f32x8, b: f32x8) -> f32x8 { - // CHECK: select <8 x i1> - simd_select_bitmask(m, a, b) -} diff --git a/src/test/codegen/simd-intrinsic/simd-intrinsic-transmute-array.rs b/src/test/codegen/simd-intrinsic/simd-intrinsic-transmute-array.rs deleted file mode 100644 index db5b60567..000000000 --- a/src/test/codegen/simd-intrinsic/simd-intrinsic-transmute-array.rs +++ /dev/null @@ -1,43 +0,0 @@ -// -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -#![allow(non_camel_case_types)] -#![feature(repr_simd, platform_intrinsics, min_const_generics)] - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct S<const N: usize>([f32; N]); - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct T([f32; 4]); - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct U(f32, f32, f32, f32); - -// CHECK-LABEL: @build_array_s -#[no_mangle] -pub fn build_array_s(x: [f32; 4]) -> S<4> { - // CHECK: call void @llvm.memcpy.{{.+}}({{.*}}, i{{[0-9]+}} 16, i1 false) - // CHECK: call void @llvm.memcpy.{{.+}}({{.*}}, i{{[0-9]+}} 16, i1 false) - S::<4>(x) -} - -// CHECK-LABEL: @build_array_t -#[no_mangle] -pub fn build_array_t(x: [f32; 4]) -> T { - // CHECK: call void @llvm.memcpy.{{.+}}({{.*}}, i{{[0-9]+}} 16, i1 false) - // CHECK: call void @llvm.memcpy.{{.+}}({{.*}}, i{{[0-9]+}} 16, i1 false) - T(x) -} - -// CHECK-LABEL: @build_array_u -#[no_mangle] -pub fn build_array_u(x: [f32; 4]) -> U { - // CHECK: call void @llvm.memcpy.{{.+}}({{.*}}, i{{[0-9]+}} 16, i1 false) - // CHECK: call void @llvm.memcpy.{{.+}}({{.*}}, i{{[0-9]+}} 16, i1 false) - unsafe { std::mem::transmute(x) } -} diff --git a/src/test/codegen/simd-wide-sum.rs b/src/test/codegen/simd-wide-sum.rs deleted file mode 100644 index 04314dc29..000000000 --- a/src/test/codegen/simd-wide-sum.rs +++ /dev/null @@ -1,55 +0,0 @@ -// compile-flags: -C opt-level=3 --edition=2021 -// only-x86_64 -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] -#![feature(portable_simd)] - -use std::simd::{Simd, SimdUint}; -const N: usize = 8; - -#[no_mangle] -// CHECK-LABEL: @wider_reduce_simd -pub fn wider_reduce_simd(x: Simd<u8, N>) -> u16 { - // CHECK: zext <8 x i8> - // CHECK-SAME: to <8 x i16> - // CHECK: call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> - let x: Simd<u16, N> = x.cast(); - x.reduce_sum() -} - -#[no_mangle] -// CHECK-LABEL: @wider_reduce_loop -pub fn wider_reduce_loop(x: Simd<u8, N>) -> u16 { - // CHECK: zext <8 x i8> - // CHECK-SAME: to <8 x i16> - // CHECK: call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> - let mut sum = 0_u16; - for i in 0..N { - sum += u16::from(x[i]); - } - sum -} - -#[no_mangle] -// CHECK-LABEL: @wider_reduce_iter -pub fn wider_reduce_iter(x: Simd<u8, N>) -> u16 { - // CHECK: zext <8 x i8> - // CHECK-SAME: to <8 x i16> - // CHECK: call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> - x.as_array().iter().copied().map(u16::from).sum() -} - -// This iterator one is the most interesting, as it's the one -// which used to not auto-vectorize due to a suboptimality in the -// `<array::IntoIter as Iterator>::fold` implementation. - -#[no_mangle] -// CHECK-LABEL: @wider_reduce_into_iter -pub fn wider_reduce_into_iter(x: Simd<u8, N>) -> u16 { - // FIXME MIR inlining messes up LLVM optimizations. - // WOULD-CHECK: zext <8 x i8> - // WOULD-CHECK-SAME: to <8 x i16> - // WOULD-CHECK: call i16 @llvm.vector.reduce.add.v8i16(<8 x i16> - x.to_array().into_iter().map(u16::from).sum() -} diff --git a/src/test/codegen/simd_arith_offset.rs b/src/test/codegen/simd_arith_offset.rs deleted file mode 100644 index 7b623a22a..000000000 --- a/src/test/codegen/simd_arith_offset.rs +++ /dev/null @@ -1,26 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// only-64bit (because the LLVM type of i64 for usize shows up) -// - -#![crate_type = "lib"] -#![feature(repr_simd, platform_intrinsics)] - -extern "platform-intrinsic" { - pub(crate) fn simd_arith_offset<T, U>(ptrs: T, offsets: U) -> T; -} - -/// A vector of *const T. -#[derive(Debug, Copy, Clone)] -#[repr(simd)] -pub struct SimdConstPtr<T, const LANES: usize>([*const T; LANES]); - -#[derive(Debug, Copy, Clone)] -#[repr(simd)] -pub struct Simd<T, const LANES: usize>([T; LANES]); - -// CHECK-LABEL: smoke -#[no_mangle] -pub fn smoke(ptrs: SimdConstPtr<u8, 8>, offsets: Simd<usize, 8>) -> SimdConstPtr<u8, 8> { - // CHECK: getelementptr i8, <8 x {{i8\*|ptr}}> %_3, <8 x i64> %_4 - unsafe { simd_arith_offset(ptrs, offsets) } -} diff --git a/src/test/codegen/slice-as_chunks.rs b/src/test/codegen/slice-as_chunks.rs deleted file mode 100644 index 48e3f73fc..000000000 --- a/src/test/codegen/slice-as_chunks.rs +++ /dev/null @@ -1,33 +0,0 @@ -// no-system-llvm -// compile-flags: -O -// only-64bit (because the LLVM type of i64 for usize shows up) -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] -#![feature(slice_as_chunks)] - -// CHECK-LABEL: @chunks4 -#[no_mangle] -pub fn chunks4(x: &[u8]) -> &[[u8; 4]] { - // CHECK-NEXT: start: - // CHECK-NEXT: lshr i64 %x.1, 2 - // CHECK-NOT: shl - // CHECK-NOT: mul - // CHECK-NOT: udiv - // CHECK-NOT: urem - // CHECK: ret - x.as_chunks().0 -} - -// CHECK-LABEL: @chunks4_with_remainder -#[no_mangle] -pub fn chunks4_with_remainder(x: &[u8]) -> (&[[u8; 4]], &[u8]) { - // CHECK: and i64 %x.1, -4 - // CHECK: and i64 %x.1, 3 - // CHECK: lshr exact - // CHECK-NOT: mul - // CHECK-NOT: udiv - // CHECK-NOT: urem - // CHECK: ret - x.as_chunks() -} diff --git a/src/test/codegen/slice-init.rs b/src/test/codegen/slice-init.rs deleted file mode 100644 index 794b773a7..000000000 --- a/src/test/codegen/slice-init.rs +++ /dev/null @@ -1,64 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] - -// CHECK-LABEL: @zero_sized_elem -#[no_mangle] -pub fn zero_sized_elem() { - // CHECK-NOT: br label %repeat_loop_header{{.*}} - // CHECK-NOT: call void @llvm.memset.p0 - let x = [(); 4]; - drop(&x); -} - -// CHECK-LABEL: @zero_len_array -#[no_mangle] -pub fn zero_len_array() { - // CHECK-NOT: br label %repeat_loop_header{{.*}} - // CHECK-NOT: call void @llvm.memset.p0 - let x = [4; 0]; - drop(&x); -} - -// CHECK-LABEL: @byte_array -#[no_mangle] -pub fn byte_array() { - // CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 7, i{{[0-9]+}} 4 - // CHECK-NOT: br label %repeat_loop_header{{.*}} - let x = [7u8; 4]; - drop(&x); -} - -#[allow(dead_code)] -#[derive(Copy, Clone)] -enum Init { - Loop, - Memset, -} - -// CHECK-LABEL: @byte_enum_array -#[no_mangle] -pub fn byte_enum_array() { - // CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 {{.*}}, i{{[0-9]+}} 4 - // CHECK-NOT: br label %repeat_loop_header{{.*}} - let x = [Init::Memset; 4]; - drop(&x); -} - -// CHECK-LABEL: @zeroed_integer_array -#[no_mangle] -pub fn zeroed_integer_array() { - // CHECK: call void @llvm.memset.{{.+}}({{i8\*|ptr}} {{.*}}, i8 0, i{{[0-9]+}} 16 - // CHECK-NOT: br label %repeat_loop_header{{.*}} - let x = [0u32; 4]; - drop(&x); -} - -// CHECK-LABEL: @nonzero_integer_array -#[no_mangle] -pub fn nonzero_integer_array() { - // CHECK: br label %repeat_loop_header{{.*}} - // CHECK-NOT: call void @llvm.memset.p0 - let x = [0x1a_2b_3c_4d_u32; 4]; - drop(&x); -} diff --git a/src/test/codegen/slice-iter-len-eq-zero.rs b/src/test/codegen/slice-iter-len-eq-zero.rs deleted file mode 100644 index 894b0ec3d..000000000 --- a/src/test/codegen/slice-iter-len-eq-zero.rs +++ /dev/null @@ -1,28 +0,0 @@ -// no-system-llvm -// compile-flags: -O -// ignore-debug: the debug assertions add extra comparisons -#![crate_type = "lib"] - -type Demo = [u8; 3]; - -// CHECK-LABEL: @slice_iter_len_eq_zero -#[no_mangle] -pub fn slice_iter_len_eq_zero(y: std::slice::Iter<'_, Demo>) -> bool { - // CHECK-NOT: sub - // CHECK: %2 = icmp eq {{i8\*|ptr}} {{%1|%0}}, {{%1|%0}} - // CHECK: ret i1 %2 - y.len() == 0 -} - -// CHECK-LABEL: @array_into_iter_len_eq_zero -#[no_mangle] -pub fn array_into_iter_len_eq_zero(y: std::array::IntoIter<Demo, 123>) -> bool { - // This should be able to just check that the indexes are equal, and not - // need any subtractions or comparisons to handle `start > end`. - - // CHECK-NOT: icmp - // CHECK-NOT: sub - // CHECK: %1 = icmp eq {{i16|i32|i64}} - // CHECK: ret i1 %1 - y.len() == 0 -} diff --git a/src/test/codegen/slice-position-bounds-check.rs b/src/test/codegen/slice-position-bounds-check.rs deleted file mode 100644 index b494f42b2..000000000 --- a/src/test/codegen/slice-position-bounds-check.rs +++ /dev/null @@ -1,32 +0,0 @@ -// no-system-llvm -// compile-flags: -O -C panic=abort -#![crate_type = "lib"] - -fn search<T: Ord + Eq>(arr: &mut [T], a: &T) -> Result<usize, ()> { - match arr.iter().position(|x| x == a) { - Some(p) => { - Ok(p) - }, - None => Err(()), - } -} - -// CHECK-LABEL: @position_no_bounds_check -#[no_mangle] -pub fn position_no_bounds_check(y: &mut [u32], x: &u32, z: &u32) -> bool { - // This contains "call assume" so we cannot just rule out all calls - // CHECK-NOT: panic_bounds_check - if let Ok(p) = search(y, x) { - y[p] == *z - } else { - false - } -} - -// just to make sure that panicking really emits "panic_bounds_check" somewhere in the IR -// CHECK-LABEL: @test_check -#[no_mangle] -pub fn test_check(y: &[i32]) -> i32 { - // CHECK: panic_bounds_check - y[12] -} diff --git a/src/test/codegen/slice-ref-equality.rs b/src/test/codegen/slice-ref-equality.rs deleted file mode 100644 index 47fde12bf..000000000 --- a/src/test/codegen/slice-ref-equality.rs +++ /dev/null @@ -1,38 +0,0 @@ -// compile-flags: -C opt-level=3 -Zmerge-functions=disabled - -#![crate_type = "lib"] - -// #71602 reported a simple array comparison just generating a loop. -// This was originally fixed by ensuring it generates a single bcmp, -// but we now generate it as a load+icmp instead. `is_zero_slice` was -// tweaked to still test the case of comparison against a slice, -// and `is_zero_array` tests the new array-specific behaviour. -// The optimization was then extended to short slice-to-array comparisons, -// so the first test here now has a long slice to still get the bcmp. - -// CHECK-LABEL: @is_zero_slice_long -#[no_mangle] -pub fn is_zero_slice_long(data: &[u8; 456]) -> bool { - // CHECK: %[[BCMP:.+]] = tail call i32 @{{bcmp|memcmp}}({{.+}}) - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[BCMP]], 0 - // CHECK-NEXT: ret i1 %[[EQ]] - &data[..] == [0; 456] -} - -// CHECK-LABEL: @is_zero_slice_short -#[no_mangle] -pub fn is_zero_slice_short(data: &[u8; 4]) -> bool { - // CHECK: %[[LOAD:.+]] = load i32, {{i32\*|ptr}} %{{.+}}, align 1 - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[LOAD]], 0 - // CHECK-NEXT: ret i1 %[[EQ]] - &data[..] == [0; 4] -} - -// CHECK-LABEL: @is_zero_array -#[no_mangle] -pub fn is_zero_array(data: &[u8; 4]) -> bool { - // CHECK: %[[LOAD:.+]] = load i32, {{i32\*|ptr}} %{{.+}}, align 1 - // CHECK-NEXT: %[[EQ:.+]] = icmp eq i32 %[[LOAD]], 0 - // CHECK-NEXT: ret i1 %[[EQ]] - *data == [0; 4] -} diff --git a/src/test/codegen/slice-reverse.rs b/src/test/codegen/slice-reverse.rs deleted file mode 100644 index e50b22f3a..000000000 --- a/src/test/codegen/slice-reverse.rs +++ /dev/null @@ -1,27 +0,0 @@ -// compile-flags: -O -// only-x86_64 -// ignore-debug: the debug assertions in from_raw_parts get in the way - -#![crate_type = "lib"] - -// CHECK-LABEL: @slice_reverse_u8 -#[no_mangle] -pub fn slice_reverse_u8(slice: &mut [u8]) { - // CHECK-NOT: panic_bounds_check - // CHECK-NOT: slice_end_index_len_fail - // CHECK: shufflevector <{{[0-9]+}} x i8> - // CHECK-NOT: panic_bounds_check - // CHECK-NOT: slice_end_index_len_fail - slice.reverse(); -} - -// CHECK-LABEL: @slice_reverse_i32 -#[no_mangle] -pub fn slice_reverse_i32(slice: &mut [i32]) { - // CHECK-NOT: panic_bounds_check - // CHECK-NOT: slice_end_index_len_fail - // CHECK: shufflevector <{{[0-9]+}} x i32> - // CHECK-NOT: panic_bounds_check - // CHECK-NOT: slice_end_index_len_fail - slice.reverse(); -} diff --git a/src/test/codegen/slice-windows-no-bounds-check.rs b/src/test/codegen/slice-windows-no-bounds-check.rs deleted file mode 100644 index 4f5f4425c..000000000 --- a/src/test/codegen/slice-windows-no-bounds-check.rs +++ /dev/null @@ -1,35 +0,0 @@ -#![crate_type = "lib"] - -// compile-flags: -O - -use std::slice::Windows; - -// CHECK-LABEL: @naive_string_search -#[no_mangle] -pub fn naive_string_search(haystack: &str, needle: &str) -> Option<usize> { - if needle.is_empty() { - return Some(0); - } - // CHECK-NOT: panic - // CHECK-NOT: fail - haystack - .as_bytes() - .windows(needle.len()) - .position(|sub| sub == needle.as_bytes()) -} - -// CHECK-LABEL: @next -#[no_mangle] -pub fn next<'a>(w: &mut Windows<'a, u32>) -> Option<&'a [u32]> { - // CHECK-NOT: panic - // CHECK-NOT: fail - w.next() -} - -// CHECK-LABEL: @next_back -#[no_mangle] -pub fn next_back<'a>(w: &mut Windows<'a, u32>) -> Option<&'a [u32]> { - // CHECK-NOT: panic - // CHECK-NOT: fail - w.next_back() -} diff --git a/src/test/codegen/slice_as_from_ptr_range.rs b/src/test/codegen/slice_as_from_ptr_range.rs deleted file mode 100644 index 0e3fefd97..000000000 --- a/src/test/codegen/slice_as_from_ptr_range.rs +++ /dev/null @@ -1,23 +0,0 @@ -// compile-flags: -O -// only-64bit (because we're using [ui]size) -// ignore-debug (because the assertions get in the way) -// min-llvm-version: 15.0 (because this is a relatively new instcombine) - -#![crate_type = "lib"] -#![feature(slice_from_ptr_range)] - -// This is intentionally using a non-power-of-two array length, -// as that's where the optimization differences show up - -// CHECK-LABEL: @flatten_via_ptr_range -#[no_mangle] -pub fn flatten_via_ptr_range(slice_of_arrays: &[[i32; 13]]) -> &[i32] { - // CHECK-NOT: lshr - // CHECK-NOT: udiv - // CHECK: mul nuw nsw i64 %{{.+}}, 13 - // CHECK-NOT: lshr - // CHECK-NOT: udiv - let r = slice_of_arrays.as_ptr_range(); - let r = r.start.cast()..r.end.cast(); - unsafe { core::slice::from_ptr_range(r) } -} diff --git a/src/test/codegen/some-abis-do-extend-params-to-32-bits.rs b/src/test/codegen/some-abis-do-extend-params-to-32-bits.rs deleted file mode 100644 index 7fc34af3d..000000000 --- a/src/test/codegen/some-abis-do-extend-params-to-32-bits.rs +++ /dev/null @@ -1,204 +0,0 @@ -// compile-flags: -Cno-prepopulate-passes - -// revisions:x86_64 i686 aarch64-apple aarch64-windows aarch64-linux arm riscv - -//[x86_64] compile-flags: --target x86_64-unknown-uefi -//[x86_64] needs-llvm-components: x86 -//[i686] compile-flags: --target i686-unknown-linux-musl -//[i686] needs-llvm-components: x86 -//[aarch64-windows] compile-flags: --target aarch64-pc-windows-msvc -//[aarch64-windows] needs-llvm-components: aarch64 -//[aarch64-linux] compile-flags: --target aarch64-unknown-linux-gnu -//[aarch64-linux] needs-llvm-components: aarch64 -//[aarch64-apple] compile-flags: --target aarch64-apple-darwin -//[aarch64-apple] needs-llvm-components: aarch64 -//[arm] compile-flags: --target armv7r-none-eabi -//[arm] needs-llvm-components: arm -//[riscv] compile-flags: --target riscv64gc-unknown-none-elf -//[riscv] needs-llvm-components: riscv - -// See bottom of file for a corresponding C source file that is meant to yield -// equivalent declarations. -#![feature(no_core, lang_items)] -#![crate_type = "lib"] -#![no_std] -#![no_core] - -#[lang="sized"] trait Sized { } -#[lang="freeze"] trait Freeze { } -#[lang="copy"] trait Copy { } - -// The patterns in this file are written in the style of a table to make the -// uniformities and distinctions more apparent. -// -// ZERO/SIGN-EXTENDING TO 32 BITS NON-EXTENDING -// ============================== ======================= -// x86_64: void @c_arg_u8(i8 zeroext %_a) -// i686: void @c_arg_u8(i8 zeroext %_a) -// aarch64-apple: void @c_arg_u8(i8 zeroext %_a) -// aarch64-windows: void @c_arg_u8(i8 %_a) -// aarch64-linux: void @c_arg_u8(i8 %_a) -// arm: void @c_arg_u8(i8 zeroext %_a) -// riscv: void @c_arg_u8(i8 zeroext %_a) -#[no_mangle] pub extern "C" fn c_arg_u8(_a: u8) { } - -// x86_64: void @c_arg_u16(i16 zeroext %_a) -// i686: void @c_arg_u16(i16 zeroext %_a) -// aarch64-apple: void @c_arg_u16(i16 zeroext %_a) -// aarch64-windows: void @c_arg_u16(i16 %_a) -// aarch64-linux: void @c_arg_u16(i16 %_a) -// arm: void @c_arg_u16(i16 zeroext %_a) -// riscv: void @c_arg_u16(i16 zeroext %_a) -#[no_mangle] pub extern "C" fn c_arg_u16(_a: u16) { } - -// x86_64: void @c_arg_u32(i32 %_a) -// i686: void @c_arg_u32(i32 %_a) -// aarch64-apple: void @c_arg_u32(i32 %_a) -// aarch64-windows: void @c_arg_u32(i32 %_a) -// aarch64-linux: void @c_arg_u32(i32 %_a) -// arm: void @c_arg_u32(i32 %_a) -// riscv: void @c_arg_u32(i32 signext %_a) -#[no_mangle] pub extern "C" fn c_arg_u32(_a: u32) { } - -// x86_64: void @c_arg_u64(i64 %_a) -// i686: void @c_arg_u64(i64 %_a) -// aarch64-apple: void @c_arg_u64(i64 %_a) -// aarch64-windows: void @c_arg_u64(i64 %_a) -// aarch64-linux: void @c_arg_u64(i64 %_a) -// arm: void @c_arg_u64(i64 %_a) -// riscv: void @c_arg_u64(i64 %_a) -#[no_mangle] pub extern "C" fn c_arg_u64(_a: u64) { } - -// x86_64: void @c_arg_i8(i8 signext %_a) -// i686: void @c_arg_i8(i8 signext %_a) -// aarch64-apple: void @c_arg_i8(i8 signext %_a) -// aarch64-windows: void @c_arg_i8(i8 %_a) -// aarch64-linux: void @c_arg_i8(i8 %_a) -// arm: void @c_arg_i8(i8 signext %_a) -// riscv: void @c_arg_i8(i8 signext %_a) -#[no_mangle] pub extern "C" fn c_arg_i8(_a: i8) { } - -// x86_64: void @c_arg_i16(i16 signext %_a) -// i686: void @c_arg_i16(i16 signext %_a) -// aarch64-apple: void @c_arg_i16(i16 signext %_a) -// aarch64-windows: void @c_arg_i16(i16 %_a) -// aarch64-linux: void @c_arg_i16(i16 %_a) -// arm: void @c_arg_i16(i16 signext %_a) -// riscv: void @c_arg_i16(i16 signext %_a) -#[no_mangle] pub extern "C" fn c_arg_i16(_a: i16) { } - -// x86_64: void @c_arg_i32(i32 %_a) -// i686: void @c_arg_i32(i32 %_a) -// aarch64-apple: void @c_arg_i32(i32 %_a) -// aarch64-windows: void @c_arg_i32(i32 %_a) -// aarch64-linux: void @c_arg_i32(i32 %_a) -// arm: void @c_arg_i32(i32 %_a) -// riscv: void @c_arg_i32(i32 signext %_a) -#[no_mangle] pub extern "C" fn c_arg_i32(_a: i32) { } - -// x86_64: void @c_arg_i64(i64 %_a) -// i686: void @c_arg_i64(i64 %_a) -// aarch64-apple: void @c_arg_i64(i64 %_a) -// aarch64-windows: void @c_arg_i64(i64 %_a) -// aarch64-linux: void @c_arg_i64(i64 %_a) -// arm: void @c_arg_i64(i64 %_a) -// riscv: void @c_arg_i64(i64 %_a) -#[no_mangle] pub extern "C" fn c_arg_i64(_a: i64) { } - -// x86_64: zeroext i8 @c_ret_u8() -// i686: zeroext i8 @c_ret_u8() -// aarch64-apple: zeroext i8 @c_ret_u8() -// aarch64-windows: i8 @c_ret_u8() -// aarch64-linux: i8 @c_ret_u8() -// arm: zeroext i8 @c_ret_u8() -// riscv: zeroext i8 @c_ret_u8() -#[no_mangle] pub extern "C" fn c_ret_u8() -> u8 { 0 } - -// x86_64: zeroext i16 @c_ret_u16() -// i686: zeroext i16 @c_ret_u16() -// aarch64-apple: zeroext i16 @c_ret_u16() -// aarch64-windows: i16 @c_ret_u16() -// aarch64-linux: i16 @c_ret_u16() -// arm: zeroext i16 @c_ret_u16() -// riscv: zeroext i16 @c_ret_u16() -#[no_mangle] pub extern "C" fn c_ret_u16() -> u16 { 0 } - -// x86_64: i32 @c_ret_u32() -// i686: i32 @c_ret_u32() -// aarch64-apple: i32 @c_ret_u32() -// aarch64-windows: i32 @c_ret_u32() -// aarch64-linux: i32 @c_ret_u32() -// arm: i32 @c_ret_u32() -// riscv: signext i32 @c_ret_u32() -#[no_mangle] pub extern "C" fn c_ret_u32() -> u32 { 0 } - -// x86_64: i64 @c_ret_u64() -// i686: i64 @c_ret_u64() -// aarch64-apple: i64 @c_ret_u64() -// aarch64-windows: i64 @c_ret_u64() -// aarch64-linux: i64 @c_ret_u64() -// arm: i64 @c_ret_u64() -// riscv: i64 @c_ret_u64() -#[no_mangle] pub extern "C" fn c_ret_u64() -> u64 { 0 } - -// x86_64: signext i8 @c_ret_i8() -// i686: signext i8 @c_ret_i8() -// aarch64-apple: signext i8 @c_ret_i8() -// aarch64-windows: i8 @c_ret_i8() -// aarch64-linux: i8 @c_ret_i8() -// arm: signext i8 @c_ret_i8() -// riscv: signext i8 @c_ret_i8() -#[no_mangle] pub extern "C" fn c_ret_i8() -> i8 { 0 } - -// x86_64: signext i16 @c_ret_i16() -// i686: signext i16 @c_ret_i16() -// aarch64-apple: signext i16 @c_ret_i16() -// aarch64-windows: i16 @c_ret_i16() -// aarch64-linux: i16 @c_ret_i16() -// arm: signext i16 @c_ret_i16() -// riscv: signext i16 @c_ret_i16() -#[no_mangle] pub extern "C" fn c_ret_i16() -> i16 { 0 } - -// x86_64: i32 @c_ret_i32() -// i686: i32 @c_ret_i32() -// aarch64-apple: i32 @c_ret_i32() -// aarch64-windows: i32 @c_ret_i32() -// aarch64-linux: i32 @c_ret_i32() -// arm: i32 @c_ret_i32() -// riscv: signext i32 @c_ret_i32() -#[no_mangle] pub extern "C" fn c_ret_i32() -> i32 { 0 } - -// x86_64: i64 @c_ret_i64() -// i686: i64 @c_ret_i64() -// aarch64-apple: i64 @c_ret_i64() -// aarch64-windows: i64 @c_ret_i64() -// aarch64-linux: i64 @c_ret_i64() -// arm: i64 @c_ret_i64() -// riscv: i64 @c_ret_i64() -#[no_mangle] pub extern "C" fn c_ret_i64() -> i64 { 0 } - -const C_SOURCE_FILE: &'static str = r##" -#include <stdlib.h> -#include <stdint.h> -#include <stdio.h> - -void c_arg_u8(uint8_t _a) { } -void c_arg_u16(uint16_t _a) { } -void c_arg_u32(uint32_t _a) { } -void c_arg_u64(uint64_t _a) { } - -void c_arg_i8(int8_t _a) { } -void c_arg_i16(int16_t _a) { } -void c_arg_i32(int32_t _a) { } -void c_arg_i64(int64_t _a) { } - -uint8_t c_ret_u8() { return 0; } -uint16_t c_ret_u16() { return 0; } -uint32_t c_ret_u32() { return 0; } -uint64_t c_ret_u64() { return 0; } - -int8_t c_ret_i8() { return 0; } -int16_t c_ret_i16() { return 0; } -int32_t c_ret_i32() { return 0; } -int64_t c_ret_i64() { return 0; } -"##; diff --git a/src/test/codegen/some-global-nonnull.rs b/src/test/codegen/some-global-nonnull.rs deleted file mode 100644 index 59c47de41..000000000 --- a/src/test/codegen/some-global-nonnull.rs +++ /dev/null @@ -1,25 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @test -// CHECK-NEXT: start: -// CHECK-NEXT: tail call void @ext_fn0() -#[no_mangle] -pub fn test() { - test_inner(Some(inner0)); -} - -fn test_inner(f_maybe: Option<fn()>) { - if let Some(f) = f_maybe { - f(); - } -} - -fn inner0() { - unsafe { ext_fn0() }; -} - -extern "C" { - fn ext_fn0(); -} diff --git a/src/test/codegen/sparc-struct-abi.rs b/src/test/codegen/sparc-struct-abi.rs deleted file mode 100644 index e8816e4f3..000000000 --- a/src/test/codegen/sparc-struct-abi.rs +++ /dev/null @@ -1,103 +0,0 @@ -// Checks that we correctly codegen extern "C" functions returning structs. -// See issues #52638 and #86163. - -// compile-flags: -O --target=sparc64-unknown-linux-gnu --crate-type=rlib -// needs-llvm-components: sparc -#![feature(no_core, lang_items)] -#![no_core] - -#[lang="sized"] -trait Sized { } -#[lang="freeze"] -trait Freeze { } -#[lang="copy"] -trait Copy { } - -#[repr(C)] -pub struct Bool { - b: bool, -} - -// CHECK: define i64 @structbool() -// CHECK-NEXT: start: -// CHECK-NEXT: ret i64 72057594037927936 -#[no_mangle] -pub extern "C" fn structbool() -> Bool { - Bool { b: true } -} - - -#[repr(C)] -pub struct BoolFloat { - b: bool, - f: f32, -} - -// CHECK: define inreg { i32, float } @structboolfloat() -// CHECK-NEXT: start: -// CHECK-NEXT: ret { i32, float } { i32 16777216, float 0x40091EB860000000 } -#[no_mangle] -pub extern "C" fn structboolfloat() -> BoolFloat { - BoolFloat { b: true, f: 3.14 } -} - -// CHECK: define void @structboolfloat_input({ i32, float } inreg %0) -// CHECK-NEXT: start: -#[no_mangle] -pub extern "C" fn structboolfloat_input(a: BoolFloat) { } - - -#[repr(C)] -pub struct ShortDouble { - s: i16, - d: f64, -} - -// CHECK: define { i64, double } @structshortdouble() -// CHECK-NEXT: start: -// CHECK-NEXT: ret { i64, double } { i64 34621422135410688, double 3.140000e+00 } -#[no_mangle] -pub extern "C" fn structshortdouble() -> ShortDouble { - ShortDouble { s: 123, d: 3.14 } -} - -// CHECK: define void @structshortdouble_input({ i64, double } %0) -// CHECK-NEXT: start: -#[no_mangle] -pub extern "C" fn structshortdouble_input(a: ShortDouble) { } - - -#[repr(C)] -pub struct FloatLongFloat { - f: f32, - i: i64, - g: f32, -} - -// CHECK: define inreg { float, i32, i64, float, i32 } @structfloatlongfloat() -// CHECK-NEXT: start: -// CHECK-NEXT: ret { float, i32, i64, float, i32 } { float 0x3FB99999A0000000, i32 undef, i64 123, float 0x40091EB860000000, i32 undef } -#[no_mangle] -pub extern "C" fn structfloatlongfloat() -> FloatLongFloat { - FloatLongFloat { f: 0.1, i: 123, g: 3.14 } -} - -#[repr(C)] -pub struct FloatFloat { - f: f32, - g: f32, -} - -#[repr(C)] -pub struct NestedStructs { - a: FloatFloat, - b: FloatFloat, -} - -// CHECK: define inreg { float, float, float, float } @structnestestructs() -// CHECK-NEXT: start: -// CHECK-NEXT: ret { float, float, float, float } { float 0x3FB99999A0000000, float 0x3FF19999A0000000, float 0x40019999A0000000, float 0x400A666660000000 } -#[no_mangle] -pub extern "C" fn structnestestructs() -> NestedStructs { - NestedStructs { a: FloatFloat { f: 0.1, g: 1.1 }, b: FloatFloat { f: 2.2, g: 3.3 } } -} diff --git a/src/test/codegen/src-hash-algorithm/src-hash-algorithm-md5.rs b/src/test/codegen/src-hash-algorithm/src-hash-algorithm-md5.rs deleted file mode 100644 index 64be11277..000000000 --- a/src/test/codegen/src-hash-algorithm/src-hash-algorithm-md5.rs +++ /dev/null @@ -1,6 +0,0 @@ -// compile-flags: -g -Z src-hash-algorithm=md5 - -#![crate_type = "lib"] - -pub fn test() {} -// CHECK: checksumkind: CSK_MD5 diff --git a/src/test/codegen/src-hash-algorithm/src-hash-algorithm-sha1.rs b/src/test/codegen/src-hash-algorithm/src-hash-algorithm-sha1.rs deleted file mode 100644 index 54e071521..000000000 --- a/src/test/codegen/src-hash-algorithm/src-hash-algorithm-sha1.rs +++ /dev/null @@ -1,6 +0,0 @@ -// compile-flags: -g -Z src-hash-algorithm=sha1 - -#![crate_type = "lib"] - -pub fn test() {} -// CHECK: checksumkind: CSK_SHA1 diff --git a/src/test/codegen/src-hash-algorithm/src-hash-algorithm-sha256.rs b/src/test/codegen/src-hash-algorithm/src-hash-algorithm-sha256.rs deleted file mode 100644 index dc7db8e23..000000000 --- a/src/test/codegen/src-hash-algorithm/src-hash-algorithm-sha256.rs +++ /dev/null @@ -1,6 +0,0 @@ -// compile-flags: -g -Z src-hash-algorithm=sha256 - -#![crate_type = "lib"] - -pub fn test() {} -// CHECK: checksumkind: CSK_SHA256 diff --git a/src/test/codegen/sse42-implies-crc32.rs b/src/test/codegen/sse42-implies-crc32.rs deleted file mode 100644 index 47b1a8993..000000000 --- a/src/test/codegen/sse42-implies-crc32.rs +++ /dev/null @@ -1,16 +0,0 @@ -// only-x86_64 -// min-llvm-version: 14.0 -// compile-flags: -Copt-level=3 - -#![crate_type = "lib"] - -#[cfg(target_arch = "x86_64")] -#[target_feature(enable = "sse4.2")] -#[no_mangle] -pub unsafe fn crc32sse(v: u8) -> u32 { - use std::arch::x86_64::*; - let out = !0u32; - _mm_crc32_u8(out, v) -} - -// CHECK: attributes #0 {{.*"target-features"="\+sse4.2,\+crc32"}} diff --git a/src/test/codegen/stack-probes-call.rs b/src/test/codegen/stack-probes-call.rs deleted file mode 100644 index a18fd41c2..000000000 --- a/src/test/codegen/stack-probes-call.rs +++ /dev/null @@ -1,24 +0,0 @@ -// Check the "probe-stack" attribute for targets with `StackProbeType::Call`, -// or `StackProbeType::InlineOrCall` when running on older LLVM. - -// compile-flags: -C no-prepopulate-passes -// revisions: i686 x86_64 -//[i686] compile-flags: --target i686-unknown-linux-gnu -//[i686] needs-llvm-components: x86 -//[i686] ignore-llvm-version: 16 - 99 -//[x86_64] compile-flags: --target x86_64-unknown-linux-gnu -//[x86_64] needs-llvm-components: x86 -//[x86_64] ignore-llvm-version: 16 - 99 - -#![crate_type = "rlib"] -#![feature(no_core, lang_items)] -#![no_core] - -#[lang = "sized"] -trait Sized {} - -#[no_mangle] -pub fn foo() { -// CHECK: @foo() unnamed_addr #0 -// CHECK: attributes #0 = { {{.*}}"probe-stack"="__rust_probestack"{{.*}} } -} diff --git a/src/test/codegen/stack-probes-inline.rs b/src/test/codegen/stack-probes-inline.rs deleted file mode 100644 index a6b781de5..000000000 --- a/src/test/codegen/stack-probes-inline.rs +++ /dev/null @@ -1,32 +0,0 @@ -// Check the "probe-stack" attribute for targets with `StackProbeType::Inline`, -// or `StackProbeType::InlineOrCall` when running on newer LLVM. - -// compile-flags: -C no-prepopulate-passes -// revisions: powerpc powerpc64 powerpc64le s390x i686 x86_64 -//[powerpc] compile-flags: --target powerpc-unknown-linux-gnu -//[powerpc] needs-llvm-components: powerpc -//[powerpc64] compile-flags: --target powerpc64-unknown-linux-gnu -//[powerpc64] needs-llvm-components: powerpc -//[powerpc64le] compile-flags: --target powerpc64le-unknown-linux-gnu -//[powerpc64le] needs-llvm-components: powerpc -//[s390x] compile-flags: --target s390x-unknown-linux-gnu -//[s390x] needs-llvm-components: systemz -//[i686] compile-flags: --target i686-unknown-linux-gnu -//[i686] needs-llvm-components: x86 -//[i686] min-llvm-version: 16 -//[x86_64] compile-flags: --target x86_64-unknown-linux-gnu -//[x86_64] needs-llvm-components: x86 -//[x86_64] min-llvm-version: 16 - -#![crate_type = "rlib"] -#![feature(no_core, lang_items)] -#![no_core] - -#[lang = "sized"] -trait Sized {} - -#[no_mangle] -pub fn foo() { -// CHECK: @foo() unnamed_addr #0 -// CHECK: attributes #0 = { {{.*}}"probe-stack"="inline-asm"{{.*}} } -} diff --git a/src/test/codegen/stack-protector.rs b/src/test/codegen/stack-protector.rs deleted file mode 100644 index a24e6f1e4..000000000 --- a/src/test/codegen/stack-protector.rs +++ /dev/null @@ -1,34 +0,0 @@ -// revisions: all strong basic none -// ignore-nvptx64 stack protector not supported -// [all] compile-flags: -Z stack-protector=all -// [strong] compile-flags: -Z stack-protector=strong -// [basic] compile-flags: -Z stack-protector=basic - -#![crate_type = "lib"] - -#[no_mangle] -pub fn foo() { - // CHECK: @foo() unnamed_addr #0 - - // all-NOT: attributes #0 = { {{.*}} sspstrong {{.*}} } - // all-NOT: attributes #0 = { {{.*}} ssp {{.*}} } - // all: attributes #0 = { {{.*}} sspreq {{.*}} } - // all-NOT: attributes #0 = { {{.*}} sspstrong {{.*}} } - // all-NOT: attributes #0 = { {{.*}} ssp {{.*}} } - - // strong-NOT: attributes #0 = { {{.*}} sspreq {{.*}} } - // strong-NOT: attributes #0 = { {{.*}} ssp {{.*}} } - // strong: attributes #0 = { {{.*}} sspstrong {{.*}} } - // strong-NOT: attributes #0 = { {{.*}} sspreq {{.*}} } - // strong-NOT: attributes #0 = { {{.*}} ssp {{.*}} } - - // basic-NOT: attributes #0 = { {{.*}} sspreq {{.*}} } - // basic-NOT: attributes #0 = { {{.*}} sspstrong {{.*}} } - // basic: attributes #0 = { {{.*}} ssp {{.*}} } - // basic-NOT: attributes #0 = { {{.*}} sspreq {{.*}} } - // basic-NOT: attributes #0 = { {{.*}} sspstrong {{.*}} } - - // none-NOT: attributes #0 = { {{.*}} sspreq {{.*}} } - // none-NOT: attributes #0 = { {{.*}} sspstrong {{.*}} } - // none-NOT: attributes #0 = { {{.*}} ssp {{.*}} } -} diff --git a/src/test/codegen/static-relocation-model-msvc.rs b/src/test/codegen/static-relocation-model-msvc.rs deleted file mode 100644 index b2afc7deb..000000000 --- a/src/test/codegen/static-relocation-model-msvc.rs +++ /dev/null @@ -1,26 +0,0 @@ -// Verify linkage of external symbols in the static relocation model on MSVC. -// -// compile-flags: -O -C relocation-model=static -// aux-build: extern_decl.rs -// only-x86_64-pc-windows-msvc - -#![crate_type = "rlib"] - -extern crate extern_decl; - -// The `extern_decl` definitions are imported from a statically linked rust -// crate, thus they are expected to be marked `dso_local` without `dllimport`. -// -// The `access_extern()` symbol is from this compilation unit, thus we expect -// it to be marked `dso_local` as well, given the static relocation model. -// -// CHECK: @extern_static = external dso_local local_unnamed_addr global i8 -// CHECK: define dso_local i8 @access_extern() {{.*}} -// CHECK: declare dso_local i8 @extern_fn() {{.*}} - -#[no_mangle] -pub fn access_extern() -> u8 { - unsafe { - extern_decl::extern_fn() + extern_decl::extern_static - } -} diff --git a/src/test/codegen/staticlib-external-inline-fns.rs b/src/test/codegen/staticlib-external-inline-fns.rs deleted file mode 100644 index 432c063e8..000000000 --- a/src/test/codegen/staticlib-external-inline-fns.rs +++ /dev/null @@ -1,43 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "staticlib"] - -// CHECK: define{{.*}}void @a() -#[no_mangle] -#[inline] -pub extern "C" fn a() {} - -// CHECK: define{{.*}}void @b() -#[export_name = "b"] -#[inline] -pub extern "C" fn b() {} - -// CHECK: define{{.*}}void @c() -#[no_mangle] -#[inline] -extern "C" fn c() {} - -// CHECK: define{{.*}}void @d() -#[export_name = "d"] -#[inline] -extern "C" fn d() {} - -// CHECK: define{{.*}}void @e() -#[no_mangle] -#[inline(always)] -pub extern "C" fn e() {} - -// CHECK: define{{.*}}void @f() -#[export_name = "f"] -#[inline(always)] -pub extern "C" fn f() {} - -// CHECK: define{{.*}}void @g() -#[no_mangle] -#[inline(always)] -extern "C" fn g() {} - -// CHECK: define{{.*}}void @h() -#[export_name = "h"] -#[inline(always)] -extern "C" fn h() {} diff --git a/src/test/codegen/stores.rs b/src/test/codegen/stores.rs deleted file mode 100644 index 837256e53..000000000 --- a/src/test/codegen/stores.rs +++ /dev/null @@ -1,35 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// - -#![crate_type = "lib"] - -pub struct Bytes { - a: u8, - b: u8, - c: u8, - d: u8, -} - -// CHECK-LABEL: small_array_alignment -// The array is stored as i32, but its alignment is lower, go with 1 byte to avoid target -// dependent alignment -#[no_mangle] -pub fn small_array_alignment(x: &mut [i8; 4], y: [i8; 4]) { -// CHECK: [[TMP:%.+]] = alloca i32 -// CHECK: %y = alloca [4 x i8] -// CHECK: store i32 %0, {{i32\*|ptr}} [[TMP]] -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 {{.+}}, {{i8\*|ptr}} align 4 {{.+}}, i{{[0-9]+}} 4, i1 false) - *x = y; -} - -// CHECK-LABEL: small_struct_alignment -// The struct is stored as i32, but its alignment is lower, go with 1 byte to avoid target -// dependent alignment -#[no_mangle] -pub fn small_struct_alignment(x: &mut Bytes, y: Bytes) { -// CHECK: [[TMP:%.+]] = alloca i32 -// CHECK: %y = alloca %Bytes -// CHECK: store i32 %0, {{i32\*|ptr}} [[TMP]] -// CHECK: call void @llvm.memcpy.{{.*}}({{i8\*|ptr}} align 1 {{.+}}, {{i8\*|ptr}} align 4 {{.+}}, i{{[0-9]+}} 4, i1 false) - *x = y; -} diff --git a/src/test/codegen/swap-large-types.rs b/src/test/codegen/swap-large-types.rs deleted file mode 100644 index 4a6840357..000000000 --- a/src/test/codegen/swap-large-types.rs +++ /dev/null @@ -1,91 +0,0 @@ -// compile-flags: -O -// only-x86_64 -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] - -use std::mem::swap; -use std::ptr::{read, copy_nonoverlapping, write}; - -type KeccakBuffer = [[u64; 5]; 5]; - -// A basic read+copy+write swap implementation ends up copying one of the values -// to stack for large types, which is completely unnecessary as the lack of -// overlap means we can just do whatever fits in registers at a time. - -// CHECK-LABEL: @swap_basic -#[no_mangle] -pub fn swap_basic(x: &mut KeccakBuffer, y: &mut KeccakBuffer) { -// CHECK: alloca [5 x [5 x i64]] - - // SAFETY: exclusive references are always valid to read/write, - // are non-overlapping, and nothing here panics so it's drop-safe. - unsafe { - let z = read(x); - copy_nonoverlapping(y, x, 1); - write(y, z); - } -} - -// This test verifies that the library does something smarter, and thus -// doesn't need any scratch space on the stack. - -// CHECK-LABEL: @swap_std -#[no_mangle] -pub fn swap_std(x: &mut KeccakBuffer, y: &mut KeccakBuffer) { -// CHECK-NOT: alloca -// CHECK: load <{{[0-9]+}} x i64> -// CHECK: store <{{[0-9]+}} x i64> - swap(x, y) -} - -// Verify that types with usize alignment are swapped via vectored usizes, -// not falling back to byte-level code. - -// CHECK-LABEL: @swap_slice -#[no_mangle] -pub fn swap_slice(x: &mut [KeccakBuffer], y: &mut [KeccakBuffer]) { -// CHECK-NOT: alloca -// CHECK: load <{{[0-9]+}} x i64> -// CHECK: store <{{[0-9]+}} x i64> - if x.len() == y.len() { - x.swap_with_slice(y); - } -} - -// But for a large align-1 type, vectorized byte copying is what we want. - -type OneKilobyteBuffer = [u8; 1024]; - -// CHECK-LABEL: @swap_1kb_slices -#[no_mangle] -pub fn swap_1kb_slices(x: &mut [OneKilobyteBuffer], y: &mut [OneKilobyteBuffer]) { -// CHECK-NOT: alloca -// CHECK: load <{{[0-9]+}} x i8> -// CHECK: store <{{[0-9]+}} x i8> - if x.len() == y.len() { - x.swap_with_slice(y); - } -} - -// This verifies that the 2×read + 2×write optimizes to just 3 memcpys -// for an unusual type like this. It's not clear whether we should do anything -// smarter in Rust for these, so for now it's fine to leave these up to the backend. -// That's not as bad as it might seem, as for example, LLVM will lower the -// memcpys below to VMOVAPS on YMMs if one enables the AVX target feature. -// Eventually we'll be able to pass `align_of::<T>` to a const generic and -// thus pick a smarter chunk size ourselves without huge code duplication. - -#[repr(align(64))] -pub struct BigButHighlyAligned([u8; 64 * 3]); - -// CHECK-LABEL: @swap_big_aligned -#[no_mangle] -pub fn swap_big_aligned(x: &mut BigButHighlyAligned, y: &mut BigButHighlyAligned) { -// CHECK-NOT: call void @llvm.memcpy -// CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} noundef nonnull align 64 dereferenceable(192) -// CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} noundef nonnull align 64 dereferenceable(192) -// CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} noundef nonnull align 64 dereferenceable(192) -// CHECK-NOT: call void @llvm.memcpy - swap(x, y) -} diff --git a/src/test/codegen/swap-simd-types.rs b/src/test/codegen/swap-simd-types.rs deleted file mode 100644 index c90b277eb..000000000 --- a/src/test/codegen/swap-simd-types.rs +++ /dev/null @@ -1,32 +0,0 @@ -// compile-flags: -O -C target-feature=+avx -// only-x86_64 -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] - -use std::mem::swap; - -// SIMD types are highly-aligned already, so make sure the swap code leaves their -// types alone and doesn't pessimize them (such as by swapping them as `usize`s). -extern crate core; -use core::arch::x86_64::__m256; - -// CHECK-LABEL: @swap_single_m256 -#[no_mangle] -pub fn swap_single_m256(x: &mut __m256, y: &mut __m256) { -// CHECK-NOT: alloca -// CHECK: load <8 x float>{{.+}}align 32 -// CHECK: store <8 x float>{{.+}}align 32 - swap(x, y) -} - -// CHECK-LABEL: @swap_m256_slice -#[no_mangle] -pub fn swap_m256_slice(x: &mut [__m256], y: &mut [__m256]) { -// CHECK-NOT: alloca -// CHECK: load <8 x float>{{.+}}align 32 -// CHECK: store <8 x float>{{.+}}align 32 - if x.len() == y.len() { - x.swap_with_slice(y); - } -} diff --git a/src/test/codegen/swap-small-types.rs b/src/test/codegen/swap-small-types.rs deleted file mode 100644 index 03e2a2327..000000000 --- a/src/test/codegen/swap-small-types.rs +++ /dev/null @@ -1,63 +0,0 @@ -// compile-flags: -O -// only-x86_64 -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] - -use std::mem::swap; - -type RGB48 = [u16; 3]; - -// CHECK-LABEL: @swap_rgb48 -#[no_mangle] -pub fn swap_rgb48(x: &mut RGB48, y: &mut RGB48) { - // FIXME MIR inlining messes up LLVM optimizations. -// WOULD-CHECK-NOT: alloca -// WOULD-CHECK: load i48 -// WOULD-CHECK: store i48 - swap(x, y) -} - -// LLVM doesn't vectorize a loop over 3-byte elements, -// so we chunk it down to bytes and loop over those instead. -type RGB24 = [u8; 3]; - -// CHECK-LABEL: @swap_rgb24_slices -#[no_mangle] -pub fn swap_rgb24_slices(x: &mut [RGB24], y: &mut [RGB24]) { -// CHECK-NOT: alloca -// CHECK: load <{{[0-9]+}} x i8> -// CHECK: store <{{[0-9]+}} x i8> - if x.len() == y.len() { - x.swap_with_slice(y); - } -} - -// This one has a power-of-two size, so we iterate over it directly -type RGBA32 = [u8; 4]; - -// CHECK-LABEL: @swap_rgba32_slices -#[no_mangle] -pub fn swap_rgba32_slices(x: &mut [RGBA32], y: &mut [RGBA32]) { -// CHECK-NOT: alloca -// CHECK: load <{{[0-9]+}} x i32> -// CHECK: store <{{[0-9]+}} x i32> - if x.len() == y.len() { - x.swap_with_slice(y); - } -} - -// Strings have a non-power-of-two size, but have pointer alignment, -// so we swap usizes instead of dropping all the way down to bytes. -const _: () = assert!(!std::mem::size_of::<String>().is_power_of_two()); - -// CHECK-LABEL: @swap_string_slices -#[no_mangle] -pub fn swap_string_slices(x: &mut [String], y: &mut [String]) { -// CHECK-NOT: alloca -// CHECK: load <{{[0-9]+}} x i64> -// CHECK: store <{{[0-9]+}} x i64> - if x.len() == y.len() { - x.swap_with_slice(y); - } -} diff --git a/src/test/codegen/target-cpu-on-functions.rs b/src/test/codegen/target-cpu-on-functions.rs deleted file mode 100644 index c043eceb5..000000000 --- a/src/test/codegen/target-cpu-on-functions.rs +++ /dev/null @@ -1,21 +0,0 @@ -// This test makes sure that functions get annotated with the proper -// "target-cpu" attribute in LLVM. - -// no-prefer-dynamic -// -// compile-flags: -C no-prepopulate-passes -C panic=abort -C linker-plugin-lto -Cpasses=name-anon-globals - -#![crate_type = "staticlib"] - -// CHECK-LABEL: define {{.*}} @exported() {{.*}} #0 -#[no_mangle] -pub extern "C" fn exported() { - not_exported(); -} - -// CHECK-LABEL: ; target_cpu_on_functions::not_exported -// CHECK-NEXT: ; Function Attrs: -// CHECK-NEXT: define {{.*}}() {{.*}} #0 -fn not_exported() {} - -// CHECK: attributes #0 = {{.*}} "target-cpu"="{{.*}}" diff --git a/src/test/codegen/target-feature-overrides.rs b/src/test/codegen/target-feature-overrides.rs deleted file mode 100644 index 4be77e36e..000000000 --- a/src/test/codegen/target-feature-overrides.rs +++ /dev/null @@ -1,47 +0,0 @@ -// revisions: COMPAT INCOMPAT -// needs-llvm-components: x86 -// compile-flags: --target=x86_64-unknown-linux-gnu -Copt-level=3 -// [COMPAT] compile-flags: -Ctarget-feature=+avx2,+avx -// [INCOMPAT] compile-flags: -Ctarget-feature=-avx2,-avx - -// See also src/test/assembly/target-feature-multiple.rs -#![feature(no_core, lang_items)] -#![crate_type = "lib"] -#![no_core] - - -#[lang = "sized"] -trait Sized {} -#[lang = "copy"] -trait Copy {} - -extern "C" { - fn peach() -> u32; -} - -#[inline] -#[target_feature(enable = "avx")] -#[no_mangle] -pub unsafe fn apple() -> u32 { -// CHECK-LABEL: @apple() -// CHECK-SAME: [[APPLEATTRS:#[0-9]+]] { -// CHECK: {{.*}}call{{.*}}@peach - peach() -} - -// target features same as global -#[no_mangle] -pub unsafe fn banana() -> u32 { -// CHECK-LABEL: @banana() -// CHECK-SAME: [[BANANAATTRS:#[0-9]+]] { -// COMPAT: {{.*}}call{{.*}}@peach -// INCOMPAT: {{.*}}call{{.*}}@apple - apple() // Compatible for inline in COMPAT revision and can't be inlined in INCOMPAT -} - -// CHECK: attributes [[APPLEATTRS]] -// COMPAT-SAME: "target-features"="+avx2,+avx,+avx" -// INCOMPAT-SAME: "target-features"="-avx2,-avx,+avx" -// CHECK: attributes [[BANANAATTRS]] -// COMPAT-SAME: "target-features"="+avx2,+avx" -// INCOMPAT-SAME: "target-features"="-avx2,-avx" diff --git a/src/test/codegen/thread-local.rs b/src/test/codegen/thread-local.rs deleted file mode 100644 index 0f1b29ca7..000000000 --- a/src/test/codegen/thread-local.rs +++ /dev/null @@ -1,49 +0,0 @@ -// compile-flags: -O -// aux-build:thread_local_aux.rs -// ignore-windows FIXME(#84933) -// ignore-wasm globals are used instead of thread locals -// ignore-emscripten globals are used instead of thread locals -// ignore-android does not use #[thread_local] - -#![crate_type = "lib"] - -extern crate thread_local_aux as aux; - -use std::cell::Cell; - -thread_local!(static A: Cell<u32> = const { Cell::new(1) }); - -// CHECK: [[TLS_AUX:@.+]] = external thread_local local_unnamed_addr global i64 -// CHECK: [[TLS:@.+]] = internal thread_local unnamed_addr global - -// CHECK-LABEL: @get -#[no_mangle] -fn get() -> u32 { - // CHECK: %0 = load i32, {{.*}}[[TLS]]{{.*}} - // CHECK-NEXT: ret i32 %0 - A.with(|a| a.get()) -} - -// CHECK-LABEL: @set -#[no_mangle] -fn set(v: u32) { - // CHECK: store i32 %0, {{.*}}[[TLS]]{{.*}} - // CHECK-NEXT: ret void - A.with(|a| a.set(v)) -} - -// CHECK-LABEL: @get_aux -#[no_mangle] -fn get_aux() -> u64 { - // CHECK: %0 = load i64, {{.*}}[[TLS_AUX]] - // CHECK-NEXT: ret i64 %0 - aux::A.with(|a| a.get()) -} - -// CHECK-LABEL: @set_aux -#[no_mangle] -fn set_aux(v: u64) { - // CHECK: store i64 %0, {{.*}}[[TLS_AUX]] - // CHECK-NEXT: ret void - aux::A.with(|a| a.set(v)) -} diff --git a/src/test/codegen/to_vec.rs b/src/test/codegen/to_vec.rs deleted file mode 100644 index 60dc4efcb..000000000 --- a/src/test/codegen/to_vec.rs +++ /dev/null @@ -1,10 +0,0 @@ -// compile-flags: -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @copy_to_vec -#[no_mangle] -fn copy_to_vec(s: &[u64]) -> Vec<u64> { - s.to_vec() - // CHECK: call void @llvm.memcpy -} diff --git a/src/test/codegen/transmute-scalar.rs b/src/test/codegen/transmute-scalar.rs deleted file mode 100644 index a7e5deeff..000000000 --- a/src/test/codegen/transmute-scalar.rs +++ /dev/null @@ -1,81 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes - -#![crate_type = "lib"] - -// FIXME(eddyb) all of these tests show memory stores and loads, even after a -// scalar `bitcast`, more special-casing is required to remove `alloca` usage. - -// CHECK-LABEL: define{{.*}}i32 @f32_to_bits(float %x) -// CHECK: store i32 %{{.*}}, {{.*}} %0 -// CHECK-NEXT: %[[RES:.*]] = load i32, {{.*}} %0 -// CHECK: ret i32 %[[RES]] -#[no_mangle] -pub fn f32_to_bits(x: f32) -> u32 { - unsafe { std::mem::transmute(x) } -} - -// CHECK-LABEL: define{{.*}}i8 @bool_to_byte(i1 noundef zeroext %b) -// CHECK: %1 = zext i1 %b to i8 -// CHECK-NEXT: store i8 %1, {{.*}} %0 -// CHECK-NEXT: %2 = load i8, {{.*}} %0 -// CHECK: ret i8 %2 -#[no_mangle] -pub fn bool_to_byte(b: bool) -> u8 { - unsafe { std::mem::transmute(b) } -} - -// CHECK-LABEL: define{{.*}}noundef zeroext i1 @byte_to_bool(i8 %byte) -// CHECK: %1 = trunc i8 %byte to i1 -// CHECK-NEXT: %2 = zext i1 %1 to i8 -// CHECK-NEXT: store i8 %2, {{.*}} %0 -// CHECK-NEXT: %3 = load i8, {{.*}} %0 -// CHECK-NEXT: %4 = trunc i8 %3 to i1 -// CHECK: ret i1 %4 -#[no_mangle] -pub unsafe fn byte_to_bool(byte: u8) -> bool { - std::mem::transmute(byte) -} - -// CHECK-LABEL: define{{.*}}{{i8\*|ptr}} @ptr_to_ptr({{i16\*|ptr}} %p) -// CHECK: store {{i8\*|ptr}} %{{.*}}, {{.*}} %0 -// CHECK-NEXT: %[[RES:.*]] = load {{i8\*|ptr}}, {{.*}} %0 -// CHECK: ret {{i8\*|ptr}} %[[RES]] -#[no_mangle] -pub fn ptr_to_ptr(p: *mut u16) -> *mut u8 { - unsafe { std::mem::transmute(p) } -} - -// HACK(eddyb) scalar `transmute`s between pointers and non-pointers are -// currently not special-cased like other scalar `transmute`s, because -// LLVM requires specifically `ptrtoint`/`inttoptr` instead of `bitcast`. -// -// Tests below show the non-special-cased behavior (with the possible -// future special-cased instructions in the "NOTE(eddyb)" comments). - -// CHECK: define{{.*}}[[USIZE:i[0-9]+]] @ptr_to_int({{i16\*|ptr}} %p) - -// NOTE(eddyb) see above, the following two CHECK lines should ideally be this: -// %2 = ptrtoint i16* %p to [[USIZE]] -// store [[USIZE]] %2, [[USIZE]]* %0 -// CHECK: store {{i16\*|ptr}} %p, {{.*}} - -// CHECK-NEXT: %[[RES:.*]] = load [[USIZE]], {{.*}} %0 -// CHECK: ret [[USIZE]] %[[RES]] -#[no_mangle] -pub fn ptr_to_int(p: *mut u16) -> usize { - unsafe { std::mem::transmute(p) } -} - -// CHECK: define{{.*}}{{i16\*|ptr}} @int_to_ptr([[USIZE]] %i) - -// NOTE(eddyb) see above, the following two CHECK lines should ideally be this: -// %2 = inttoptr [[USIZE]] %i to i16* -// store i16* %2, i16** %0 -// CHECK: store [[USIZE]] %i, {{.*}} - -// CHECK-NEXT: %[[RES:.*]] = load {{i16\*|ptr}}, {{.*}} %0 -// CHECK: ret {{i16\*|ptr}} %[[RES]] -#[no_mangle] -pub fn int_to_ptr(i: usize) -> *mut u16 { - unsafe { std::mem::transmute(i) } -} diff --git a/src/test/codegen/try_identity.rs b/src/test/codegen/try_identity.rs deleted file mode 100644 index 92be90014..000000000 --- a/src/test/codegen/try_identity.rs +++ /dev/null @@ -1,34 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -O -Z mir-opt-level=3 -Zunsound-mir-opts - -// Ensure that `x?` has no overhead on `Result<T, E>` due to identity `match`es in lowering. -// This requires inlining to trigger the MIR optimizations in `SimplifyArmIdentity`. - -#![crate_type = "lib"] - -type R = Result<u64, i32>; - -// This was written to the `?` from `try_trait`, but `try_trait_v2` uses a different structure, -// so the relevant desugar is copied inline in order to keep the test testing the same thing. -// FIXME(#85133): while this might be useful for `r#try!`, it would be nice to have a MIR -// optimization that picks up the `?` desugaring, as `SimplifyArmIdentity` does not. -#[no_mangle] -pub fn try_identity(x: R) -> R { -// CHECK: start: -// FIXME(JakobDegen): Broken by deaggregation change CHECK-NOT\: br {{.*}} -// CHECK ret void - let y = match into_result(x) { - Err(e) => return from_error(From::from(e)), - Ok(v) => v, - }; - Ok(y) -} - -#[inline] -fn into_result<T, E>(r: Result<T, E>) -> Result<T, E> { - r -} - -#[inline] -fn from_error<T, E>(e: E) -> Result<T, E> { - Err(e) -} diff --git a/src/test/codegen/try_question_mark_nop.rs b/src/test/codegen/try_question_mark_nop.rs deleted file mode 100644 index d23938776..000000000 --- a/src/test/codegen/try_question_mark_nop.rs +++ /dev/null @@ -1,54 +0,0 @@ -// min-llvm-version: 15.0 -// compile-flags: -O -Z merge-functions=disabled --edition=2021 -// only-x86_64 - -#![crate_type = "lib"] -#![feature(try_blocks)] - -// These are now NOPs in LLVM 15, presumably thanks to nikic's change mentioned in -// <https://github.com/rust-lang/rust/issues/85133#issuecomment-1072168354>. -// Unfortunately, as of 2022-08-17 they're not yet nops for `u64`s nor `Option`. - -use std::ops::ControlFlow::{self, Continue, Break}; - -// CHECK-LABEL: @result_nop_match_32 -#[no_mangle] -pub fn result_nop_match_32(x: Result<i32, u32>) -> Result<i32, u32> { - // CHECK: start - // CHECK-NEXT: ret i64 %0 - match x { - Ok(x) => Ok(x), - Err(x) => Err(x), - } -} - -// CHECK-LABEL: @result_nop_traits_32 -#[no_mangle] -pub fn result_nop_traits_32(x: Result<i32, u32>) -> Result<i32, u32> { - // CHECK: start - // CHECK-NEXT: ret i64 %0 - try { - x? - } -} - -// CHECK-LABEL: @control_flow_nop_match_32 -#[no_mangle] -pub fn control_flow_nop_match_32(x: ControlFlow<i32, u32>) -> ControlFlow<i32, u32> { - // CHECK: start - // CHECK-NEXT: ret i64 %0 - match x { - Continue(x) => Continue(x), - Break(x) => Break(x), - } -} - -// CHECK-LABEL: @control_flow_nop_traits_32 -#[no_mangle] -pub fn control_flow_nop_traits_32(x: ControlFlow<i32, u32>) -> ControlFlow<i32, u32> { - // CHECK: start - // CHECK-NEXT: ret i64 %0 - try { - x? - } -} diff --git a/src/test/codegen/tune-cpu-on-functions.rs b/src/test/codegen/tune-cpu-on-functions.rs deleted file mode 100644 index ed8dc0e93..000000000 --- a/src/test/codegen/tune-cpu-on-functions.rs +++ /dev/null @@ -1,21 +0,0 @@ -// This test makes sure that functions get annotated with the proper -// "tune-cpu" attribute in LLVM. - -// no-prefer-dynamic -// -// compile-flags: -C no-prepopulate-passes -C panic=abort -C linker-plugin-lto -Cpasses=name-anon-globals -Z tune-cpu=generic - -#![crate_type = "staticlib"] - -// CHECK-LABEL: define {{.*}} @exported() {{.*}} #0 -#[no_mangle] -pub extern fn exported() { - not_exported(); -} - -// CHECK-LABEL: ; tune_cpu_on_functions::not_exported -// CHECK-NEXT: ; Function Attrs: -// CHECK-NEXT: define {{.*}}() {{.*}} #0 -fn not_exported() {} - -// CHECK: attributes #0 = {{.*}} "tune-cpu"="{{.*}}" diff --git a/src/test/codegen/tuple-layout-opt.rs b/src/test/codegen/tuple-layout-opt.rs deleted file mode 100644 index e86c75f3f..000000000 --- a/src/test/codegen/tuple-layout-opt.rs +++ /dev/null @@ -1,36 +0,0 @@ -// ignore-emscripten -// compile-flags: -C no-prepopulate-passes - -// Test that tuples get optimized layout, in particular with a ZST in the last field (#63244) - -#![crate_type="lib"] - -type ScalarZstLast = (u128, ()); -// CHECK: define i128 @test_ScalarZstLast(i128 %_1) -#[no_mangle] -pub fn test_ScalarZstLast(_: ScalarZstLast) -> ScalarZstLast { loop {} } - -type ScalarZstFirst = ((), u128); -// CHECK: define i128 @test_ScalarZstFirst(i128 %_1) -#[no_mangle] -pub fn test_ScalarZstFirst(_: ScalarZstFirst) -> ScalarZstFirst { loop {} } - -type ScalarPairZstLast = (u8, u128, ()); -// CHECK: define { i128, i8 } @test_ScalarPairZstLast(i128 %_1.0, i8 %_1.1) -#[no_mangle] -pub fn test_ScalarPairZstLast(_: ScalarPairZstLast) -> ScalarPairZstLast { loop {} } - -type ScalarPairZstFirst = ((), u8, u128); -// CHECK: define { i8, i128 } @test_ScalarPairZstFirst(i8 %_1.0, i128 %_1.1) -#[no_mangle] -pub fn test_ScalarPairZstFirst(_: ScalarPairZstFirst) -> ScalarPairZstFirst { loop {} } - -type ScalarPairLotsOfZsts = ((), u8, (), u128, ()); -// CHECK: define { i128, i8 } @test_ScalarPairLotsOfZsts(i128 %_1.0, i8 %_1.1) -#[no_mangle] -pub fn test_ScalarPairLotsOfZsts(_: ScalarPairLotsOfZsts) -> ScalarPairLotsOfZsts { loop {} } - -type ScalarPairLottaNesting = (((), ((), u8, (), u128, ())), ()); -// CHECK: define { i128, i8 } @test_ScalarPairLottaNesting(i128 %_1.0, i8 %_1.1) -#[no_mangle] -pub fn test_ScalarPairLottaNesting(_: ScalarPairLottaNesting) -> ScalarPairLottaNesting { loop {} } diff --git a/src/test/codegen/unchecked-float-casts.rs b/src/test/codegen/unchecked-float-casts.rs deleted file mode 100644 index 4e3bfcd43..000000000 --- a/src/test/codegen/unchecked-float-casts.rs +++ /dev/null @@ -1,36 +0,0 @@ -// This file tests that we don't generate any code for saturation when using the -// unchecked intrinsics. - -// compile-flags: -C opt-level=3 -// ignore-wasm32 the wasm target is tested in `wasm_casts_*` - -#![crate_type = "lib"] - -// CHECK-LABEL: @f32_to_u32 -#[no_mangle] -pub fn f32_to_u32(x: f32) -> u32 { - // CHECK: fptoui - // CHECK-NOT: fcmp - // CHECK-NOT: icmp - // CHECK-NOT: select - unsafe { x.to_int_unchecked() } -} - -// CHECK-LABEL: @f32_to_i32 -#[no_mangle] -pub fn f32_to_i32(x: f32) -> i32 { - // CHECK: fptosi - // CHECK-NOT: fcmp - // CHECK-NOT: icmp - // CHECK-NOT: select - unsafe { x.to_int_unchecked() } -} - -#[no_mangle] -pub fn f64_to_u16(x: f64) -> u16 { - // CHECK: fptoui - // CHECK-NOT: fcmp - // CHECK-NOT: icmp - // CHECK-NOT: select - unsafe { x.to_int_unchecked() } -} diff --git a/src/test/codegen/unchecked_shifts.rs b/src/test/codegen/unchecked_shifts.rs deleted file mode 100644 index 60d0cb09a..000000000 --- a/src/test/codegen/unchecked_shifts.rs +++ /dev/null @@ -1,66 +0,0 @@ -// compile-flags: -O -// min-llvm-version: 15.0 (LLVM 13 in CI does this differently from submodule LLVM) -// ignore-debug (because unchecked is checked in debug) - -#![crate_type = "lib"] -#![feature(unchecked_math)] - -// CHECK-LABEL: @unchecked_shl_unsigned_same -#[no_mangle] -pub unsafe fn unchecked_shl_unsigned_same(a: u32, b: u32) -> u32 { - // CHECK-NOT: and i32 - // CHECK: shl i32 %a, %b - // CHECK-NOT: and i32 - a.unchecked_shl(b) -} - -// CHECK-LABEL: @unchecked_shl_unsigned_smaller -#[no_mangle] -pub unsafe fn unchecked_shl_unsigned_smaller(a: u16, b: u32) -> u16 { - // This uses -DAG to avoid failing on irrelevant reorderings, - // like emitting the truncation earlier. - - // CHECK-DAG: %[[INRANGE:.+]] = icmp ult i32 %b, 65536 - // CHECK-DAG: tail call void @llvm.assume(i1 %[[INRANGE]]) - // CHECK-DAG: %[[TRUNC:.+]] = trunc i32 %b to i16 - // CHECK-DAG: shl i16 %a, %[[TRUNC]] - a.unchecked_shl(b) -} - -// CHECK-LABEL: @unchecked_shl_unsigned_bigger -#[no_mangle] -pub unsafe fn unchecked_shl_unsigned_bigger(a: u64, b: u32) -> u64 { - // CHECK: %[[EXT:.+]] = zext i32 %b to i64 - // CHECK: shl i64 %a, %[[EXT]] - a.unchecked_shl(b) -} - -// CHECK-LABEL: @unchecked_shr_signed_same -#[no_mangle] -pub unsafe fn unchecked_shr_signed_same(a: i32, b: u32) -> i32 { - // CHECK-NOT: and i32 - // CHECK: ashr i32 %a, %b - // CHECK-NOT: and i32 - a.unchecked_shr(b) -} - -// CHECK-LABEL: @unchecked_shr_signed_smaller -#[no_mangle] -pub unsafe fn unchecked_shr_signed_smaller(a: i16, b: u32) -> i16 { - // This uses -DAG to avoid failing on irrelevant reorderings, - // like emitting the truncation earlier. - - // CHECK-DAG: %[[INRANGE:.+]] = icmp ult i32 %b, 32768 - // CHECK-DAG: tail call void @llvm.assume(i1 %[[INRANGE]]) - // CHECK-DAG: %[[TRUNC:.+]] = trunc i32 %b to i16 - // CHECK-DAG: ashr i16 %a, %[[TRUNC]] - a.unchecked_shr(b) -} - -// CHECK-LABEL: @unchecked_shr_signed_bigger -#[no_mangle] -pub unsafe fn unchecked_shr_signed_bigger(a: i64, b: u32) -> i64 { - // CHECK: %[[EXT:.+]] = zext i32 %b to i64 - // CHECK: ashr i64 %a, %[[EXT]] - a.unchecked_shr(b) -} diff --git a/src/test/codegen/uninit-consts.rs b/src/test/codegen/uninit-consts.rs deleted file mode 100644 index 4c07740b3..000000000 --- a/src/test/codegen/uninit-consts.rs +++ /dev/null @@ -1,55 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// min-llvm-version: 14.0 - -// Check that we use undef (and not zero) for uninitialized bytes in constants. - -#![crate_type = "lib"] - -use std::mem::MaybeUninit; - -pub struct PartiallyUninit { - x: u32, - y: MaybeUninit<[u8; 10]> -} - -// CHECK: [[FULLY_UNINIT:@[0-9]+]] = private unnamed_addr constant <{ [10 x i8] }> undef - -// CHECK: [[PARTIALLY_UNINIT:@[0-9]+]] = private unnamed_addr constant <{ [4 x i8], [12 x i8] }> <{ [4 x i8] c"\EF\BE\AD\DE", [12 x i8] undef }>, align 4 - -// This shouldn't contain undef, since it contains more chunks -// than the default value of uninit_const_chunk_threshold. -// CHECK: [[UNINIT_PADDING_HUGE:@[0-9]+]] = private unnamed_addr constant <{ [32768 x i8] }> <{ [32768 x i8] c"{{.+}}" }>, align 4 - -// CHECK: [[FULLY_UNINIT_HUGE:@[0-9]+]] = private unnamed_addr constant <{ [16384 x i8] }> undef - -// CHECK-LABEL: @fully_uninit -#[no_mangle] -pub const fn fully_uninit() -> MaybeUninit<[u8; 10]> { - const M: MaybeUninit<[u8; 10]> = MaybeUninit::uninit(); - // CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} align 1 %{{[0-9]+}}, {{i8\*|ptr}} align 1 {{.*}}[[FULLY_UNINIT]]{{.*}}, i{{(32|64)}} 10, i1 false) - M -} - -// CHECK-LABEL: @partially_uninit -#[no_mangle] -pub const fn partially_uninit() -> PartiallyUninit { - const X: PartiallyUninit = PartiallyUninit { x: 0xdeadbeef, y: MaybeUninit::uninit() }; - // CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} align 4 %{{[0-9]+}}, {{i8\*|ptr}} align 4 {{.*}}[[PARTIALLY_UNINIT]]{{.*}}, i{{(32|64)}} 16, i1 false) - X -} - -// CHECK-LABEL: @uninit_padding_huge -#[no_mangle] -pub const fn uninit_padding_huge() -> [(u32, u8); 4096] { - const X: [(u32, u8); 4096] = [(123, 45); 4096]; - // CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} align 4 %{{[0-9]+}}, {{i8\*|ptr}} align 4 {{.*}}[[UNINIT_PADDING_HUGE]]{{.*}}, i{{(32|64)}} 32768, i1 false) - X -} - -// CHECK-LABEL: @fully_uninit_huge -#[no_mangle] -pub const fn fully_uninit_huge() -> MaybeUninit<[u32; 4096]> { - const F: MaybeUninit<[u32; 4096]> = MaybeUninit::uninit(); - // CHECK: call void @llvm.memcpy.{{.+}}({{i8\*|ptr}} align 4 %{{[0-9]+}}, {{i8\*|ptr}} align 4 {{.*}}[[FULLY_UNINIT_HUGE]]{{.*}}, i{{(32|64)}} 16384, i1 false) - F -} diff --git a/src/test/codegen/union-abi.rs b/src/test/codegen/union-abi.rs deleted file mode 100644 index c18f2a49f..000000000 --- a/src/test/codegen/union-abi.rs +++ /dev/null @@ -1,76 +0,0 @@ -// ignore-emscripten vectors passed directly -// compile-flags: -O -C no-prepopulate-passes - -// This test that using union forward the abi of the inner type, as -// discussed in #54668 - -#![crate_type="lib"] -#![feature(repr_simd)] - -#[derive(Copy, Clone)] -pub enum Unhab {} - -#[repr(simd)] -#[derive(Copy, Clone)] -pub struct i64x4(i64, i64, i64, i64); - -#[derive(Copy, Clone)] -pub union UnionI64x4{ a:(), b: i64x4 } - -// CHECK: define void @test_UnionI64x4({{<4 x i64>\*|ptr}} {{.*}} %_1) -#[no_mangle] -pub fn test_UnionI64x4(_: UnionI64x4) { loop {} } - -pub union UnionI64x4_{ a: i64x4, b: (), c:i64x4, d: Unhab, e: ((),()), f: UnionI64x4 } - -// CHECK: define void @test_UnionI64x4_({{<4 x i64>\*|ptr}} {{.*}} %_1) -#[no_mangle] -pub fn test_UnionI64x4_(_: UnionI64x4_) { loop {} } - -pub union UnionI64x4I64{ a: i64x4, b: i64 } - -// CHECK: define void @test_UnionI64x4I64({{%UnionI64x4I64\*|ptr}} {{.*}} %_1) -#[no_mangle] -pub fn test_UnionI64x4I64(_: UnionI64x4I64) { loop {} } - -pub union UnionI64x4Tuple{ a: i64x4, b: (i64, i64, i64, i64) } - -// CHECK: define void @test_UnionI64x4Tuple({{%UnionI64x4Tuple\*|ptr}} {{.*}} %_1) -#[no_mangle] -pub fn test_UnionI64x4Tuple(_: UnionI64x4Tuple) { loop {} } - - -pub union UnionF32{a:f32} - -// CHECK: define float @test_UnionF32(float %_1) -#[no_mangle] -pub fn test_UnionF32(_: UnionF32) -> UnionF32 { loop {} } - -pub union UnionF32F32{a:f32, b:f32} - -// CHECK: define float @test_UnionF32F32(float %_1) -#[no_mangle] -pub fn test_UnionF32F32(_: UnionF32F32) -> UnionF32F32 { loop {} } - -pub union UnionF32U32{a:f32, b:u32} - -// CHECK: define i32 @test_UnionF32U32(i32{{( %0)?}}) -#[no_mangle] -pub fn test_UnionF32U32(_: UnionF32U32) -> UnionF32U32 { loop {} } - -pub union UnionU128{a:u128} -// CHECK: define i128 @test_UnionU128(i128 %_1) -#[no_mangle] -pub fn test_UnionU128(_: UnionU128) -> UnionU128 { loop {} } - -#[repr(C)] -pub union CUnionU128{a:u128} -// CHECK: define void @test_CUnionU128({{%CUnionU128\*|ptr}} {{.*}} %_1) -#[no_mangle] -pub fn test_CUnionU128(_: CUnionU128) { loop {} } - -pub union UnionBool { b:bool } -// CHECK: define noundef zeroext i1 @test_UnionBool(i8 %b) -#[no_mangle] -pub fn test_UnionBool(b: UnionBool) -> bool { unsafe { b.b } } -// CHECK: %0 = trunc i8 %b to i1 diff --git a/src/test/codegen/unpadded-simd.rs b/src/test/codegen/unpadded-simd.rs deleted file mode 100644 index eb44dbd93..000000000 --- a/src/test/codegen/unpadded-simd.rs +++ /dev/null @@ -1,14 +0,0 @@ -// Make sure that no 0-sized padding is inserted in structs and that -// structs are represented as expected by Neon intrinsics in LLVM. -// See #87254. - -#![crate_type = "lib"] -#![feature(repr_simd)] - -#[derive(Copy, Clone, Debug)] -#[repr(simd)] -pub struct int16x4_t(pub i16, pub i16, pub i16, pub i16); - -#[derive(Copy, Clone, Debug)] -pub struct int16x4x2_t(pub int16x4_t, pub int16x4_t); -// CHECK: %int16x4x2_t = type { <4 x i16>, <4 x i16> } diff --git a/src/test/codegen/unwind-abis/aapcs-unwind-abi.rs b/src/test/codegen/unwind-abis/aapcs-unwind-abi.rs deleted file mode 100644 index c092e28a0..000000000 --- a/src/test/codegen/unwind-abis/aapcs-unwind-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// needs-llvm-components: arm -// compile-flags: --target=armv7-unknown-linux-gnueabihf --crate-type=rlib -Cno-prepopulate-passes -#![no_core] -#![feature(no_core, lang_items, c_unwind)] -#[lang="sized"] -trait Sized { } - -// Test that `nounwind` attributes are correctly applied to exported `aapcs` and -// `aapcs-unwind` extern functions. `aapcs-unwind` functions MUST NOT have this attribute. We -// disable optimizations above to prevent LLVM from inferring the attribute. - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "aapcs" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "aapcs-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs b/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs deleted file mode 100644 index 8447bbeb1..000000000 --- a/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs +++ /dev/null @@ -1,27 +0,0 @@ -// compile-flags: -C panic=abort - -// Test that `nounwind` attributes are also applied to extern `C-unwind` Rust functions -// when the code is compiled with `panic=abort`. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_can_unwind() unnamed_addr [[ATTR0:#[0-9]+]] -#[no_mangle] -pub unsafe extern "C-unwind" fn rust_item_that_can_unwind() { - // CHECK: call void @_ZN4core9panicking15panic_no_unwind - may_unwind(); -} - -extern "C-unwind" { - // CHECK: @may_unwind() unnamed_addr [[ATTR1:#[0-9]+]] - fn may_unwind(); -} - -// Now, make sure that the LLVM attributes for this functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes [[ATTR0]] = { {{.*}}nounwind{{.*}} } -// -// Now, check that foreign item is correctly marked without the `nounwind` attribute. -// CHECK-NOT: attributes [[ATTR1]] = { {{.*}}nounwind{{.*}} } diff --git a/src/test/codegen/unwind-abis/c-unwind-abi.rs b/src/test/codegen/unwind-abis/c-unwind-abi.rs deleted file mode 100644 index e258dbcac..000000000 --- a/src/test/codegen/unwind-abis/c-unwind-abi.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C opt-level=0 - -// Test that `nounwind` attributes are correctly applied to exported `C` and `C-unwind` extern -// functions. `C-unwind` functions MUST NOT have this attribute. We disable optimizations above -// to prevent LLVM from inferring the attribute. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "C" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "C-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/cdecl-unwind-abi.rs b/src/test/codegen/unwind-abis/cdecl-unwind-abi.rs deleted file mode 100644 index 19a722883..000000000 --- a/src/test/codegen/unwind-abis/cdecl-unwind-abi.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C opt-level=0 - -// Test that `nounwind` attributes are correctly applied to exported `cdecl` and -// `cdecl-unwind` extern functions. `cdecl-unwind` functions MUST NOT have this attribute. We -// disable optimizations above to prevent LLVM from inferring the attribute. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "cdecl" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "cdecl-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/fastcall-unwind-abi.rs b/src/test/codegen/unwind-abis/fastcall-unwind-abi.rs deleted file mode 100644 index b74099a5d..000000000 --- a/src/test/codegen/unwind-abis/fastcall-unwind-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// needs-llvm-components: x86 -// compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes -#![no_core] -#![feature(no_core, lang_items, c_unwind)] -#[lang="sized"] -trait Sized { } - -// Test that `nounwind` attributes are correctly applied to exported `fastcall` and -// `fastcall-unwind` extern functions. `fastcall-unwind` functions MUST NOT have this attribute. We -// disable optimizations above to prevent LLVM from inferring the attribute. - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "fastcall" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "fastcall-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/nounwind-on-stable-panic-abort.rs b/src/test/codegen/unwind-abis/nounwind-on-stable-panic-abort.rs deleted file mode 100644 index 106d593b2..000000000 --- a/src/test/codegen/unwind-abis/nounwind-on-stable-panic-abort.rs +++ /dev/null @@ -1,16 +0,0 @@ -// compile-flags: -C opt-level=0 -Cpanic=abort -// ignore-wasm32-bare compiled with panic=abort by default - -#![crate_type = "lib"] - -// We disable optimizations to prevent LLVM from inferring the attribute. - -// CHECK: Function Attrs:{{.*}}nounwind -// CHECK-NEXT: @foo -#[no_mangle] -pub extern "C" fn foo() {} - -// CHECK: Function Attrs:{{.*}}nounwind -// CHECK-NEXT: @bar -#[no_mangle] -pub fn bar() {} diff --git a/src/test/codegen/unwind-abis/nounwind-on-stable-panic-unwind.rs b/src/test/codegen/unwind-abis/nounwind-on-stable-panic-unwind.rs deleted file mode 100644 index c1c5bbdda..000000000 --- a/src/test/codegen/unwind-abis/nounwind-on-stable-panic-unwind.rs +++ /dev/null @@ -1,17 +0,0 @@ -// compile-flags: -C opt-level=0 -// ignore-wasm32-bare compiled with panic=abort by default - -#![crate_type = "lib"] - -// We disable optimizations to prevent LLVM from inferring the attribute. - -extern "C" { - fn bar(); -} - -// CHECK-NOT: Function Attrs:{{.*}}nounwind -pub unsafe extern "C" fn foo() { - bar(); -} - -// Note that this test will get removed when `C-unwind` is fully stabilized diff --git a/src/test/codegen/unwind-abis/nounwind.rs b/src/test/codegen/unwind-abis/nounwind.rs deleted file mode 100644 index c46d71733..000000000 --- a/src/test/codegen/unwind-abis/nounwind.rs +++ /dev/null @@ -1,17 +0,0 @@ -// compile-flags: -C opt-level=0 -Cpanic=abort -// ignore-wasm32-bare compiled with panic=abort by default - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// We disable optimizations to prevent LLVM from inferring the attribute. - -// CHECK: Function Attrs:{{.*}}nounwind -// CHECK-NEXT: @foo -#[no_mangle] -pub extern "C" fn foo() {} - -// CHECK: Function Attrs:{{.*}}nounwind -// CHECK-NEXT: @bar -#[no_mangle] -pub fn bar() {} diff --git a/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs b/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs deleted file mode 100644 index 8eff0719f..000000000 --- a/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// needs-llvm-components: x86 -// compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes -#![no_core] -#![feature(no_core, lang_items, c_unwind)] -#[lang="sized"] -trait Sized { } - -// Test that `nounwind` attributes are correctly applied to exported `stdcall` and `stdcall-unwind` -// extern functions. `stdcall-unwind` functions MUST NOT have this attribute. We disable -// optimizations above to prevent LLVM from inferring the attribute. - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "stdcall" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "stdcall-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/system-unwind-abi.rs b/src/test/codegen/unwind-abis/system-unwind-abi.rs deleted file mode 100644 index 2591c1d48..000000000 --- a/src/test/codegen/unwind-abis/system-unwind-abi.rs +++ /dev/null @@ -1,29 +0,0 @@ -// compile-flags: -C opt-level=0 - -// Test that `nounwind` attributes are correctly applied to exported `system` and `system-unwind` -// extern functions. `system-unwind` functions MUST NOT have this attribute. We disable -// optimizations above to prevent LLVM from inferring the attribute. - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "system" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "system-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/sysv64-unwind-abi.rs b/src/test/codegen/unwind-abis/sysv64-unwind-abi.rs deleted file mode 100644 index 694fde17c..000000000 --- a/src/test/codegen/unwind-abis/sysv64-unwind-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// needs-llvm-components: x86 -// compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib -Cno-prepopulate-passes -#![no_core] -#![feature(no_core, lang_items, c_unwind)] -#[lang="sized"] -trait Sized { } - -// Test that `nounwind` attributes are correctly applied to exported `sysv64` and -// `sysv64-unwind` extern functions. `sysv64-unwind` functions MUST NOT have this attribute. We -// disable optimizations above to prevent LLVM from inferring the attribute. - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "sysv64" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "sysv64-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs b/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs deleted file mode 100644 index 7e81367fc..000000000 --- a/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// needs-llvm-components: x86 -// compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes -#![no_core] -#![feature(no_core, lang_items, c_unwind, abi_thiscall)] -#[lang="sized"] -trait Sized { } - -// Test that `nounwind` attributes are correctly applied to exported `thiscall` and -// `thiscall-unwind` extern functions. `thiscall-unwind` functions MUST NOT have this attribute. We -// disable optimizations above to prevent LLVM from inferring the attribute. - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "thiscall" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "thiscall-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/vectorcall-unwind-abi.rs b/src/test/codegen/unwind-abis/vectorcall-unwind-abi.rs deleted file mode 100644 index d7eca2a97..000000000 --- a/src/test/codegen/unwind-abis/vectorcall-unwind-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// needs-llvm-components: x86 -// compile-flags: --target=i686-pc-windows-msvc --crate-type=rlib -Cno-prepopulate-passes -#![no_core] -#![feature(no_core, lang_items, c_unwind, abi_vectorcall)] -#[lang="sized"] -trait Sized { } - -// Test that `nounwind` attributes are correctly applied to exported `vectorcall` and -// `vectorcall-unwind` extern functions. `vectorcall-unwind` functions MUST NOT have this attribute. -// We disable optimizations above to prevent LLVM from inferring the attribute. - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "vectorcall" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "vectorcall-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-abis/win64-unwind-abi.rs b/src/test/codegen/unwind-abis/win64-unwind-abi.rs deleted file mode 100644 index 6591348c3..000000000 --- a/src/test/codegen/unwind-abis/win64-unwind-abi.rs +++ /dev/null @@ -1,31 +0,0 @@ -// needs-llvm-components: x86 -// compile-flags: --target=x86_64-unknown-linux-gnu --crate-type=rlib -Cno-prepopulate-passes -#![no_core] -#![feature(no_core, lang_items, c_unwind)] -#[lang="sized"] -trait Sized { } - -// Test that `nounwind` attributes are correctly applied to exported `win64` and -// `win64-unwind` extern functions. `win64-unwind` functions MUST NOT have this attribute. We -// disable optimizations above to prevent LLVM from inferring the attribute. - -// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { -#[no_mangle] -pub extern "win64" fn rust_item_that_cannot_unwind() { -} - -// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { -#[no_mangle] -pub extern "win64-unwind" fn rust_item_that_can_unwind() { -} - -// Now, make some assertions that the LLVM attributes for these functions are correct. First, make -// sure that the first item is correctly marked with the `nounwind` attribute: -// -// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } -// -// Next, let's assert that the second item, which CAN unwind, does not have this attribute. -// -// CHECK: attributes #1 = { -// CHECK-NOT: nounwind -// CHECK: } diff --git a/src/test/codegen/unwind-and-panic-abort.rs b/src/test/codegen/unwind-and-panic-abort.rs deleted file mode 100644 index f238741e5..000000000 --- a/src/test/codegen/unwind-and-panic-abort.rs +++ /dev/null @@ -1,16 +0,0 @@ -// compile-flags: -C panic=abort - -#![crate_type = "lib"] -#![feature(c_unwind)] - -extern "C-unwind" { - fn bar(); -} - -// CHECK: Function Attrs:{{.*}}nounwind -// CHECK-NEXT: define{{.*}}void @foo -// CHECK: call void @_ZN4core9panicking15panic_no_unwind -#[no_mangle] -pub unsafe extern "C" fn foo() { - bar(); -} diff --git a/src/test/codegen/unwind-extern-exports.rs b/src/test/codegen/unwind-extern-exports.rs deleted file mode 100644 index 6ac3c079f..000000000 --- a/src/test/codegen/unwind-extern-exports.rs +++ /dev/null @@ -1,16 +0,0 @@ -// compile-flags: -C opt-level=0 -// ignore-wasm32-bare compiled with panic=abort by default - -#![crate_type = "lib"] -#![feature(c_unwind)] - -// Make sure these all do *not* get the attribute. -// We disable optimizations to prevent LLVM from inferring the attribute. -// CHECK-NOT: nounwind - -// "C" ABI -pub extern "C-unwind" fn foo_unwind() {} - -// "Rust" -// (`extern "Rust"` could be removed as all `fn` get it implicitly; we leave it in for clarity.) -pub fn bar() {} diff --git a/src/test/codegen/unwind-extern-imports.rs b/src/test/codegen/unwind-extern-imports.rs deleted file mode 100644 index e33e3e805..000000000 --- a/src/test/codegen/unwind-extern-imports.rs +++ /dev/null @@ -1,22 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -// ignore-wasm32-bare compiled with panic=abort by default - -#![crate_type = "lib"] -#![feature(c_unwind)] - -extern "C" { - // CHECK: Function Attrs:{{.*}}nounwind - // CHECK-NEXT: declare{{.*}}void @extern_fn - fn extern_fn(); -} - -extern "C-unwind" { - // CHECK-NOT: nounwind - // CHECK: declare{{.*}}void @c_unwind_extern_fn - fn c_unwind_extern_fn(); -} - -pub unsafe fn force_declare() { - extern_fn(); - c_unwind_extern_fn(); -} diff --git a/src/test/codegen/used_with_arg.rs b/src/test/codegen/used_with_arg.rs deleted file mode 100644 index 4515cb2ae..000000000 --- a/src/test/codegen/used_with_arg.rs +++ /dev/null @@ -1,10 +0,0 @@ -#![crate_type = "lib"] -#![feature(used_with_arg)] - -// CHECK: @llvm.used = appending global {{.*}}USED_LINKER -#[used(linker)] -static mut USED_LINKER: [usize; 1] = [0]; - -// CHECK-NEXT: @llvm.compiler.used = appending global {{.*}}USED_COMPILER -#[used(compiler)] -static mut USED_COMPILER: [usize; 1] = [0]; diff --git a/src/test/codegen/var-names.rs b/src/test/codegen/var-names.rs deleted file mode 100644 index 8f1b03870..000000000 --- a/src/test/codegen/var-names.rs +++ /dev/null @@ -1,15 +0,0 @@ -// compile-flags: -O -C no-prepopulate-passes - -#![crate_type = "lib"] - -// CHECK-LABEL: define{{.*}}i32 @test(i32 %a, i32 %b) -#[no_mangle] -pub fn test(a: u32, b: u32) -> u32 { - let c = a + b; - // CHECK: %c = add i32 %a, %b - let d = c; - let e = d * a; - // CHECK-NEXT: %e = mul i32 %c, %a - e - // CHECK-NEXT: ret i32 %e -} diff --git a/src/test/codegen/vec-calloc-llvm14.rs b/src/test/codegen/vec-calloc-llvm14.rs deleted file mode 100644 index 08302796c..000000000 --- a/src/test/codegen/vec-calloc-llvm14.rs +++ /dev/null @@ -1,144 +0,0 @@ -// compile-flags: -O -// only-x86_64 -// ignore-debug - -#![crate_type = "lib"] - -// CHECK-LABEL: @vec_zero_bytes -#[no_mangle] -pub fn vec_zero_bytes(n: usize) -> Vec<u8> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - // CHECK-NOT: call {{.*}}llvm.memset - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - // CHECK-NOT: call {{.*}}llvm.memset - - // CHECK: ret void - vec![0; n] -} - -// CHECK-LABEL: @vec_one_bytes -#[no_mangle] -pub fn vec_one_bytes(n: usize) -> Vec<u8> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: call {{.*}}__rust_alloc( - // CHECK: call {{.*}}llvm.memset - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: ret void - vec![1; n] -} - -// CHECK-LABEL: @vec_zero_scalar -#[no_mangle] -pub fn vec_zero_scalar(n: usize) -> Vec<i32> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![0; n] -} - -// CHECK-LABEL: @vec_one_scalar -#[no_mangle] -pub fn vec_one_scalar(n: usize) -> Vec<i32> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: call {{.*}}__rust_alloc( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: ret void - vec![1; n] -} - -// CHECK-LABEL: @vec_zero_rgb48 -#[no_mangle] -pub fn vec_zero_rgb48(n: usize) -> Vec<[u16; 3]> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![[0, 0, 0]; n] -} - -// CHECK-LABEL: @vec_zero_array_16 -#[no_mangle] -pub fn vec_zero_array_16(n: usize) -> Vec<[i64; 16]> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![[0_i64; 16]; n] -} - -// CHECK-LABEL: @vec_zero_tuple -#[no_mangle] -pub fn vec_zero_tuple(n: usize) -> Vec<(i16, u8, char)> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![(0, 0, '\0'); n] -} - -// CHECK-LABEL: @vec_non_zero_tuple -#[no_mangle] -pub fn vec_non_zero_tuple(n: usize) -> Vec<(i16, u8, char)> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: call {{.*}}__rust_alloc( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: ret void - vec![(0, 0, 'A'); n] -} diff --git a/src/test/codegen/vec-calloc.rs b/src/test/codegen/vec-calloc.rs deleted file mode 100644 index ae6e448f1..000000000 --- a/src/test/codegen/vec-calloc.rs +++ /dev/null @@ -1,167 +0,0 @@ -// compile-flags: -O -Z merge-functions=disabled -// only-x86_64 -// ignore-debug -// min-llvm-version: 15.0 - -#![crate_type = "lib"] - -// CHECK-LABEL: @vec_zero_bytes -#[no_mangle] -pub fn vec_zero_bytes(n: usize) -> Vec<u8> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - // CHECK-NOT: call {{.*}}llvm.memset - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - // CHECK-NOT: call {{.*}}llvm.memset - - // CHECK: ret void - vec![0; n] -} - -// CHECK-LABEL: @vec_one_bytes -#[no_mangle] -pub fn vec_one_bytes(n: usize) -> Vec<u8> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: call {{.*}}__rust_alloc( - // CHECK: call {{.*}}llvm.memset - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: ret void - vec![1; n] -} - -// CHECK-LABEL: @vec_zero_scalar -#[no_mangle] -pub fn vec_zero_scalar(n: usize) -> Vec<i32> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![0; n] -} - -// CHECK-LABEL: @vec_one_scalar -#[no_mangle] -pub fn vec_one_scalar(n: usize) -> Vec<i32> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: call {{.*}}__rust_alloc( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: ret void - vec![1; n] -} - -// CHECK-LABEL: @vec_zero_rgb48 -#[no_mangle] -pub fn vec_zero_rgb48(n: usize) -> Vec<[u16; 3]> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![[0, 0, 0]; n] -} - -// CHECK-LABEL: @vec_zero_array_16 -#[no_mangle] -pub fn vec_zero_array_16(n: usize) -> Vec<[i64; 16]> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![[0_i64; 16]; n] -} - -// CHECK-LABEL: @vec_zero_tuple -#[no_mangle] -pub fn vec_zero_tuple(n: usize) -> Vec<(i16, u8, char)> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![(0, 0, '\0'); n] -} - -// CHECK-LABEL: @vec_non_zero_tuple -#[no_mangle] -pub fn vec_non_zero_tuple(n: usize) -> Vec<(i16, u8, char)> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: call {{.*}}__rust_alloc( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc_zeroed( - - // CHECK: ret void - vec![(0, 0, 'A'); n] -} - -// CHECK-LABEL: @vec_option_bool -#[no_mangle] -pub fn vec_option_bool(n: usize) -> Vec<Option<bool>> { - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: call {{.*}}__rust_alloc_zeroed( - - // CHECK-NOT: call {{.*}}alloc::vec::from_elem - // CHECK-NOT: call {{.*}}reserve - // CHECK-NOT: call {{.*}}__rust_alloc( - - // CHECK: ret void - vec![Some(false); n] -} - -// Ensure that __rust_alloc_zeroed gets the right attributes for LLVM to optimize it away. -// CHECK: declare noalias ptr @__rust_alloc_zeroed(i64, i64 allocalign) unnamed_addr [[RUST_ALLOC_ZEROED_ATTRS:#[0-9]+]] - -// CHECK-DAG: attributes [[RUST_ALLOC_ZEROED_ATTRS]] = { {{.*}} allockind("alloc,zeroed,aligned") allocsize(0) uwtable "alloc-family"="__rust_alloc" {{.*}} } diff --git a/src/test/codegen/vec-in-place.rs b/src/test/codegen/vec-in-place.rs deleted file mode 100644 index 5df366905..000000000 --- a/src/test/codegen/vec-in-place.rs +++ /dev/null @@ -1,74 +0,0 @@ -// min-llvm-version: 14.0 -// ignore-debug: the debug assertions get in the way -// compile-flags: -O -Z merge-functions=disabled -#![crate_type = "lib"] - -// Ensure that trivial casts of vec elements are O(1) - -pub struct Wrapper<T>(T); - -#[repr(C)] -pub struct Foo { - a: u64, - b: u64, - c: u64, - d: u64, -} - -// Going from an aggregate struct to another type currently requires Copy to -// enable the TrustedRandomAccess specialization. Without it optimizations do not yet -// reliably recognize the loops as noop for repr(C) or non-Copy structs. -#[derive(Copy, Clone)] -pub struct Bar { - a: u64, - b: u64, - c: u64, - d: u64, -} - -// CHECK-LABEL: @vec_iterator_cast_primitive -#[no_mangle] -pub fn vec_iterator_cast_primitive(vec: Vec<i8>) -> Vec<u8> { - // CHECK-NOT: loop - // CHECK-NOT: call - vec.into_iter().map(|e| e as u8).collect() -} - -// CHECK-LABEL: @vec_iterator_cast_wrapper -#[no_mangle] -pub fn vec_iterator_cast_wrapper(vec: Vec<u8>) -> Vec<Wrapper<u8>> { - // CHECK-NOT: loop - // CHECK-NOT: call - vec.into_iter().map(|e| Wrapper(e)).collect() -} - -// CHECK-LABEL: @vec_iterator_cast_unwrap -#[no_mangle] -pub fn vec_iterator_cast_unwrap(vec: Vec<Wrapper<u8>>) -> Vec<u8> { - // CHECK-NOT: loop - // CHECK-NOT: call - vec.into_iter().map(|e| e.0).collect() -} - -// CHECK-LABEL: @vec_iterator_cast_aggregate -#[no_mangle] -pub fn vec_iterator_cast_aggregate(vec: Vec<[u64; 4]>) -> Vec<Foo> { - // FIXME These checks should be the same as other functions. - // CHECK-NOT: @__rust_alloc - // CHECK-NOT: @__rust_alloc - vec.into_iter().map(|e| unsafe { std::mem::transmute(e) }).collect() -} - -// CHECK-LABEL: @vec_iterator_cast_deaggregate -#[no_mangle] -pub fn vec_iterator_cast_deaggregate(vec: Vec<Bar>) -> Vec<[u64; 4]> { - // FIXME These checks should be the same as other functions. - // CHECK-NOT: @__rust_alloc - // CHECK-NOT: @__rust_alloc - - // Safety: For the purpose of this test we assume that Bar layout matches [u64; 4]. - // This currently is not guaranteed for repr(Rust) types, but it happens to work here and - // the UCG may add additional guarantees for homogenous types in the future that would make this - // correct. - vec.into_iter().map(|e| unsafe { std::mem::transmute(e) }).collect() -} diff --git a/src/test/codegen/vec-iter-collect-len.rs b/src/test/codegen/vec-iter-collect-len.rs deleted file mode 100644 index 73348ddd0..000000000 --- a/src/test/codegen/vec-iter-collect-len.rs +++ /dev/null @@ -1,12 +0,0 @@ -// ignore-debug: the debug assertions get in the way -// no-system-llvm -// compile-flags: -O -#![crate_type="lib"] - -#[no_mangle] -pub fn get_len() -> usize { - // CHECK-LABEL: @get_len - // CHECK-NOT: call - // CHECK-NOT: invoke - [1, 2, 3].iter().collect::<Vec<_>>().len() -} diff --git a/src/test/codegen/vec-optimizes-away.rs b/src/test/codegen/vec-optimizes-away.rs deleted file mode 100644 index 9143fad23..000000000 --- a/src/test/codegen/vec-optimizes-away.rs +++ /dev/null @@ -1,12 +0,0 @@ -// ignore-debug: the debug assertions get in the way -// no-system-llvm -// compile-flags: -O -#![crate_type="lib"] - -#[no_mangle] -pub fn sum_me() -> i32 { - // CHECK-LABEL: @sum_me - // CHECK-NEXT: {{^.*:$}} - // CHECK-NEXT: ret i32 6 - vec![1, 2, 3].iter().sum::<i32>() -} diff --git a/src/test/codegen/vec-shrink-panik.rs b/src/test/codegen/vec-shrink-panik.rs deleted file mode 100644 index 18409014b..000000000 --- a/src/test/codegen/vec-shrink-panik.rs +++ /dev/null @@ -1,47 +0,0 @@ -// compile-flags: -O -// ignore-debug: the debug assertions get in the way -#![crate_type = "lib"] -#![feature(shrink_to)] - -// Make sure that `Vec::shrink_to_fit` never emits panics via `RawVec::shrink_to_fit`, -// "Tried to shrink to a larger capacity", because the length is *always* <= capacity. - -// CHECK-LABEL: @shrink_to_fit -#[no_mangle] -pub fn shrink_to_fit(vec: &mut Vec<u32>) { - // CHECK-NOT: panic - vec.shrink_to_fit(); -} - -// CHECK-LABEL: @issue71861 -#[no_mangle] -pub fn issue71861(vec: Vec<u32>) -> Box<[u32]> { - // CHECK-NOT: panic - - // Call to panic_no_unwind in case of double-panic is expected, - // but other panics are not. - // CHECK: cleanup - // CHECK-NEXT: ; call core::panicking::panic_no_unwind - // CHECK-NEXT: panic_no_unwind - - // CHECK-NOT: panic - vec.into_boxed_slice() -} - -// CHECK-LABEL: @issue75636 -#[no_mangle] -pub fn issue75636<'a>(iter: &[&'a str]) -> Box<[&'a str]> { - // CHECK-NOT: panic - - // Call to panic_no_unwind in case of double-panic is expected, - // but other panics are not. - // CHECK: cleanup - // CHECK-NEXT: ; call core::panicking::panic_no_unwind - // CHECK-NEXT: panic_no_unwind - - // CHECK-NOT: panic - iter.iter().copied().collect() -} - -// CHECK: ; core::panicking::panic_no_unwind -// CHECK: declare void @{{.*}}panic_no_unwind diff --git a/src/test/codegen/vecdeque_no_panic.rs b/src/test/codegen/vecdeque_no_panic.rs deleted file mode 100644 index cbf420bad..000000000 --- a/src/test/codegen/vecdeque_no_panic.rs +++ /dev/null @@ -1,19 +0,0 @@ -// This test checks that `VecDeque::front[_mut]()` and `VecDeque::back[_mut]()` can't panic. - -// compile-flags: -O -// ignore-debug: the debug assertions get in the way - -#![crate_type = "lib"] - -use std::collections::VecDeque; - -// CHECK-LABEL: @dont_panic -#[no_mangle] -pub fn dont_panic(v: &mut VecDeque<usize>) { - // CHECK-NOT: expect - // CHECK-NOT: panic - v.front(); - v.front_mut(); - v.back(); - v.back_mut(); -} diff --git a/src/test/codegen/virtual-function-elimination-32bit.rs b/src/test/codegen/virtual-function-elimination-32bit.rs deleted file mode 100644 index 6f963363a..000000000 --- a/src/test/codegen/virtual-function-elimination-32bit.rs +++ /dev/null @@ -1,35 +0,0 @@ -// compile-flags: -Zvirtual-function-elimination -Clto -O -Csymbol-mangling-version=v0 -// ignore-64bit - -// CHECK: @vtable.0 = {{.*}}, !type ![[TYPE0:[0-9]+]], !vcall_visibility ![[VCALL_VIS0:[0-9]+]] - -#![crate_type = "lib"] - -trait T { - // CHECK-LABEL: ; <virtual_function_elimination_32bit::S as virtual_function_elimination_32bit::T>::used - fn used(&self) -> i32 { - 1 - } - // CHECK-LABEL-NOT: {{.*}}::unused - fn unused(&self) -> i32 { - 2 - } -} - -#[derive(Copy, Clone)] -struct S; - -impl T for S {} - -fn taking_t(t: &dyn T) -> i32 { - // CHECK: @llvm.type.checked.load({{.*}}, i32 12, metadata !"[[MANGLED_TYPE0:[0-9a-zA-Z_]+]]") - t.used() -} - -pub fn main() { - let s = S; - taking_t(&s); -} - -// CHECK: ![[TYPE0]] = !{i32 0, !"[[MANGLED_TYPE0]]"} -// CHECK: ![[VCALL_VIS0]] = !{i64 2} diff --git a/src/test/codegen/virtual-function-elimination.rs b/src/test/codegen/virtual-function-elimination.rs deleted file mode 100644 index 4cf7e12fe..000000000 --- a/src/test/codegen/virtual-function-elimination.rs +++ /dev/null @@ -1,100 +0,0 @@ -// compile-flags: -Zvirtual-function-elimination -Clto -O -Csymbol-mangling-version=v0 -// ignore-32bit - -// CHECK: @vtable.0 = {{.*}}, !type ![[TYPE0:[0-9]+]], !vcall_visibility ![[VCALL_VIS0:[0-9]+]] -// CHECK: @vtable.1 = {{.*}}, !type ![[TYPE1:[0-9]+]], !vcall_visibility ![[VCALL_VIS0:[0-9]+]] -// CHECK: @vtable.2 = {{.*}}, !type ![[TYPE2:[0-9]+]], !vcall_visibility ![[VCALL_VIS2:[0-9]+]] - -#![crate_type = "lib"] -#![allow(incomplete_features)] -#![feature(unsized_locals)] - -use std::rc::Rc; - -trait T { - // CHECK-LABEL: ; <virtual_function_elimination::S as virtual_function_elimination::T>::used - fn used(&self) -> i32 { - 1 - } - // CHECK-LABEL: ; <virtual_function_elimination::S as virtual_function_elimination::T>::used_through_sub_trait - fn used_through_sub_trait(&self) -> i32 { - 3 - } - // CHECK-LABEL: ; <virtual_function_elimination::S as virtual_function_elimination::T>::by_rc - fn by_rc(self: Rc<Self>) -> i32 { - self.used() + self.used() - } - // CHECK-LABEL-NOT: {{.*}}::unused - fn unused(&self) -> i32 { - 2 - } - // CHECK-LABEL-NOT: {{.*}}::by_rc_unused - fn by_rc_unused(self: Rc<Self>) -> i32 { - self.by_rc() - } -} - -trait U: T { - // CHECK-LABEL: ; <virtual_function_elimination::S as virtual_function_elimination::U>::subtrait_used - fn subtrait_used(&self) -> i32 { - 4 - } - // CHECK-LABEL-NOT: {{.*}}::subtrait_unused - fn subtrait_unused(&self) -> i32 { - 5 - } -} - -pub trait V { - // CHECK-LABEL: ; <virtual_function_elimination::S as virtual_function_elimination::V>::public_function - fn public_function(&self) -> i32; -} - -#[derive(Copy, Clone)] -struct S; - -impl T for S {} - -impl U for S {} - -impl V for S { - fn public_function(&self) -> i32 { - 6 - } -} - -fn taking_t(t: &dyn T) -> i32 { - // CHECK: @llvm.type.checked.load({{.*}}, i32 24, metadata !"[[MANGLED_TYPE0:[0-9a-zA-Z_]+]]") - t.used() -} - -fn taking_rc_t(t: Rc<dyn T>) -> i32 { - // CHECK: @llvm.type.checked.load({{.*}}, i32 40, metadata !"[[MANGLED_TYPE0:[0-9a-zA-Z_]+]]") - t.by_rc() -} - -fn taking_u(u: &dyn U) -> i32 { - // CHECK: @llvm.type.checked.load({{.*}}, i32 64, metadata !"[[MANGLED_TYPE1:[0-9a-zA-Z_]+]]") - // CHECK: @llvm.type.checked.load({{.*}}, i32 24, metadata !"[[MANGLED_TYPE1:[0-9a-zA-Z_]+]]") - // CHECK: @llvm.type.checked.load({{.*}}, i32 32, metadata !"[[MANGLED_TYPE1:[0-9a-zA-Z_]+]]") - u.subtrait_used() + u.used() + u.used_through_sub_trait() -} - -pub fn taking_v(v: &dyn V) -> i32 { - // CHECK: @llvm.type.checked.load({{.*}}, i32 24, metadata !"NtCsfRpWlKdQPZn_28virtual_function_elimination1V") - v.public_function() -} - -pub fn main() { - let s = S; - taking_t(&s); - taking_rc_t(Rc::new(s)); - taking_u(&s); - taking_v(&s); -} - -// CHECK: ![[TYPE0]] = !{i64 0, !"[[MANGLED_TYPE0]]"} -// CHECK: ![[VCALL_VIS0]] = !{i64 2} -// CHECK: ![[TYPE1]] = !{i64 0, !"[[MANGLED_TYPE1]]"} -// CHECK: ![[TYPE2]] = !{i64 0, !"NtCsfRpWlKdQPZn_28virtual_function_elimination1V"} -// CHECK: ![[VCALL_VIS2]] = !{i64 1} diff --git a/src/test/codegen/wasm_casts_trapping.rs b/src/test/codegen/wasm_casts_trapping.rs deleted file mode 100644 index eb06c4975..000000000 --- a/src/test/codegen/wasm_casts_trapping.rs +++ /dev/null @@ -1,157 +0,0 @@ -// only-wasm32 -// compile-flags: -C target-feature=-nontrapping-fptoint -#![crate_type = "lib"] - -// CHECK-LABEL: @cast_f64_i64 -#[no_mangle] -pub fn cast_f64_i64(a: f64) -> i64 { - // CHECK-NOT: fptosi double {{.*}} to i64 - // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f64{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f64_i32 -#[no_mangle] -pub fn cast_f64_i32(a: f64) -> i32 { - // CHECK-NOT: fptosi double {{.*}} to i32 - // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f64{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f32_i64 -#[no_mangle] -pub fn cast_f32_i64(a: f32) -> i64 { - // CHECK-NOT: fptosi float {{.*}} to i64 - // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i64.f32{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f32_i32 -#[no_mangle] -pub fn cast_f32_i32(a: f32) -> i32 { - // CHECK-NOT: fptosi float {{.*}} to i32 - // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptosi.sat.i32.f32{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f64_u64 -#[no_mangle] -pub fn cast_f64_u64(a: f64) -> u64 { - // CHECK-NOT: fptoui double {{.*}} to i64 - // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f64{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f64_u32 -#[no_mangle] -pub fn cast_f64_u32(a: f64) -> u32 { - // CHECK-NOT: fptoui double {{.*}} to i32 - // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f64{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f32_u64 -#[no_mangle] -pub fn cast_f32_u64(a: f32) -> u64 { - // CHECK-NOT: fptoui float {{.*}} to i64 - // CHECK-NOT: select i1 {{.*}}, i64 {{.*}}, i64 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i64.f32{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f32_u32 -#[no_mangle] -pub fn cast_f32_u32(a: f32) -> u32 { - // CHECK-NOT: fptoui float {{.*}} to i32 - // CHECK-NOT: select i1 {{.*}}, i32 {{.*}}, i32 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i32.f32{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_f32_u8 -#[no_mangle] -pub fn cast_f32_u8(a: f32) -> u8 { - // CHECK-NOT: fptoui float {{.*}} to i8 - // CHECK-NOT: select i1 {{.*}}, i8 {{.*}}, i8 {{.*}} - // CHECK: {{.*}} call {{.*}} @llvm.fptoui.sat.i8.f32{{.*}} - a as _ -} - -// CHECK-LABEL: @cast_unchecked_f64_i64 -#[no_mangle] -pub unsafe fn cast_unchecked_f64_i64(a: f64) -> i64 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}} - // CHECK-NEXT: ret i64 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f64_i32 -#[no_mangle] -pub unsafe fn cast_unchecked_f64_i32(a: f64) -> i32 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}} - // CHECK-NEXT: ret i32 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f32_i64 -#[no_mangle] -pub unsafe fn cast_unchecked_f32_i64(a: f32) -> i64 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}} - // CHECK-NEXT: ret i64 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f32_i32 -#[no_mangle] -pub unsafe fn cast_unchecked_f32_i32(a: f32) -> i32 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.signed.{{.*}} - // CHECK-NEXT: ret i32 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f64_u64 -#[no_mangle] -pub unsafe fn cast_unchecked_f64_u64(a: f64) -> u64 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}} - // CHECK-NEXT: ret i64 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f64_u32 -#[no_mangle] -pub unsafe fn cast_unchecked_f64_u32(a: f64) -> u32 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}} - // CHECK-NEXT: ret i32 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f32_u64 -#[no_mangle] -pub unsafe fn cast_unchecked_f32_u64(a: f32) -> u64 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}} - // CHECK-NEXT: ret i64 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f32_u32 -#[no_mangle] -pub unsafe fn cast_unchecked_f32_u32(a: f32) -> u32 { - // CHECK: {{.*}} call {{.*}} @llvm.wasm.trunc.unsigned.{{.*}} - // CHECK-NEXT: ret i32 {{.*}} - a.to_int_unchecked() -} - -// CHECK-LABEL: @cast_unchecked_f32_u8 -#[no_mangle] -pub unsafe fn cast_unchecked_f32_u8(a: f32) -> u8 { - // CHECK-NOT: {{.*}} call {{.*}} @llvm.wasm.trunc.{{.*}} - // CHECK: fptoui float {{.*}} to i8 - // CHECK-NEXT: ret i8 {{.*}} - a.to_int_unchecked() -} diff --git a/src/test/codegen/x86_64-macosx-deployment-target.rs b/src/test/codegen/x86_64-macosx-deployment-target.rs deleted file mode 100644 index 8e673d11d..000000000 --- a/src/test/codegen/x86_64-macosx-deployment-target.rs +++ /dev/null @@ -1,27 +0,0 @@ -// -// Checks that we correctly modify the target when MACOSX_DEPLOYMENT_TARGET is set. -// See issue #60235. - -// compile-flags: -O --target=x86_64-apple-darwin --crate-type=rlib -// needs-llvm-components: x86 -// rustc-env:MACOSX_DEPLOYMENT_TARGET=10.9 -#![feature(no_core, lang_items)] -#![no_core] - -#[lang="sized"] -trait Sized { } -#[lang="freeze"] -trait Freeze { } -#[lang="copy"] -trait Copy { } - -#[repr(C)] -pub struct Bool { - b: bool, -} - -// CHECK: target triple = "x86_64-apple-macosx10.9.0" -#[no_mangle] -pub extern "C" fn structbool() -> Bool { - Bool { b: true } -} diff --git a/src/test/codegen/x86_64-no-macosx-deployment-target.rs b/src/test/codegen/x86_64-no-macosx-deployment-target.rs deleted file mode 100644 index 25ae6924d..000000000 --- a/src/test/codegen/x86_64-no-macosx-deployment-target.rs +++ /dev/null @@ -1,27 +0,0 @@ -// -// Checks that we leave the target alone when MACOSX_DEPLOYMENT_TARGET is unset. -// See issue #60235. - -// compile-flags: -O --target=x86_64-apple-darwin --crate-type=rlib -// needs-llvm-components: x86 -// unset-rustc-env:MACOSX_DEPLOYMENT_TARGET -#![feature(no_core, lang_items)] -#![no_core] - -#[lang="sized"] -trait Sized { } -#[lang="freeze"] -trait Freeze { } -#[lang="copy"] -trait Copy { } - -#[repr(C)] -pub struct Bool { - b: bool, -} - -// CHECK: target triple = "x86_64-apple-macosx10.7.0" -#[no_mangle] -pub extern "C" fn structbool() -> Bool { - Bool { b: true } -} diff --git a/src/test/codegen/zip.rs b/src/test/codegen/zip.rs deleted file mode 100644 index e55f4f1a2..000000000 --- a/src/test/codegen/zip.rs +++ /dev/null @@ -1,21 +0,0 @@ -// compile-flags: -C no-prepopulate-passes -O - -#![crate_type = "lib"] - -// CHECK-LABEL: @zip_copy -#[no_mangle] -pub fn zip_copy(xs: &[u8], ys: &mut [u8]) { -// CHECK: memcpy - for (x, y) in xs.iter().zip(ys) { - *y = *x; - } -} - -// CHECK-LABEL: @zip_copy_mapped -#[no_mangle] -pub fn zip_copy_mapped(xs: &[u8], ys: &mut [u8]) { -// CHECK: memcpy - for (x, y) in xs.iter().map(|&x| x).zip(ys) { - *y = x; - } -} diff --git a/src/test/codegen/zst-offset.rs b/src/test/codegen/zst-offset.rs deleted file mode 100644 index 29d2a1754..000000000 --- a/src/test/codegen/zst-offset.rs +++ /dev/null @@ -1,40 +0,0 @@ -// compile-flags: -C no-prepopulate-passes - -#![crate_type = "lib"] -#![feature(repr_simd)] - -// Hack to get the correct size for the length part in slices -// CHECK: @helper([[USIZE:i[0-9]+]] %_1) -#[no_mangle] -pub fn helper(_: usize) { -} - -// Check that we correctly generate a GEP for a ZST that is not included in Scalar layout -// CHECK-LABEL: @scalar_layout -#[no_mangle] -pub fn scalar_layout(s: &(u64, ())) { -// CHECK: getelementptr i8, {{.+}}, [[USIZE]] 8 - let x = &s.1; - &x; // keep variable in an alloca -} - -// Check that we correctly generate a GEP for a ZST that is not included in ScalarPair layout -// CHECK-LABEL: @scalarpair_layout -#[no_mangle] -pub fn scalarpair_layout(s: &(u64, u32, ())) { -// CHECK: getelementptr i8, {{.+}}, [[USIZE]] 12 - let x = &s.2; - &x; // keep variable in an alloca -} - -#[repr(simd)] -pub struct U64x4(u64, u64, u64, u64); - -// Check that we correctly generate a GEP for a ZST that is not included in Vector layout -// CHECK-LABEL: @vector_layout -#[no_mangle] -pub fn vector_layout(s: &(U64x4, ())) { -// CHECK: getelementptr i8, {{.+}}, [[USIZE]] 32 - let x = &s.1; - &x; // keep variable in an alloca -} |