Export likely(), unlikely() and cold_path() in std::hint
This commit is contained in:
parent
733616f723
commit
c656f879c9
6 changed files with 359 additions and 4 deletions
54
tests/codegen/hint/cold_path.rs
Normal file
54
tests/codegen/hint/cold_path.rs
Normal file
|
@ -0,0 +1,54 @@
|
|||
//@ compile-flags: -O
|
||||
#![crate_type = "lib"]
|
||||
#![feature(cold_path)]
|
||||
|
||||
use std::hint::cold_path;
|
||||
|
||||
#[inline(never)]
|
||||
#[no_mangle]
|
||||
pub fn path_a() {
|
||||
println!("path a");
|
||||
}
|
||||
|
||||
#[inline(never)]
|
||||
#[no_mangle]
|
||||
pub fn path_b() {
|
||||
println!("path b");
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test1(x: bool) {
|
||||
if x {
|
||||
path_a();
|
||||
} else {
|
||||
cold_path();
|
||||
path_b();
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test1(
|
||||
// CHECK: br i1 %x, label %bb1, label %bb2, !prof ![[NUM:[0-9]+]]
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb1:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test2(x: i32) {
|
||||
match x > 0 {
|
||||
true => path_a(),
|
||||
false => {
|
||||
cold_path();
|
||||
path_b()
|
||||
}
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test2(
|
||||
// CHECK: br i1 %_2, label %bb2, label %bb1, !prof ![[NUM]]
|
||||
// CHECK: bb1:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
// CHECK: ![[NUM]] = !{!"branch_weights", {{(!"expected", )?}}i32 2000, i32 1}
|
81
tests/codegen/hint/likely.rs
Normal file
81
tests/codegen/hint/likely.rs
Normal file
|
@ -0,0 +1,81 @@
|
|||
//@ compile-flags: -O
|
||||
#![crate_type = "lib"]
|
||||
#![feature(likely_unlikely)]
|
||||
|
||||
use std::hint::likely;
|
||||
|
||||
#[inline(never)]
|
||||
#[no_mangle]
|
||||
pub fn path_a() {
|
||||
println!("path a");
|
||||
}
|
||||
|
||||
#[inline(never)]
|
||||
#[no_mangle]
|
||||
pub fn path_b() {
|
||||
println!("path b");
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test1(x: bool) {
|
||||
if likely(x) {
|
||||
path_a();
|
||||
} else {
|
||||
path_b();
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test1(
|
||||
// CHECK: br i1 %x, label %bb2, label %bb3, !prof ![[NUM:[0-9]+]]
|
||||
// CHECK: bb3:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test2(x: i32) {
|
||||
match likely(x > 0) {
|
||||
true => path_a(),
|
||||
false => path_b(),
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test2(
|
||||
// CHECK: br i1 %_2, label %bb2, label %bb3, !prof ![[NUM]]
|
||||
// CHECK: bb3:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test3(x: i8) {
|
||||
match likely(x < 7) {
|
||||
true => path_a(),
|
||||
_ => path_b(),
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test3(
|
||||
// CHECK: br i1 %_2, label %bb2, label %bb3, !prof ![[NUM]]
|
||||
// CHECK: bb3:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test4(x: u64) {
|
||||
match likely(x != 33) {
|
||||
false => path_a(),
|
||||
_ => path_b(),
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test4(
|
||||
// CHECK: br i1 %0, label %bb3, label %bb2, !prof ![[NUM2:[0-9]+]]
|
||||
// CHECK: bb3:
|
||||
// CHECK: path_a
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_b
|
||||
}
|
||||
|
||||
// CHECK: ![[NUM]] = !{!"branch_weights", {{(!"expected", )?}}i32 2000, i32 1}
|
||||
// CHECK: ![[NUM2]] = !{!"branch_weights", {{(!"expected", )?}}i32 1, i32 2000}
|
80
tests/codegen/hint/unlikely.rs
Normal file
80
tests/codegen/hint/unlikely.rs
Normal file
|
@ -0,0 +1,80 @@
|
|||
//@ compile-flags: -O
|
||||
#![crate_type = "lib"]
|
||||
#![feature(likely_unlikely)]
|
||||
|
||||
use std::hint::unlikely;
|
||||
|
||||
#[inline(never)]
|
||||
#[no_mangle]
|
||||
pub fn path_a() {
|
||||
println!("path a");
|
||||
}
|
||||
|
||||
#[inline(never)]
|
||||
#[no_mangle]
|
||||
pub fn path_b() {
|
||||
println!("path b");
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test1(x: bool) {
|
||||
if unlikely(x) {
|
||||
path_a();
|
||||
} else {
|
||||
path_b();
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test1(
|
||||
// CHECK: br i1 %x, label %bb2, label %bb4, !prof ![[NUM:[0-9]+]]
|
||||
// CHECK: bb4:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test2(x: i32) {
|
||||
match unlikely(x > 0) {
|
||||
true => path_a(),
|
||||
false => path_b(),
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test2(
|
||||
// CHECK: br i1 %_2, label %bb2, label %bb4, !prof ![[NUM]]
|
||||
// CHECK: bb4:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test3(x: i8) {
|
||||
match unlikely(x < 7) {
|
||||
true => path_a(),
|
||||
_ => path_b(),
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test3(
|
||||
// CHECK: br i1 %_2, label %bb2, label %bb4, !prof ![[NUM]]
|
||||
// CHECK: bb4:
|
||||
// CHECK: path_b
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_a
|
||||
}
|
||||
|
||||
#[no_mangle]
|
||||
pub fn test4(x: u64) {
|
||||
match unlikely(x != 33) {
|
||||
false => path_a(),
|
||||
_ => path_b(),
|
||||
}
|
||||
|
||||
// CHECK-LABEL: @test4(
|
||||
// CHECK: br i1 %0, label %bb4, label %bb2, !prof ![[NUM2:[0-9]+]]
|
||||
// CHECK: bb4:
|
||||
// CHECK: path_a
|
||||
// CHECK: bb2:
|
||||
// CHECK: path_b
|
||||
}
|
||||
|
||||
// CHECK: ![[NUM]] = !{!"branch_weights", {{(!"expected", )?}}i32 1, i32 2000}
|
Loading…
Add table
Add a link
Reference in a new issue