InstSimplify from_raw_parts(p, ())
→ p as _
This commit is contained in:
parent
de64ff76f8
commit
9520cebfc5
6 changed files with 48 additions and 41 deletions
|
@ -36,6 +36,7 @@ impl<'tcx> MirPass<'tcx> for InstSimplify {
|
|||
ctx.simplify_bool_cmp(&statement.source_info, rvalue);
|
||||
ctx.simplify_ref_deref(&statement.source_info, rvalue);
|
||||
ctx.simplify_len(&statement.source_info, rvalue);
|
||||
ctx.simplify_ptr_aggregate(&statement.source_info, rvalue);
|
||||
ctx.simplify_cast(rvalue);
|
||||
}
|
||||
_ => {}
|
||||
|
@ -58,8 +59,17 @@ struct InstSimplifyContext<'tcx, 'a> {
|
|||
|
||||
impl<'tcx> InstSimplifyContext<'tcx, '_> {
|
||||
fn should_simplify(&self, source_info: &SourceInfo, rvalue: &Rvalue<'tcx>) -> bool {
|
||||
self.should_simplify_custom(source_info, "Rvalue", rvalue)
|
||||
}
|
||||
|
||||
fn should_simplify_custom(
|
||||
&self,
|
||||
source_info: &SourceInfo,
|
||||
label: &str,
|
||||
value: impl std::fmt::Debug,
|
||||
) -> bool {
|
||||
self.tcx.consider_optimizing(|| {
|
||||
format!("InstSimplify - Rvalue: {rvalue:?} SourceInfo: {source_info:?}")
|
||||
format!("InstSimplify - {label}: {value:?} SourceInfo: {source_info:?}")
|
||||
})
|
||||
}
|
||||
|
||||
|
@ -147,6 +157,30 @@ impl<'tcx> InstSimplifyContext<'tcx, '_> {
|
|||
}
|
||||
}
|
||||
|
||||
/// Transform "Aggregate(RawPtr, \[p, ()\])" ==> "Cast(PtrToPtr, p)".
|
||||
fn simplify_ptr_aggregate(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) {
|
||||
if let Rvalue::Aggregate(box AggregateKind::RawPtr(pointee_ty, mutability), fields) = rvalue
|
||||
{
|
||||
let meta_ty = fields.raw[1].ty(self.local_decls, self.tcx);
|
||||
if meta_ty.is_unit() {
|
||||
// The mutable borrows we're holding prevent printing `rvalue` here
|
||||
if !self.should_simplify_custom(
|
||||
source_info,
|
||||
"Aggregate::RawPtr",
|
||||
(&pointee_ty, *mutability, &fields),
|
||||
) {
|
||||
return;
|
||||
}
|
||||
|
||||
let mut fields = std::mem::take(fields);
|
||||
let _meta = fields.pop().unwrap();
|
||||
let data = fields.pop().unwrap();
|
||||
let ptr_ty = Ty::new_ptr(self.tcx, *pointee_ty, *mutability);
|
||||
*rvalue = Rvalue::Cast(CastKind::PtrToPtr, data, ptr_ty);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn simplify_ub_check(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) {
|
||||
if let Rvalue::NullaryOp(NullOp::UbChecks, _) = *rvalue {
|
||||
let const_ = Const::from_bool(self.tcx, self.tcx.sess.ub_checks());
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue