mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-02 07:22:42 +00:00
Don't special case constant operands when lowering intrinsics
This commit is contained in:
parent
603ab5bd6e
commit
2b7ffecee0
@ -11,15 +11,11 @@ pub struct LowerIntrinsics;
|
||||
|
||||
impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
|
||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
||||
for block in body.basic_blocks_mut() {
|
||||
let (basic_blocks, local_decls) = body.basic_blocks_and_local_decls_mut();
|
||||
for block in basic_blocks {
|
||||
let terminator = block.terminator.as_mut().unwrap();
|
||||
if let TerminatorKind::Call {
|
||||
func: Operand::Constant(box Constant { literal: ty::Const { ty: func_ty, .. }, .. }),
|
||||
args,
|
||||
destination,
|
||||
..
|
||||
} = &mut terminator.kind
|
||||
{
|
||||
if let TerminatorKind::Call { func, args, destination, .. } = &mut terminator.kind {
|
||||
let func_ty = func.ty(local_decls, tcx);
|
||||
let (intrinsic_name, substs) = match resolve_rust_intrinsic(tcx, func_ty) {
|
||||
None => continue,
|
||||
Some(it) => it,
|
||||
|
@ -0,0 +1,31 @@
|
||||
- // MIR for `non_const` before LowerIntrinsics
|
||||
+ // MIR for `non_const` after LowerIntrinsics
|
||||
|
||||
fn non_const() -> usize {
|
||||
let mut _0: usize; // return place in scope 0 at $DIR/lower_intrinsics.rs:55:26: 55:31
|
||||
let _1: extern "rust-intrinsic" fn() -> usize {std::intrinsics::size_of::<T>}; // in scope 0 at $DIR/lower_intrinsics.rs:57:9: 57:18
|
||||
let mut _2: extern "rust-intrinsic" fn() -> usize {std::intrinsics::size_of::<T>}; // in scope 0 at $DIR/lower_intrinsics.rs:58:5: 58:14
|
||||
scope 1 {
|
||||
debug size_of_t => _1; // in scope 1 at $DIR/lower_intrinsics.rs:57:9: 57:18
|
||||
}
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1); // scope 0 at $DIR/lower_intrinsics.rs:57:9: 57:18
|
||||
_1 = std::intrinsics::size_of::<T>; // scope 0 at $DIR/lower_intrinsics.rs:57:21: 57:51
|
||||
// mir::Constant
|
||||
// + span: $DIR/lower_intrinsics.rs:57:21: 57:51
|
||||
// + literal: Const { ty: extern "rust-intrinsic" fn() -> usize {std::intrinsics::size_of::<T>}, val: Value(Scalar(<ZST>)) }
|
||||
StorageLive(_2); // scope 1 at $DIR/lower_intrinsics.rs:58:5: 58:14
|
||||
_2 = _1; // scope 1 at $DIR/lower_intrinsics.rs:58:5: 58:14
|
||||
- _0 = move _2() -> bb1; // scope 1 at $DIR/lower_intrinsics.rs:58:5: 58:16
|
||||
+ _0 = SizeOf(T); // scope 1 at $DIR/lower_intrinsics.rs:58:5: 58:16
|
||||
+ goto -> bb1; // scope 1 at $DIR/lower_intrinsics.rs:58:5: 58:16
|
||||
}
|
||||
|
||||
bb1: {
|
||||
StorageDead(_2); // scope 1 at $DIR/lower_intrinsics.rs:58:15: 58:16
|
||||
StorageDead(_1); // scope 0 at $DIR/lower_intrinsics.rs:59:1: 59:2
|
||||
return; // scope 0 at $DIR/lower_intrinsics.rs:59:2: 59:2
|
||||
}
|
||||
}
|
||||
|
@ -50,3 +50,10 @@ pub fn f_zst<T>(t: T) {
|
||||
|
||||
#[inline(never)]
|
||||
pub fn f_non_zst<T>(t: T) {}
|
||||
|
||||
// EMIT_MIR lower_intrinsics.non_const.LowerIntrinsics.diff
|
||||
pub fn non_const<T>() -> usize {
|
||||
// Check that lowering works with non-const operand as a func.
|
||||
let size_of_t = core::intrinsics::size_of::<T>;
|
||||
size_of_t()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user