Don't codegen expect in opt-level=0

This commit is contained in:
clubby789 2024-02-25 22:56:08 +00:00
parent 842d6fc32e
commit 5b96ae7106
4 changed files with 14 additions and 14 deletions

View File

@ -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 {

View File

@ -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.

View File

@ -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 },
)) => { )) => {

View File

@ -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)]