@@ -529,6 +529,8 @@ pub const fn must_use<T>(value: T) -> T {
529
529
/// likely(a || b) => a || likely(b)
530
530
/// ```
531
531
///
532
+ /// See also the function `cold_path()` which may be more appropriate for idiomatic Rust code.
533
+ ///
532
534
/// # Examples
533
535
///
534
536
/// ```
@@ -581,6 +583,8 @@ pub const fn likely(b: bool) -> bool {
581
583
/// unlikely(a || b) => unlikely(a) || unlikely(b)
582
584
/// ```
583
585
///
586
+ /// See also the function `cold_path()` which may be more appropriate for idiomatic Rust code.
587
+ ///
584
588
/// # Examples
585
589
///
586
590
/// ```
@@ -613,3 +617,37 @@ pub const fn likely(b: bool) -> bool {
613
617
pub const fn unlikely ( b : bool ) -> bool {
614
618
crate :: intrinsics:: unlikely ( b)
615
619
}
620
+
621
+ /// Hints to the compiler that given path is cold, i.e., unlikely to be taken. The compiler may
622
+ /// choose to optimize paths that are not cold at the expense of paths that are cold.
623
+ ///
624
+ /// # Examples
625
+ ///
626
+ /// ```
627
+ /// #![feature(cold_path)]
628
+ /// use core::hint::cold_path;
629
+ ///
630
+ /// fn foo(x: &[i32]) {
631
+ /// if let Some(first) = x.get(0) {
632
+ /// // this is the fast path
633
+ /// } else {
634
+ /// // this path is unlikely
635
+ /// cold_path();
636
+ /// }
637
+ /// }
638
+ ///
639
+ /// fn bar(x: i32) -> i32 {
640
+ /// match x {
641
+ /// 1 => 10,
642
+ /// 2 => 100,
643
+ /// 3 => { cold_path(); 1000 }, // this branch is unlikely
644
+ /// _ => { cold_path(); 10000 }, // this is also unlikely
645
+ /// }
646
+ /// }
647
+ /// ```
648
+ #[ unstable( feature = "cold_path" , issue = "none" ) ]
649
+ #[ rustc_nounwind]
650
+ #[ inline( always) ]
651
+ pub fn cold_path ( ) {
652
+ crate :: intrinsics:: cold_path ( )
653
+ }
0 commit comments