Use visit_assign to detect SSA locals.
This commit is contained in:
parent
cba14074bb
commit
6ad0497cc0
@ -209,13 +209,6 @@ fn visit_local(&mut self, local: Local, ctxt: PlaceContext, loc: Location) {
|
|||||||
match ctxt {
|
match ctxt {
|
||||||
PlaceContext::MutatingUse(MutatingUseContext::Projection)
|
PlaceContext::MutatingUse(MutatingUseContext::Projection)
|
||||||
| PlaceContext::NonMutatingUse(NonMutatingUseContext::Projection) => bug!(),
|
| 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.
|
// Anything can happen with raw pointers, so remove them.
|
||||||
// We do not verify that all uses of the borrow dominate the assignment to `local`,
|
// We do not verify that all uses of the borrow dominate the assignment to `local`,
|
||||||
// so we have to remove them too.
|
// so we have to remove them too.
|
||||||
@ -252,6 +245,19 @@ fn visit_place(&mut self, place: &Place<'tcx>, ctxt: PlaceContext, loc: Location
|
|||||||
self.visit_local(place.local, ctxt, loc);
|
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))]
|
#[instrument(level = "trace", skip(ssa, body))]
|
||||||
|
13
tests/mir-opt/copy-prop/partial_init.main.CopyProp.diff
Normal file
13
tests/mir-opt/copy-prop/partial_init.main.CopyProp.diff
Normal file
@ -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
tests/mir-opt/copy-prop/partial_init.rs
Normal file
18
tests/mir-opt/copy-prop/partial_init.rs
Normal file
@ -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()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user