mirror of
https://github.com/rust-lang/rust.git
synced 2024-11-26 00:34:06 +00:00
Rollup merge of #70259 - wesleywiser:use_reveal_all, r=eddyb
Use Reveal::All in MIR optimizations Resolves some code review feedback in #67662. Fixes #68855 r? @eddyb
This commit is contained in:
commit
0d5b83df26
@ -337,14 +337,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
|
||||
) -> ConstPropagator<'mir, 'tcx> {
|
||||
let def_id = source.def_id();
|
||||
let substs = &InternalSubsts::identity_for_item(tcx, def_id);
|
||||
let mut param_env = tcx.param_env(def_id);
|
||||
|
||||
// If we're evaluating inside a monomorphic function, then use `Reveal::All` because
|
||||
// we want to see the same instances that codegen will see. This allows us to `resolve()`
|
||||
// specializations.
|
||||
if !substs.needs_subst() {
|
||||
param_env = param_env.with_reveal_all();
|
||||
}
|
||||
let param_env = tcx.param_env(def_id).with_reveal_all();
|
||||
|
||||
let span = tcx.def_span(def_id);
|
||||
let mut ecx = InterpCx::new(tcx.at(span), param_env, ConstPropMachine, ());
|
||||
|
@ -3,8 +3,8 @@
|
||||
use rustc::middle::codegen_fn_attrs::CodegenFnAttrFlags;
|
||||
use rustc::mir::visit::*;
|
||||
use rustc::mir::*;
|
||||
use rustc::ty::subst::{InternalSubsts, Subst, SubstsRef};
|
||||
use rustc::ty::{self, Instance, InstanceDef, ParamEnv, Ty, TyCtxt, TypeFoldable};
|
||||
use rustc::ty::subst::{Subst, SubstsRef};
|
||||
use rustc::ty::{self, Instance, InstanceDef, ParamEnv, Ty, TyCtxt};
|
||||
use rustc_attr as attr;
|
||||
use rustc_hir::def_id::DefId;
|
||||
use rustc_index::bit_set::BitSet;
|
||||
@ -66,14 +66,7 @@ impl Inliner<'tcx> {
|
||||
|
||||
let mut callsites = VecDeque::new();
|
||||
|
||||
let mut param_env = self.tcx.param_env(self.source.def_id());
|
||||
|
||||
let substs = &InternalSubsts::identity_for_item(self.tcx, self.source.def_id());
|
||||
|
||||
// For monomorphic functions, we can use `Reveal::All` to resolve specialized instances.
|
||||
if !substs.needs_subst() {
|
||||
param_env = param_env.with_reveal_all();
|
||||
}
|
||||
let param_env = self.tcx.param_env(self.source.def_id()).with_reveal_all();
|
||||
|
||||
// Only do inlining into fn bodies.
|
||||
let id = self.tcx.hir().as_local_hir_id(self.source.def_id()).unwrap();
|
||||
|
64
src/test/mir-opt/const_prop/control-flow-simplification.rs
Normal file
64
src/test/mir-opt/const_prop/control-flow-simplification.rs
Normal file
@ -0,0 +1,64 @@
|
||||
// compile-flags: -Zmir-opt-level=1
|
||||
|
||||
trait NeedsDrop:Sized{
|
||||
const NEEDS:bool=std::mem::needs_drop::<Self>();
|
||||
}
|
||||
|
||||
impl<This> NeedsDrop for This{}
|
||||
|
||||
fn hello<T>(){
|
||||
if <bool>::NEEDS {
|
||||
panic!()
|
||||
}
|
||||
}
|
||||
|
||||
pub fn main() {
|
||||
hello::<()>();
|
||||
hello::<Vec<()>>();
|
||||
}
|
||||
|
||||
// END RUST SOURCE
|
||||
// START rustc.hello.ConstProp.before.mir
|
||||
// let mut _0: ();
|
||||
// let mut _1: bool;
|
||||
// let mut _2: !;
|
||||
// bb0: {
|
||||
// StorageLive(_1);
|
||||
// _1 = const <bool as NeedsDrop>::NEEDS;
|
||||
// switchInt(_1) -> [false: bb1, otherwise: bb2];
|
||||
// }
|
||||
// bb1: {
|
||||
// _0 = ();
|
||||
// StorageDead(_1);
|
||||
// return;
|
||||
// }
|
||||
// bb2: {
|
||||
// StorageLive(_2);
|
||||
// const std::rt::begin_panic::<&str>(const "explicit panic");
|
||||
// }
|
||||
// END rustc.hello.ConstProp.before.mir
|
||||
// START rustc.hello.ConstProp.after.mir
|
||||
// let mut _0: ();
|
||||
// let mut _1: bool;
|
||||
// let mut _2: !;
|
||||
// bb0: {
|
||||
// StorageLive(_1);
|
||||
// _1 = const false;
|
||||
// switchInt(const false) -> [false: bb1, otherwise: bb2];
|
||||
// }
|
||||
// bb1: {
|
||||
// _0 = ();
|
||||
// StorageDead(_1);
|
||||
// return;
|
||||
// }
|
||||
// bb2: {
|
||||
// StorageLive(_2);
|
||||
// const std::rt::begin_panic::<&str>(const "explicit panic");
|
||||
// }
|
||||
// END rustc.hello.ConstProp.after.mir
|
||||
// START rustc.hello.PreCodegen.before.mir
|
||||
// let mut _0: ();
|
||||
// bb0: {
|
||||
// return;
|
||||
// }
|
||||
// END rustc.hello.PreCodegen.before.mir
|
Loading…
Reference in New Issue
Block a user