mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-11-04 06:56:14 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			39 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			39 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
// 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()
 | 
						|
}
 |