Skip to content

Commit 2130bbb

Browse files
committed
Reexport likely/unlikely in std::hint
1 parent 4af7fa7 commit 2130bbb

File tree

5 files changed

+225
-2
lines changed

5 files changed

+225
-2
lines changed

Diff for: library/core/src/hint.rs

+62
Original file line numberDiff line numberDiff line change
@@ -511,3 +511,65 @@ pub const fn black_box<T>(dummy: T) -> T {
511511
pub const fn must_use<T>(value: T) -> T {
512512
value
513513
}
514+
515+
/// Hints to the compiler that branch condition is likely to be true.
516+
/// Returns the value passed to it.
517+
///
518+
/// It can be used with `if` or boolean `match` expressions.
519+
///
520+
/// # Examples
521+
///
522+
/// ```
523+
/// #![feature(likely_unlikely)]
524+
/// use core::hint::likely;
525+
///
526+
/// fn foo(x: i32) {
527+
/// if likely(x > 0) {
528+
/// println!("this branch is likely to be taken");
529+
/// } else {
530+
/// println!("this branch is unlikely to be taken");
531+
/// }
532+
///
533+
/// match likely(x > 0) {
534+
/// true => println!("this branch is likely to be taken"),
535+
/// false => println!("this branch is unlikely to be taken"),
536+
/// }
537+
/// }
538+
/// ```
539+
#[unstable(feature = "likely_unlikely", issue = "26179")]
540+
#[rustc_nounwind]
541+
#[inline(always)]
542+
pub const fn likely(b: bool) -> bool {
543+
crate::intrinsics::likely(b)
544+
}
545+
546+
/// Hints to the compiler that the branch condition is unlikely to be true.
547+
/// Returns the value passed to it.
548+
///
549+
/// It can be used with `if` or boolean `match` expressions.
550+
///
551+
/// # Examples
552+
///
553+
/// ```
554+
/// #![feature(likely_unlikely)]
555+
/// use core::hint::unlikely;
556+
///
557+
/// fn foo(x: i32) {
558+
/// if unlikely(x > 0) {
559+
/// println!("this branch is unlikely to be taken");
560+
/// } else {
561+
/// println!("this branch is likely to be taken");
562+
/// }
563+
///
564+
/// match unlikely(x > 0) {
565+
/// true => println!("this branch is unlikely to be taken"),
566+
/// false => println!("this branch is likely to be taken"),
567+
/// }
568+
/// }
569+
/// ```
570+
#[unstable(feature = "likely_unlikely", issue = "26179")]
571+
#[rustc_nounwind]
572+
#[inline(always)]
573+
pub const fn unlikely(b: bool) -> bool {
574+
crate::intrinsics::unlikely(b)
575+
}

Diff for: tests/codegen/hint/likely.rs

+81
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
//@ compile-flags: -O
2+
#![crate_type = "lib"]
3+
#![feature(likely_unlikely)]
4+
5+
use std::hint::likely;
6+
7+
#[inline(never)]
8+
#[no_mangle]
9+
pub fn path_a() {
10+
println!("path a");
11+
}
12+
13+
#[inline(never)]
14+
#[no_mangle]
15+
pub fn path_b() {
16+
println!("path b");
17+
}
18+
19+
#[no_mangle]
20+
pub fn test1(x: bool) {
21+
if likely(x) {
22+
path_a();
23+
} else {
24+
path_b();
25+
}
26+
}
27+
28+
#[no_mangle]
29+
pub fn test2(x: i32) {
30+
match likely(x > 0) {
31+
true => path_a(),
32+
false => path_b(),
33+
}
34+
}
35+
36+
#[no_mangle]
37+
pub fn test3(x: i8) {
38+
match likely(x < 7) {
39+
true => path_a(),
40+
_ => path_b(),
41+
}
42+
}
43+
44+
#[no_mangle]
45+
pub fn test4(x: u64) {
46+
match likely(x != 33) {
47+
false => path_a(),
48+
_ => path_b(),
49+
}
50+
}
51+
52+
// CHECK-LABEL: @test1(
53+
// CHECK: br i1 %x, label %bb2, label %bb3, !prof ![[NUM:[0-9]+]]
54+
// CHECK: bb3:
55+
// CHECK: path_b
56+
// CHECK: bb2:
57+
// CHECK: path_a
58+
59+
// CHECK-LABEL: @test2(
60+
// CHECK: br i1 %_2, label %bb2, label %bb3, !prof ![[NUM]]
61+
// CHECK: bb3:
62+
// CHECK: path_b
63+
// CHECK: bb2:
64+
// CHECK: path_a
65+
66+
// CHECK-LABEL: @test3(
67+
// CHECK: br i1 %_2, label %bb2, label %bb3, !prof ![[NUM]]
68+
// CHECK: bb3:
69+
// CHECK: path_b
70+
// CHECK: bb2:
71+
// CHECK: path_a
72+
73+
// CHECK-LABEL: @test4(
74+
// CHECK: br i1 %0, label %bb3, label %bb2, !prof ![[NUM2:[0-9]+]]
75+
// CHECK: bb3:
76+
// CHECK: path_a
77+
// CHECK: bb2:
78+
// CHECK: path_b
79+
80+
// CHECK: ![[NUM]] = !{!"branch_weights", {{(!"expected", )?}}i32 2000, i32 1}
81+
// CHECK: ![[NUM2]] = !{!"branch_weights", {{(!"expected", )?}}i32 1, i32 2000}

Diff for: tests/codegen/hint/unlikely.rs

+80
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
//@ compile-flags: -O
2+
#![crate_type = "lib"]
3+
#![feature(likely_unlikely)]
4+
5+
use std::hint::unlikely;
6+
7+
#[inline(never)]
8+
#[no_mangle]
9+
pub fn path_a() {
10+
println!("path a");
11+
}
12+
13+
#[inline(never)]
14+
#[no_mangle]
15+
pub fn path_b() {
16+
println!("path b");
17+
}
18+
19+
#[no_mangle]
20+
pub fn test1(x: bool) {
21+
if unlikely(x) {
22+
path_a();
23+
} else {
24+
path_b();
25+
}
26+
}
27+
28+
#[no_mangle]
29+
pub fn test2(x: i32) {
30+
match unlikely(x > 0) {
31+
true => path_a(),
32+
false => path_b(),
33+
}
34+
}
35+
36+
#[no_mangle]
37+
pub fn test3(x: i8) {
38+
match unlikely(x < 7) {
39+
true => path_a(),
40+
_ => path_b(),
41+
}
42+
}
43+
44+
#[no_mangle]
45+
pub fn test4(x: u64) {
46+
match unlikely(x != 33) {
47+
false => path_a(),
48+
_ => path_b(),
49+
}
50+
}
51+
52+
// CHECK-LABEL: @test1(
53+
// CHECK: br i1 %x, label %bb2, label %bb4, !prof ![[NUM:[0-9]+]]
54+
// CHECK: bb4:
55+
// CHECK: path_b
56+
// CHECK: bb2:
57+
// CHECK: path_a
58+
59+
// CHECK-LABEL: @test2(
60+
// CHECK: br i1 %_2, label %bb2, label %bb4, !prof ![[NUM]]
61+
// CHECK: bb4:
62+
// CHECK: path_b
63+
// CHECK: bb2:
64+
// CHECK: path_a
65+
66+
// CHECK-LABEL: @test3(
67+
// CHECK: br i1 %_2, label %bb2, label %bb4, !prof ![[NUM]]
68+
// CHECK: bb4:
69+
// CHECK: path_b
70+
// CHECK: bb2:
71+
// CHECK: path_a
72+
73+
// CHECK-LABEL: @test4(
74+
// CHECK: br i1 %0, label %bb4, label %bb2, !prof ![[NUM2:[0-9]+]]
75+
// CHECK: bb4:
76+
// CHECK: path_a
77+
// CHECK: bb2:
78+
// CHECK: path_b
79+
80+
// CHECK: ![[NUM]] = !{!"branch_weights", {{(!"expected", )?}}i32 1, i32 2000}

Diff for: tests/mir-opt/pre-codegen/checked_ops.step_forward.PreCodegen.after.panic-abort.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ fn step_forward(_1: u16, _2: usize) -> u16 {
1313
scope 6 (inlined core::num::<impl u16>::checked_add) {
1414
let mut _5: (u16, bool);
1515
let mut _6: bool;
16-
scope 7 (inlined unlikely) {
16+
scope 7 (inlined std::intrinsics::unlikely) {
1717
let _7: ();
1818
}
1919
}

Diff for: tests/mir-opt/pre-codegen/checked_ops.step_forward.PreCodegen.after.panic-unwind.mir

+1-1
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ fn step_forward(_1: u16, _2: usize) -> u16 {
1313
scope 6 (inlined core::num::<impl u16>::checked_add) {
1414
let mut _5: (u16, bool);
1515
let mut _6: bool;
16-
scope 7 (inlined unlikely) {
16+
scope 7 (inlined std::intrinsics::unlikely) {
1717
let _7: ();
1818
}
1919
}

0 commit comments

Comments
 (0)