InstSimplify rustc_nounwind calls
This commit is contained in:
parent
9842a5ca7f
commit
580067c76f
1 changed files with 25 additions and 0 deletions
|
@ -2,10 +2,12 @@
|
|||
|
||||
use crate::simplify::simplify_duplicate_switch_targets;
|
||||
use rustc_middle::mir::*;
|
||||
use rustc_middle::ty::layout;
|
||||
use rustc_middle::ty::layout::ValidityRequirement;
|
||||
use rustc_middle::ty::{self, GenericArgsRef, ParamEnv, Ty, TyCtxt};
|
||||
use rustc_span::symbol::Symbol;
|
||||
use rustc_target::abi::FieldIdx;
|
||||
use rustc_target::spec::abi::Abi;
|
||||
|
||||
pub struct InstSimplify;
|
||||
|
||||
|
@ -38,6 +40,7 @@ impl<'tcx> MirPass<'tcx> for InstSimplify {
|
|||
block.terminator.as_mut().unwrap(),
|
||||
&mut block.statements,
|
||||
);
|
||||
ctx.simplify_nounwind_call(block.terminator.as_mut().unwrap());
|
||||
simplify_duplicate_switch_targets(block.terminator.as_mut().unwrap());
|
||||
}
|
||||
}
|
||||
|
@ -252,6 +255,28 @@ impl<'tcx> InstSimplifyContext<'tcx, '_> {
|
|||
terminator.kind = TerminatorKind::Goto { target: destination_block };
|
||||
}
|
||||
|
||||
fn simplify_nounwind_call(&self, terminator: &mut Terminator<'tcx>) {
|
||||
let TerminatorKind::Call { func, unwind, .. } = &mut terminator.kind else {
|
||||
return;
|
||||
};
|
||||
|
||||
let Some((def_id, _)) = func.const_fn_def() else {
|
||||
return;
|
||||
};
|
||||
|
||||
let body_ty = self.tcx.type_of(def_id).skip_binder();
|
||||
let body_abi = match body_ty.kind() {
|
||||
ty::FnDef(..) => body_ty.fn_sig(self.tcx).abi(),
|
||||
ty::Closure(..) => Abi::RustCall,
|
||||
ty::Coroutine(..) => Abi::Rust,
|
||||
_ => bug!("unexpected body ty: {:?}", body_ty),
|
||||
};
|
||||
|
||||
if !layout::fn_can_unwind(self.tcx, Some(def_id), body_abi) {
|
||||
*unwind = UnwindAction::Unreachable;
|
||||
}
|
||||
}
|
||||
|
||||
fn simplify_intrinsic_assert(
|
||||
&self,
|
||||
terminator: &mut Terminator<'tcx>,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue