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