mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	 dfc3377954
			
		
	
	
		dfc3377954
		
	
	
	
	
		
			
			Apparently in CI it's getting generated in the opposite order, one function per file will make the test pass either way.
		
			
				
	
	
		
			34 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			34 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| // 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 direct calls we want, from `ptr::replace`.
 | |
| 
 | |
| // CHECK-NOT: call void @llvm.memcpy
 | |
| 
 | |
| // For a small type, we expect one each of `load`/`store`/`memcpy` instead
 | |
| // CHECK-LABEL: define internal noundef i8 @{{.+}}mem{{.+}}replace
 | |
|     // CHECK-NOT: alloca
 | |
|     // CHECK: alloca i8
 | |
|     // CHECK-NOT: alloca
 | |
|     // CHECK-NOT: call void @llvm.memcpy
 | |
|     // CHECK: load i8
 | |
|     // CHECK-NOT: call void @llvm.memcpy
 | |
|     // CHECK: store i8
 | |
|     // 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-NOT: call void @llvm.memcpy
 |