https://gcc.gnu.org/g:4b35be3f34849bc6c58d030154b898dd0e5fcec1
commit r17-4311-g4b35be3f34849bc6c58d030154b898dd0e5fcec1 Author: Yap Zhi Heng <[email protected]> Date: Sat Aug 29 23:47:06 2026 +0800 gccrs: Update llvm_builtins test cases gcc/testsuite/ChangeLog: * rust/compile/llvm_builtins.rs: Removed 64-bit functions, ensure main calls all llvm built-ins, add dg-final directives to check the generated tree dump, ensure the test only gets compiled on x86 targets. * rust/compile/llvm_builtins_64_bit.rs: New test derived from llvm_builtins.rs, but for 64-bit functions. Signed-off-by: Yap Zhi Heng <[email protected]> Diff: --- gcc/testsuite/rust/compile/llvm_builtins.rs | 38 ++++++++++++-------- gcc/testsuite/rust/compile/llvm_builtins_64_bit.rs | 42 ++++++++++++++++++++++ 2 files changed, 66 insertions(+), 14 deletions(-) diff --git a/gcc/testsuite/rust/compile/llvm_builtins.rs b/gcc/testsuite/rust/compile/llvm_builtins.rs index 7f44eb02fa9d..066c9d1a7181 100644 --- a/gcc/testsuite/rust/compile/llvm_builtins.rs +++ b/gcc/testsuite/rust/compile/llvm_builtins.rs @@ -1,4 +1,5 @@ -// { dg-options "-mrdrnd" } +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && ia32 } } } +// { dg-options "-mrdrnd -mrdseed -fdump-tree-gimple" } #![feature(no_core, abi_unadjusted)] #![no_core] @@ -8,14 +9,10 @@ extern "unadjusted" { fn x86_rdrand16_step() -> (u16, i32); #[link_name = "llvm.x86.rdrand.32"] fn x86_rdrand32_step() -> (u32, i32); - #[link_name = "llvm.x86.rdrand.64"] - fn x86_rdrand64_step() -> (u64, i32); #[link_name = "llvm.x86.rdseed.16"] fn x86_rdseed16_step() -> (u16, i32); #[link_name = "llvm.x86.rdseed.32"] fn x86_rdseed32_step() -> (u32, i32); - #[link_name = "llvm.x86.rdseed.64"] - fn x86_rdseed64_step() -> (u64, i32); #[link_name = "llvm.x86.addcarry.32"] fn llvm_addcarry_u32(a: u8, b: u32, c: u32) -> (u8, u32); @@ -23,12 +20,6 @@ extern "unadjusted" { fn llvm_addcarryx_u32(a: u8, b: u32, c: u32, d: *mut u8) -> u8; #[link_name = "llvm.x86.subborrow.32"] fn llvm_subborrow_u32(a: u8, b: u32, c: u32) -> (u8, u32); - #[link_name = "llvm.x86.addcarry.64"] - fn llvm_addcarry_u64(a: u8, b: u64, c: u64) -> (u8, u64); - #[link_name = "llvm.x86.addcarryx.u64"] - fn llvm_addcarryx_u64(a: u8, b: u64, c: u64, d: *mut u8) -> u8; - #[link_name = "llvm.x86.subborrow.64"] - fn llvm_subborrow_u64(a: u8, b: u64, c: u64) -> (u8, u64); // TODO implement the SIMD types (i16x8, f32x4, f32x8) before // enabling these tests @@ -43,10 +34,29 @@ extern "unadjusted" { } fn main() { - let (_status2, _v1) = unsafe { + let (_v1, _s1) = unsafe { + x86_rdrand16_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdrand16_step} 1 gimple } } + }; + let (_v2, _s2) = unsafe { + x86_rdrand32_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdrand32_step} 1 gimple } } + }; + let (_v3, _s3) = unsafe { + x86_rdseed16_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdseed_hi_step} 1 gimple } } + }; + let (_v4, _s4) = unsafe { + x86_rdseed32_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdseed_si_step} 1 gimple } } + }; + + // { dg-final { scan-tree-dump-times {__builtin_ia32_addcarryx_u32} 2 gimple } } + let (_v5, _s5) = unsafe { llvm_addcarry_u32(0, 1, 2) }; - let (_v2, _status2) = unsafe { - x86_rdrand16_step() + let _s6 = unsafe { + let _temp_ptr: *mut u8; + llvm_addcarryx_u32(0, 1, 2, _temp_ptr) + }; + + let (_v7, _s7) = unsafe { + llvm_subborrow_u32(0, 1, 2) // { dg-final { scan-tree-dump-times {__builtin_ia32_sbb_u32} 1 gimple } } }; } diff --git a/gcc/testsuite/rust/compile/llvm_builtins_64_bit.rs b/gcc/testsuite/rust/compile/llvm_builtins_64_bit.rs new file mode 100644 index 000000000000..c3ba93b069c1 --- /dev/null +++ b/gcc/testsuite/rust/compile/llvm_builtins_64_bit.rs @@ -0,0 +1,42 @@ +// { dg-do compile { target { { i?86-*-* x86_64-*-* } && { ! ia32 } } } } +// { dg-options "-mrdrnd -m64 -mrdseed -fdump-tree-gimple" } +#![feature(no_core, abi_unadjusted)] +#![no_core] + +#[allow(improper_ctypes)] +extern "unadjusted" { + #[link_name = "llvm.x86.rdrand.64"] + fn x86_rdrand64_step() -> (u64, i32); + #[link_name = "llvm.x86.rdseed.64"] + fn x86_rdseed64_step() -> (u64, i32); + + #[link_name = "llvm.x86.addcarry.64"] + fn llvm_addcarry_u64(a: u8, b: u64, c: u64) -> (u8, u64); + #[link_name = "llvm.x86.addcarryx.u64"] + fn llvm_addcarryx_u64(a: u8, b: u64, c: u64, d: *mut u8) -> u8; + #[link_name = "llvm.x86.subborrow.64"] + fn llvm_subborrow_u64(a: u8, b: u64, c: u64) -> (u8, u64); +} + +fn main() { + let (_v1, _s1) = unsafe { + x86_rdrand64_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdrand64_step} 1 gimple } } + }; + let (_v2, _s2) = unsafe { + x86_rdseed64_step() // { dg-final { scan-tree-dump-times {__builtin_ia32_rdseed_di_step} 1 gimple } } + }; + + // { dg-final { scan-tree-dump-times {__builtin_ia32_addcarryx_u64} 2 gimple } } + let (_s3, _v3) = unsafe { + llvm_addcarry_u64(0, 1, 2) + }; + let _s4 = unsafe { + let _temp_ptr: *mut u8; + llvm_addcarryx_u64(0, 1, 2, _temp_ptr) + }; + + // { dg-final { scan-tree-dump-times {__builtin_ia32_sbb_u64} 1 gimple } } + let (_s5, _v5) = unsafe { + llvm_subborrow_u64(0, 1, 2) + }; +}
