mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			72 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ compile-flags: -Copt-level=3 -Zmerge-functions=disabled
 | |
| 
 | |
| #![feature(core_intrinsics)]
 | |
| #![crate_type = "lib"]
 | |
| 
 | |
| /* Test the intrinsic */
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test_int(p: bool, a: u64, b: u64) -> u64 {
 | |
|     // CHECK-LABEL: define{{.*}} @test_int
 | |
|     // CHECK: select i1 %p, i64 %a, i64 %b, !unpredictable
 | |
|     core::intrinsics::select_unpredictable(p, a, b)
 | |
| }
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test_pair(p: bool, a: (u64, u64), b: (u64, u64)) -> (u64, u64) {
 | |
|     // CHECK-LABEL: define{{.*}} @test_pair
 | |
|     // CHECK: select i1 %p, {{.*}}, !unpredictable
 | |
|     core::intrinsics::select_unpredictable(p, a, b)
 | |
| }
 | |
| 
 | |
| struct Large {
 | |
|     e: [u64; 100],
 | |
| }
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test_struct(p: bool, a: Large, b: Large) -> Large {
 | |
|     // CHECK-LABEL: define{{.*}} @test_struct
 | |
|     // CHECK: select i1 %p, {{.*}}, !unpredictable
 | |
|     core::intrinsics::select_unpredictable(p, a, b)
 | |
| }
 | |
| 
 | |
| // ZSTs should not need a `select` expression.
 | |
| #[no_mangle]
 | |
| pub fn test_zst(p: bool, a: (), b: ()) -> () {
 | |
|     // CHECK-LABEL: define{{.*}} @test_zst
 | |
|     // CHECK-NEXT: start:
 | |
|     // CHECK-NEXT: ret void
 | |
|     core::intrinsics::select_unpredictable(p, a, b)
 | |
| }
 | |
| 
 | |
| /* Test the user-facing version */
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test_int2(p: bool, a: u64, b: u64) -> u64 {
 | |
|     // CHECK-LABEL: define{{.*}} @test_int2
 | |
|     // CHECK: select i1 %p, i64 %a, i64 %b, !unpredictable
 | |
|     core::hint::select_unpredictable(p, a, b)
 | |
| }
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test_pair2(p: bool, a: (u64, u64), b: (u64, u64)) -> (u64, u64) {
 | |
|     // CHECK-LABEL: define{{.*}} @test_pair2
 | |
|     // CHECK: select i1 %p, {{.*}}, !unpredictable
 | |
|     core::hint::select_unpredictable(p, a, b)
 | |
| }
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test_struct2(p: bool, a: Large, b: Large) -> Large {
 | |
|     // CHECK-LABEL: define{{.*}} @test_struct2
 | |
|     // CHECK: select i1 %p, {{.*}}, !unpredictable
 | |
|     core::hint::select_unpredictable(p, a, b)
 | |
| }
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test_zst2(p: bool, a: (), b: ()) -> () {
 | |
|     // CHECK-LABEL: define{{.*}} @test_zst2
 | |
|     // CHECK-NEXT: start:
 | |
|     // CHECK-NEXT: ret void
 | |
|     core::hint::select_unpredictable(p, a, b)
 | |
| }
 | 
