Skip to content

Commit ef1dd41

Browse files
committed
Perf: avoid cloning state
1 parent c099099 commit ef1dd41

File tree

1 file changed

+6
-4
lines changed

1 file changed

+6
-4
lines changed

compiler/rustc_mir/src/transform/unneeded_deref.rs

+6-4
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,17 @@ struct UnneededDerefVisitor<'a, 'tcx> {
5151
refs: FxHashMap<Local, Place<'tcx>>,
5252
optimizations: &'a mut FxHashMap<(Location, Place<'tcx>), Place<'tcx>>,
5353
results: &'a Results<'tcx, AvailableLocals>,
54-
state: Option<Dual<BitSet<LocalWithLocationIndex>>>,
54+
state: *const Dual<BitSet<LocalWithLocationIndex>>,
5555
}
5656

5757
impl<'a, 'tcx> Visitor<'tcx> for UnneededDerefVisitor<'a, 'tcx> {
5858
fn visit_place(&mut self, place: &Place<'tcx>, context: PlaceContext, location: Location) {
5959
let analysis = &self.results.analysis;
6060
let _: Option<_> = try {
6161
debug!("Visiting place {:?}", place);
62-
let state = self.state.as_ref()?;
62+
// SAFETY: We only use self.state here which is always called from statement_before_primary_effect,
63+
// which guarantees that self.state is still alive.
64+
let state = unsafe{self.state.as_ref().unwrap()};
6365

6466
match place.as_ref() {
6567
PlaceRef { projection: [ProjectionElem::Deref], .. } => {
@@ -112,7 +114,7 @@ impl<'a, 'tcx> UnneededDerefVisitor<'a, 'tcx> {
112114
refs,
113115
optimizations: &mut optimizations,
114116
results: &results,
115-
state: None,
117+
state: std::ptr::null(),
116118
};
117119

118120
results.visit_reachable_with(body, &mut _self);
@@ -129,7 +131,7 @@ impl<'a, 'tcx> ResultsVisitor<'a, 'tcx> for UnneededDerefVisitor<'a, 'tcx> {
129131
stmt: &'mir Statement<'tcx>,
130132
location: Location,
131133
) {
132-
self.state = Some(state.clone());
134+
self.state = state;
133135
let analysis = &self.results.analysis;
134136
debug!("state: {:?} before statement {:?}", analysis.debug_state(state), stmt);
135137
let _: Option<_> = try {

0 commit comments

Comments
 (0)