Unify all validity check intrinsics

Also merges the inhabitedness check into the query to further unify the
code paths.
This commit is contained in:
Nilstrieb 2023-02-26 21:50:19 +00:00
parent 49b9cc5139
commit 5f593da4e6
11 changed files with 118 additions and 162 deletions

View file

@ -6,9 +6,9 @@ use rustc_middle::mir::{
BinOp, Body, Constant, ConstantKind, LocalDecls, Operand, Place, ProjectionElem, Rvalue,
SourceInfo, Statement, StatementKind, Terminator, TerminatorKind, UnOp,
};
use rustc_middle::ty::layout::InitKind;
use rustc_middle::ty::layout::ValidityRequirement;
use rustc_middle::ty::{self, ParamEnv, SubstsRef, Ty, TyCtxt};
use rustc_span::symbol::{sym, Symbol};
use rustc_span::symbol::Symbol;
pub struct InstCombine;
@ -256,16 +256,8 @@ fn intrinsic_assert_panics<'tcx>(
ty: Ty<'tcx>,
intrinsic_name: Symbol,
) -> Option<bool> {
Some(match intrinsic_name {
sym::assert_inhabited => tcx.layout_of(param_env.and(ty)).ok()?.abi.is_uninhabited(),
sym::assert_zero_valid => {
!tcx.check_validity_of_init((InitKind::Zero, param_env.and(ty))).ok()?
}
sym::assert_mem_uninitialized_valid => !tcx
.check_validity_of_init((InitKind::UninitMitigated0x01Fill, param_env.and(ty)))
.ok()?,
_ => return None,
})
let requirement = ValidityRequirement::from_intrinsic(intrinsic_name)?;
Some(!tcx.check_validity_requirement((requirement, param_env.and(ty))).ok()?)
}
fn resolve_rust_intrinsic<'tcx>(