mirror of
				https://github.com/rust-lang/rust.git
				synced 2025-10-31 13:04:42 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
			
		
		
	
	
			88 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Rust
		
	
	
	
	
	
| //@ compile-flags: -O
 | |
| #![crate_type = "lib"]
 | |
| #![feature(core_intrinsics)]
 | |
| 
 | |
| use std::intrinsics::cold_path;
 | |
| 
 | |
| #[inline(never)]
 | |
| #[no_mangle]
 | |
| pub fn path_a() {
 | |
|     println!("path a");
 | |
| }
 | |
| 
 | |
| #[inline(never)]
 | |
| #[no_mangle]
 | |
| pub fn path_b() {
 | |
|     println!("path b");
 | |
| }
 | |
| 
 | |
| #[inline(never)]
 | |
| #[no_mangle]
 | |
| pub fn path_c() {
 | |
|     println!("path c");
 | |
| }
 | |
| 
 | |
| #[inline(never)]
 | |
| #[no_mangle]
 | |
| pub fn path_d() {
 | |
|     println!("path d");
 | |
| }
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test(x: Option<u32>) {
 | |
|     match x {
 | |
|         Some(0) => path_a(),
 | |
|         Some(1) => {
 | |
|             cold_path();
 | |
|             path_b()
 | |
|         }
 | |
|         Some(2) => path_c(),
 | |
|         Some(3) => {
 | |
|             cold_path();
 | |
|             path_d()
 | |
|         }
 | |
|         _ => path_a(),
 | |
|     }
 | |
| 
 | |
|     // CHECK-LABEL: @test(
 | |
|     // CHECK: switch i32 %1, label %bb1 [
 | |
|     // CHECK: i32 0, label %bb6
 | |
|     // CHECK: i32 1, label %bb5
 | |
|     // CHECK: i32 2, label %bb4
 | |
|     // CHECK: i32 3, label %bb3
 | |
|     // CHECK: ], !prof ![[NUM1:[0-9]+]]
 | |
| }
 | |
| 
 | |
| #[no_mangle]
 | |
| pub fn test2(x: Option<u32>) {
 | |
|     match x {
 | |
|         Some(10) => path_a(),
 | |
|         Some(11) => {
 | |
|             cold_path();
 | |
|             path_b()
 | |
|         }
 | |
|         Some(12) => {
 | |
|             unsafe { core::intrinsics::unreachable() };
 | |
|             path_c()
 | |
|         }
 | |
|         Some(13) => {
 | |
|             cold_path();
 | |
|             path_d()
 | |
|         }
 | |
|         _ => {
 | |
|             cold_path();
 | |
|             path_a()
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     // CHECK-LABEL: @test2(
 | |
|     // CHECK: switch i32 %1, label %bb1 [
 | |
|     // CHECK: i32 10, label %bb5
 | |
|     // CHECK: i32 11, label %bb4
 | |
|     // CHECK: i32 13, label %bb3
 | |
|     // CHECK: ], !prof ![[NUM2:[0-9]+]]
 | |
| }
 | |
| 
 | |
| // CHECK: ![[NUM1]] = !{!"branch_weights", i32 2000, i32 2000, i32 1, i32 2000, i32 1}
 | |
| // CHECK: ![[NUM2]] = !{!"branch_weights", i32 1, i32 2000, i32 1, i32 1}
 | 
