mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-29 20:15:27 +00:00 
			
		
		
		
	 f6a57c1955
			
		
	
	
		f6a57c1955
		
	
	
	
	
		
			
			This approach depends on CSE to not have any branches or selects when the guessed offset is correct -- which it always will be right now -- but to also be *sound* (just less efficient) if the layout algorithms change such that the guess is incorrect.
		
			
				
	
	
		
			37 lines
		
	
	
		
			830 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			37 lines
		
	
	
		
			830 B
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // compile-flags: -O -Z randomize-layout=no
 | |
| // only-x86_64
 | |
| 
 | |
| #![crate_type = "lib"]
 | |
| #![feature(option_as_slice)]
 | |
| 
 | |
| extern crate core;
 | |
| 
 | |
| use core::num::NonZeroU64;
 | |
| use core::option::Option;
 | |
| 
 | |
| // CHECK-LABEL: @u64_opt_as_slice
 | |
| #[no_mangle]
 | |
| pub fn u64_opt_as_slice(o: &Option<u64>) -> &[u64] {
 | |
|     // CHECK-NOT: select
 | |
|     // CHECK-NOT: br
 | |
|     // CHECK-NOT: switch
 | |
|     // CHECK-NOT: icmp
 | |
|     o.as_slice()
 | |
| }
 | |
| 
 | |
| // CHECK-LABEL: @nonzero_u64_opt_as_slice
 | |
| #[no_mangle]
 | |
| pub fn nonzero_u64_opt_as_slice(o: &Option<NonZeroU64>) -> &[NonZeroU64] {
 | |
|     // CHECK-NOT: select
 | |
|     // CHECK-NOT: br
 | |
|     // CHECK-NOT: switch
 | |
|     // CHECK-NOT: icmp
 | |
|     // CHECK: %[[NZ:.+]] = icmp ne i64 %{{.+}}, 0
 | |
|     // CHECK-NEXT: zext i1 %[[NZ]] to i64
 | |
|     // CHECK-NOT: select
 | |
|     // CHECK-NOT: br
 | |
|     // CHECK-NOT: switch
 | |
|     // CHECK-NOT: icmp
 | |
|     o.as_slice()
 | |
| }
 |