mirror of https://github.com/rust-lang/rust.git
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}
|