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 {
|
||||
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.
|
||||
@ -252,6 +245,19 @@ fn visit_place(&mut self, place: &Place<'tcx>, ctxt: PlaceContext, loc: Location
|
||||
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))]
|
||||
|
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