Don't codegen expect
in opt-level=0
This commit is contained in:
parent
842d6fc32e
commit
5b96ae7106
@ -187,9 +187,7 @@ fn codegen_intrinsic_call(
|
|||||||
Some(instance),
|
Some(instance),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
sym::likely => {
|
sym::likely => self.expect(args[0].immediate(), true),
|
||||||
self.call_intrinsic("llvm.expect.i1", &[args[0].immediate(), self.const_bool(true)])
|
|
||||||
}
|
|
||||||
sym::is_val_statically_known => {
|
sym::is_val_statically_known => {
|
||||||
let intrinsic_type = args[0].layout.immediate_llvm_type(self.cx);
|
let intrinsic_type = args[0].layout.immediate_llvm_type(self.cx);
|
||||||
let kind = self.type_kind(intrinsic_type);
|
let kind = self.type_kind(intrinsic_type);
|
||||||
@ -210,8 +208,7 @@ fn codegen_intrinsic_call(
|
|||||||
self.const_bool(false)
|
self.const_bool(false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
sym::unlikely => self
|
sym::unlikely => self.expect(args[0].immediate(), false),
|
||||||
.call_intrinsic("llvm.expect.i1", &[args[0].immediate(), self.const_bool(false)]),
|
|
||||||
sym::select_unpredictable => {
|
sym::select_unpredictable => {
|
||||||
let cond = args[0].immediate();
|
let cond = args[0].immediate();
|
||||||
assert_eq!(args[1].layout, args[2].layout);
|
assert_eq!(args[1].layout, args[2].layout);
|
||||||
@ -604,11 +601,17 @@ fn abort(&mut self) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn assume(&mut self, val: Self::Value) {
|
fn assume(&mut self, val: Self::Value) {
|
||||||
|
if self.cx.sess().opts.optimize != rustc_session::config::OptLevel::No {
|
||||||
self.call_intrinsic("llvm.assume", &[val]);
|
self.call_intrinsic("llvm.assume", &[val]);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn expect(&mut self, cond: Self::Value, expected: bool) -> Self::Value {
|
fn expect(&mut self, cond: Self::Value, expected: bool) -> Self::Value {
|
||||||
|
if self.cx.sess().opts.optimize != rustc_session::config::OptLevel::No {
|
||||||
self.call_intrinsic("llvm.expect.i1", &[cond, self.const_bool(expected)])
|
self.call_intrinsic("llvm.expect.i1", &[cond, self.const_bool(expected)])
|
||||||
|
} else {
|
||||||
|
cond
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn type_test(&mut self, pointer: Self::Value, typeid: Self::Value) -> Self::Value {
|
fn type_test(&mut self, pointer: Self::Value, typeid: Self::Value) -> Self::Value {
|
||||||
|
@ -382,7 +382,7 @@ fn assume_scalar_range(
|
|||||||
scalar: abi::Scalar,
|
scalar: abi::Scalar,
|
||||||
backend_ty: Bx::Type,
|
backend_ty: Bx::Type,
|
||||||
) {
|
) {
|
||||||
if matches!(self.cx.sess().opts.optimize, OptLevel::No | OptLevel::Less)
|
if matches!(self.cx.sess().opts.optimize, OptLevel::No)
|
||||||
// For now, the critical niches are all over `Int`eger values.
|
// For now, the critical niches are all over `Int`eger values.
|
||||||
// Should floating-point values or pointers ever get more complex
|
// Should floating-point values or pointers ever get more complex
|
||||||
// niches, then this code will probably want to handle them too.
|
// niches, then this code will probably want to handle them too.
|
||||||
|
@ -1,6 +1,5 @@
|
|||||||
use rustc_middle::mir::{self, NonDivergingIntrinsic};
|
use rustc_middle::mir::{self, NonDivergingIntrinsic};
|
||||||
use rustc_middle::span_bug;
|
use rustc_middle::span_bug;
|
||||||
use rustc_session::config::OptLevel;
|
|
||||||
use tracing::instrument;
|
use tracing::instrument;
|
||||||
|
|
||||||
use super::{FunctionCx, LocalRef};
|
use super::{FunctionCx, LocalRef};
|
||||||
@ -68,11 +67,9 @@ pub fn codegen_statement(&mut self, bx: &mut Bx, statement: &mir::Statement<'tcx
|
|||||||
self.codegen_coverage(bx, kind, statement.source_info.scope);
|
self.codegen_coverage(bx, kind, statement.source_info.scope);
|
||||||
}
|
}
|
||||||
mir::StatementKind::Intrinsic(box NonDivergingIntrinsic::Assume(ref op)) => {
|
mir::StatementKind::Intrinsic(box NonDivergingIntrinsic::Assume(ref op)) => {
|
||||||
if !matches!(bx.tcx().sess.opts.optimize, OptLevel::No | OptLevel::Less) {
|
|
||||||
let op_val = self.codegen_operand(bx, op);
|
let op_val = self.codegen_operand(bx, op);
|
||||||
bx.assume(op_val.immediate());
|
bx.assume(op_val.immediate());
|
||||||
}
|
}
|
||||||
}
|
|
||||||
mir::StatementKind::Intrinsic(box NonDivergingIntrinsic::CopyNonOverlapping(
|
mir::StatementKind::Intrinsic(box NonDivergingIntrinsic::CopyNonOverlapping(
|
||||||
mir::CopyNonOverlapping { ref count, ref src, ref dst },
|
mir::CopyNonOverlapping { ref count, ref src, ref dst },
|
||||||
)) => {
|
)) => {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
//@ compile-flags: -C no-prepopulate-passes
|
//@ compile-flags: -C no-prepopulate-passes -Copt-level=1
|
||||||
|
|
||||||
#![crate_type = "lib"]
|
#![crate_type = "lib"]
|
||||||
#![feature(core_intrinsics)]
|
#![feature(core_intrinsics)]
|
||||||
|
Loading…
Reference in New Issue
Block a user