Rollup merge of #79101 - tmiasko:lower-func-type, r=jonas-schievink
Don't special case constant operands when lowering intrinsics
This commit is contained in:
commit
05ff58e645
3 changed files with 42 additions and 8 deletions
|
@ -11,15 +11,11 @@ pub struct LowerIntrinsics;
|
||||||
|
|
||||||
impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
|
impl<'tcx> MirPass<'tcx> for LowerIntrinsics {
|
||||||
fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) {
|
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();
|
let terminator = block.terminator.as_mut().unwrap();
|
||||||
if let TerminatorKind::Call {
|
if let TerminatorKind::Call { func, args, destination, .. } = &mut terminator.kind {
|
||||||
func: Operand::Constant(box Constant { literal: ty::Const { ty: func_ty, .. }, .. }),
|
let func_ty = func.ty(local_decls, tcx);
|
||||||
args,
|
|
||||||
destination,
|
|
||||||
..
|
|
||||||
} = &mut terminator.kind
|
|
||||||
{
|
|
||||||
let (intrinsic_name, substs) = match resolve_rust_intrinsic(tcx, func_ty) {
|
let (intrinsic_name, substs) = match resolve_rust_intrinsic(tcx, func_ty) {
|
||||||
None => continue,
|
None => continue,
|
||||||
Some(it) => it,
|
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)]
|
#[inline(never)]
|
||||||
pub fn f_non_zst<T>(t: T) {}
|
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…
Add table
Add a link
Reference in a new issue