1
Fork 0

Auto merge of #87737 - LeSeulArtichaut:unsafeck-less-freeze, r=oli-obk

Only compute `is_freeze` for layout-constrained ADTs

Places are usually shallow and quick to visit. By contrast, computing `is_freeze` can be much costlier, involving inference and trait solving. Making sure to call `is_freeze` only when necessary should be beneficial for performance in most cases.

See [this comparison](https://perf.rust-lang.org/compare.html?start=81f08a4763e7537b92506fa5a597e6bf774d20cc&end=56a58d347b1c7dd0c2984b8fc3930c408e26fbc2&stat=instructions%3Au) from #87710.

r? `@oli-obk`
This commit is contained in:
bors 2021-08-05 14:45:09 +00:00
commit 61a941b8ba

View file

@ -456,27 +456,25 @@ impl<'a, 'tcx> Visitor<'a, 'tcx> for UnsafetyVisitor<'a, 'tcx> {
return; // we have already visited everything by now return; // we have already visited everything by now
} }
} }
ExprKind::Borrow { borrow_kind, arg } => match borrow_kind { ExprKind::Borrow { borrow_kind, arg } => {
BorrowKind::Shallow | BorrowKind::Shared | BorrowKind::Unique => { let mut visitor = LayoutConstrainedPlaceVisitor::new(self.thir, self.tcx);
if !self.thir[arg] visit::walk_expr(&mut visitor, expr);
.ty if visitor.found {
.is_freeze(self.tcx.at(self.thir[arg].span), self.param_env) match borrow_kind {
{ BorrowKind::Shallow | BorrowKind::Shared | BorrowKind::Unique
let mut visitor = LayoutConstrainedPlaceVisitor::new(self.thir, self.tcx); if !self.thir[arg]
visit::walk_expr(&mut visitor, expr); .ty
if visitor.found { .is_freeze(self.tcx.at(self.thir[arg].span), self.param_env) =>
self.requires_unsafe(expr.span, BorrowOfLayoutConstrainedField); {
self.requires_unsafe(expr.span, BorrowOfLayoutConstrainedField)
} }
BorrowKind::Mut { .. } => {
self.requires_unsafe(expr.span, MutationOfLayoutConstrainedField)
}
BorrowKind::Shallow | BorrowKind::Shared | BorrowKind::Unique => {}
} }
} }
BorrowKind::Mut { .. } => { }
let mut visitor = LayoutConstrainedPlaceVisitor::new(self.thir, self.tcx);
visit::walk_expr(&mut visitor, expr);
if visitor.found {
self.requires_unsafe(expr.span, MutationOfLayoutConstrainedField);
}
}
},
_ => {} _ => {}
} }
visit::walk_expr(self, expr); visit::walk_expr(self, expr);