/// own, or if it does not enable any significant optimizations.
pub fn assume(b: bool);
+ #[cfg(not(stage0))]
+ /// Hints to the compiler that branch condition is likely to be true.
+ /// Returns the value passed to it.
+ ///
+ /// Any use other than with `if` statements will probably not have an effect.
+ pub fn likely(b: bool) -> bool;
+
+ #[cfg(not(stage0))]
+ /// Hints to the compiler that branch condition is likely to be false.
+ /// Returns the value passed to it.
+ ///
+ /// Any use other than with `if` statements will probably not have an effect.
+ pub fn unlikely(b: bool) -> bool;
+
/// Executes a breakpoint trap, for inspection by a debugger.
pub fn breakpoint();
(Some(llfn), _) => {
Call(bcx, llfn, &llargs, call_debug_location)
}
+ (_, "likely") => {
+ let expect = ccx.get_intrinsic(&("llvm.expect.i1"));
+ Call(bcx, expect, &[llargs[0], C_bool(ccx, true)], call_debug_location)
+ }
+ (_, "unlikely") => {
+ let expect = ccx.get_intrinsic(&("llvm.expect.i1"));
+ Call(bcx, expect, &[llargs[0], C_bool(ccx, false)], call_debug_location)
+ }
(_, "try") => {
bcx = try_intrinsic(bcx, llargs[0], llargs[1], llargs[2], llresult,
call_debug_location);
(1, vec![param(ccx, 0), param(ccx, 0)], param(ccx, 0)),
"assume" => (0, vec![tcx.types.bool], tcx.mk_nil()),
+ "likely" => (0, vec![tcx.types.bool], tcx.types.bool),
+ "unlikely" => (0, vec![tcx.types.bool], tcx.types.bool),
"discriminant_value" => (1, vec![
tcx.mk_imm_ref(tcx.mk_region(ty::ReLateBound(ty::DebruijnIndex::new(1),
--- /dev/null
+// Copyright 2016 The Rust Project Developers. See the COPYRIGHT
+// file at the top-level directory of this distribution and at
+// http://rust-lang.org/COPYRIGHT.
+//
+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
+// option. This file may not be copied, modified, or distributed
+// except according to those terms.
+
+// compile-flags: -C no-prepopulate-passes
+
+#![crate_type = "lib"]
+#![feature(core_intrinsics)]
+
+use std::intrinsics::{likely,unlikely};
+
+#[no_mangle]
+pub fn check_likely(x: i32, y: i32) -> Option<i32> {
+ unsafe {
+ // CHECK: call i1 @llvm.expect.i1(i1 %{{.*}}, i1 true)
+ if likely(x == y) {
+ None
+ } else {
+ Some(x + y)
+ }
+ }
+}
+
+#[no_mangle]
+pub fn check_unlikely(x: i32, y: i32) -> Option<i32> {
+ unsafe {
+ // CHECK: call i1 @llvm.expect.i1(i1 %{{.*}}, i1 false)
+ if unlikely(x == y) {
+ None
+ } else {
+ Some(x + y)
+ }
+ }
+}
+