//@ 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) { 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) { 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}