Add additional flooding when assigning a value and corresponding test
This commit is contained in:
parent
bb1639769e
commit
292869493c
3 changed files with 66 additions and 1 deletions
|
@ -339,7 +339,9 @@ impl<V: Clone + HasTop> State<V> {
|
|||
pub fn assign_idx(&mut self, target: PlaceIndex, result: ValueOrPlace<V>, map: &Map) {
|
||||
match result {
|
||||
ValueOrPlace::Value(value) => {
|
||||
// FIXME: What if not all tracked projections are overwritten? Can this happen?
|
||||
// First flood the target place in case we also track any projections (although
|
||||
// this scenario is currently not well-supported with the ValueOrPlace interface).
|
||||
self.flood_idx(target, map, V::top());
|
||||
if let Some(value_index) = map.places[target].value_index {
|
||||
self.0[value_index] = value;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,53 @@
|
|||
- // MIR for `main` before DataflowConstProp
|
||||
+ // MIR for `main` after DataflowConstProp
|
||||
|
||||
fn main() -> () {
|
||||
let mut _0: (); // return place in scope 0 at $DIR/static_ref.rs:+0:11: +0:11
|
||||
let _1: usize; // in scope 0 at $DIR/static_ref.rs:+2:9: +2:10
|
||||
let mut _3: &usize; // in scope 0 at $DIR/static_ref.rs:+4:9: +4:11
|
||||
let _4: &usize; // in scope 0 at $DIR/static_ref.rs:+4:9: +4:11
|
||||
let _5: &usize; // in scope 0 at $DIR/static_ref.rs:+4:10: +4:11
|
||||
scope 1 {
|
||||
debug x => _1; // in scope 1 at $DIR/static_ref.rs:+2:9: +2:10
|
||||
let mut _2: &usize; // in scope 1 at $DIR/static_ref.rs:+3:9: +3:14
|
||||
scope 2 {
|
||||
debug r => _2; // in scope 2 at $DIR/static_ref.rs:+3:9: +3:14
|
||||
let _6: usize; // in scope 2 at $DIR/static_ref.rs:+5:9: +5:10
|
||||
scope 3 {
|
||||
debug y => _6; // in scope 3 at $DIR/static_ref.rs:+5:9: +5:10
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bb0: {
|
||||
StorageLive(_1); // scope 0 at $DIR/static_ref.rs:+2:9: +2:10
|
||||
_1 = const 0_usize; // scope 0 at $DIR/static_ref.rs:+2:13: +2:14
|
||||
StorageLive(_2); // scope 1 at $DIR/static_ref.rs:+3:9: +3:14
|
||||
_2 = &_1; // scope 1 at $DIR/static_ref.rs:+3:17: +3:19
|
||||
StorageLive(_3); // scope 2 at $DIR/static_ref.rs:+4:9: +4:11
|
||||
StorageLive(_4); // scope 2 at $DIR/static_ref.rs:+4:9: +4:11
|
||||
StorageLive(_5); // scope 2 at $DIR/static_ref.rs:+4:10: +4:11
|
||||
_5 = const {alloc1: &usize}; // scope 2 at $DIR/static_ref.rs:+4:10: +4:11
|
||||
// mir::Constant
|
||||
// + span: $DIR/static_ref.rs:8:10: 8:11
|
||||
// + literal: Const { ty: &usize, val: Value(Scalar(alloc1)) }
|
||||
_4 = &(*_5); // scope 2 at $DIR/static_ref.rs:+4:9: +4:11
|
||||
_3 = &(*_4); // scope 2 at $DIR/static_ref.rs:+4:9: +4:11
|
||||
_2 = move _3; // scope 2 at $DIR/static_ref.rs:+4:5: +4:11
|
||||
StorageDead(_3); // scope 2 at $DIR/static_ref.rs:+4:10: +4:11
|
||||
StorageDead(_5); // scope 2 at $DIR/static_ref.rs:+4:11: +4:12
|
||||
StorageDead(_4); // scope 2 at $DIR/static_ref.rs:+4:11: +4:12
|
||||
StorageLive(_6); // scope 2 at $DIR/static_ref.rs:+5:9: +5:10
|
||||
_6 = (*_2); // scope 2 at $DIR/static_ref.rs:+5:13: +5:15
|
||||
_0 = const (); // scope 0 at $DIR/static_ref.rs:+0:11: +6:2
|
||||
StorageDead(_6); // scope 2 at $DIR/static_ref.rs:+6:1: +6:2
|
||||
StorageDead(_2); // scope 1 at $DIR/static_ref.rs:+6:1: +6:2
|
||||
StorageDead(_1); // scope 0 at $DIR/static_ref.rs:+6:1: +6:2
|
||||
return; // scope 0 at $DIR/static_ref.rs:+6:2: +6:2
|
||||
}
|
||||
}
|
||||
|
||||
alloc1 (static: P, size: 8, align: 8) {
|
||||
05 00 00 00 00 00 00 00 │ ........
|
||||
}
|
||||
|
10
src/test/mir-opt/dataflow-const-prop/static_ref.rs
Normal file
10
src/test/mir-opt/dataflow-const-prop/static_ref.rs
Normal file
|
@ -0,0 +1,10 @@
|
|||
// unit-test: DataflowConstProp
|
||||
|
||||
// EMIT_MIR static_ref.main.DataflowConstProp.diff
|
||||
fn main() {
|
||||
static P: usize = 5;
|
||||
let x = 0;
|
||||
let mut r = &x;
|
||||
r = &P;
|
||||
let y = *r;
|
||||
}
|
Loading…
Add table
Reference in a new issue