Skip to content

Commit

Permalink
Rollup merge of #111432 - cjgillot:issue-111426, r=oli-obk
Browse files Browse the repository at this point in the history
Use visit_assign to detect SSA locals.

I screwed up the logic in 3c43b61.

Fixes #111426
  • Loading branch information
matthiaskrgr committed May 11, 2023
2 parents 3b7c02b + 6ad0497 commit 968911d
Show file tree
Hide file tree
Showing 3 changed files with 44 additions and 7 deletions.
20 changes: 13 additions & 7 deletions compiler/rustc_mir_transform/src/ssa.rs
Original file line number Diff line number Diff line change
Expand Up @@ -209,13 +209,6 @@ impl<'tcx> Visitor<'tcx> for SsaVisitor {
match ctxt {
PlaceContext::MutatingUse(MutatingUseContext::Projection)
| PlaceContext::NonMutatingUse(NonMutatingUseContext::Projection) => bug!(),
PlaceContext::MutatingUse(MutatingUseContext::Store) => {
self.assignments[local].insert(LocationExtended::Plain(loc));
if let Set1::One(_) = self.assignments[local] {
// Only record if SSA-like, to avoid growing the vector needlessly.
self.assignment_order.push(local);
}
}
// Anything can happen with raw pointers, so remove them.
// We do not verify that all uses of the borrow dominate the assignment to `local`,
// so we have to remove them too.
Expand Down Expand Up @@ -252,6 +245,19 @@ impl<'tcx> Visitor<'tcx> for SsaVisitor {
self.visit_local(place.local, ctxt, loc);
}
}

fn visit_assign(&mut self, place: &Place<'tcx>, rvalue: &Rvalue<'tcx>, loc: Location) {
if let Some(local) = place.as_local() {
self.assignments[local].insert(LocationExtended::Plain(loc));
if let Set1::One(_) = self.assignments[local] {
// Only record if SSA-like, to avoid growing the vector needlessly.
self.assignment_order.push(local);
}
} else {
self.visit_place(place, PlaceContext::MutatingUse(MutatingUseContext::Store), loc);
}
self.visit_rvalue(rvalue, loc);
}
}

#[instrument(level = "trace", skip(ssa, body))]
Expand Down
13 changes: 13 additions & 0 deletions tests/mir-opt/copy-prop/partial_init.main.CopyProp.diff
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
- // MIR for `main` before CopyProp
+ // MIR for `main` after CopyProp

fn main() -> () {
let mut _0: (); // return place in scope 0 at $DIR/partial_init.rs:+0:15: +0:15
let mut _1: (isize,); // in scope 0 at $SRC_DIR/core/src/intrinsics/mir.rs:LL:COL

bb0: {
(_1.0: isize) = const 1_isize; // scope 0 at $DIR/partial_init.rs:+4:13: +4:20
return; // scope 0 at $DIR/partial_init.rs:+5:13: +5:21
}
}

18 changes: 18 additions & 0 deletions tests/mir-opt/copy-prop/partial_init.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
// unit-test: CopyProp
// Verify that we do not ICE on partial initializations.

#![feature(custom_mir, core_intrinsics)]
extern crate core;
use core::intrinsics::mir::*;

// EMIT_MIR partial_init.main.CopyProp.diff
#[custom_mir(dialect = "runtime", phase = "post-cleanup")]
pub fn main() {
mir! (
let x: (isize, );
{
x.0 = 1;
Return()
}
)
}

0 comments on commit 968911d

Please sign in to comment.