Add partial propagation test.

This commit is contained in:
Camille GILLOT 2023-01-29 12:50:27 +00:00
parent 10ec94930b
commit 83173c68f5
5 changed files with 162 additions and 20 deletions

View file

@ -0,0 +1,55 @@
- // MIR for `foo` before ConstProp
+ // MIR for `foo` after ConstProp
fn foo(_1: u8) -> () {
debug x => _1; // in scope 0 at $DIR/aggregate.rs:+0:8: +0:9
let mut _0: (); // return place in scope 0 at $DIR/aggregate.rs:+0:15: +0:15
let _2: i32; // in scope 0 at $DIR/aggregate.rs:+2:9: +2:14
let mut _3: i32; // in scope 0 at $DIR/aggregate.rs:+2:17: +2:25
let mut _4: (i32, u8); // in scope 0 at $DIR/aggregate.rs:+2:17: +2:23
let mut _5: u8; // in scope 0 at $DIR/aggregate.rs:+2:21: +2:22
let mut _7: i32; // in scope 0 at $DIR/aggregate.rs:+3:18: +3:26
let mut _8: (u8, i32); // in scope 0 at $DIR/aggregate.rs:+3:18: +3:24
let mut _9: u8; // in scope 0 at $DIR/aggregate.rs:+3:19: +3:20
scope 1 {
debug first => _2; // in scope 1 at $DIR/aggregate.rs:+2:9: +2:14
let _6: i32; // in scope 1 at $DIR/aggregate.rs:+3:9: +3:15
scope 2 {
debug second => _6; // in scope 2 at $DIR/aggregate.rs:+3:9: +3:15
}
}
bb0: {
StorageLive(_2); // scope 0 at $DIR/aggregate.rs:+2:9: +2:14
StorageLive(_3); // scope 0 at $DIR/aggregate.rs:+2:17: +2:25
StorageLive(_4); // scope 0 at $DIR/aggregate.rs:+2:17: +2:23
StorageLive(_5); // scope 0 at $DIR/aggregate.rs:+2:21: +2:22
_5 = _1; // scope 0 at $DIR/aggregate.rs:+2:21: +2:22
_4 = (const 0_i32, move _5); // scope 0 at $DIR/aggregate.rs:+2:17: +2:23
StorageDead(_5); // scope 0 at $DIR/aggregate.rs:+2:22: +2:23
- _3 = (_4.0: i32); // scope 0 at $DIR/aggregate.rs:+2:17: +2:25
- _2 = Add(move _3, const 1_i32); // scope 0 at $DIR/aggregate.rs:+2:17: +2:29
+ _3 = const 0_i32; // scope 0 at $DIR/aggregate.rs:+2:17: +2:25
+ _2 = const 1_i32; // scope 0 at $DIR/aggregate.rs:+2:17: +2:29
StorageDead(_3); // scope 0 at $DIR/aggregate.rs:+2:28: +2:29
StorageDead(_4); // scope 0 at $DIR/aggregate.rs:+2:29: +2:30
StorageLive(_6); // scope 1 at $DIR/aggregate.rs:+3:9: +3:15
StorageLive(_7); // scope 1 at $DIR/aggregate.rs:+3:18: +3:26
StorageLive(_8); // scope 1 at $DIR/aggregate.rs:+3:18: +3:24
StorageLive(_9); // scope 1 at $DIR/aggregate.rs:+3:19: +3:20
_9 = _1; // scope 1 at $DIR/aggregate.rs:+3:19: +3:20
_8 = (move _9, const 1_i32); // scope 1 at $DIR/aggregate.rs:+3:18: +3:24
StorageDead(_9); // scope 1 at $DIR/aggregate.rs:+3:23: +3:24
- _7 = (_8.1: i32); // scope 1 at $DIR/aggregate.rs:+3:18: +3:26
- _6 = Add(move _7, const 2_i32); // scope 1 at $DIR/aggregate.rs:+3:18: +3:30
+ _7 = const 1_i32; // scope 1 at $DIR/aggregate.rs:+3:18: +3:26
+ _6 = const 3_i32; // scope 1 at $DIR/aggregate.rs:+3:18: +3:30
StorageDead(_7); // scope 1 at $DIR/aggregate.rs:+3:29: +3:30
StorageDead(_8); // scope 1 at $DIR/aggregate.rs:+3:30: +3:31
_0 = const (); // scope 0 at $DIR/aggregate.rs:+0:15: +4:2
StorageDead(_6); // scope 1 at $DIR/aggregate.rs:+4:1: +4:2
StorageDead(_2); // scope 0 at $DIR/aggregate.rs:+4:1: +4:2
return; // scope 0 at $DIR/aggregate.rs:+4:2: +4:2
}
}

View file

@ -0,0 +1,49 @@
// MIR for `foo` after PreCodegen
fn foo(_1: u8) -> () {
debug x => _1; // in scope 0 at $DIR/aggregate.rs:+0:8: +0:9
let mut _0: (); // return place in scope 0 at $DIR/aggregate.rs:+0:15: +0:15
let _2: i32; // in scope 0 at $DIR/aggregate.rs:+2:9: +2:14
let mut _3: i32; // in scope 0 at $DIR/aggregate.rs:+2:17: +2:25
let mut _4: (i32, u8); // in scope 0 at $DIR/aggregate.rs:+2:17: +2:23
let mut _5: u8; // in scope 0 at $DIR/aggregate.rs:+2:21: +2:22
let mut _7: i32; // in scope 0 at $DIR/aggregate.rs:+3:18: +3:26
let mut _8: (u8, i32); // in scope 0 at $DIR/aggregate.rs:+3:18: +3:24
let mut _9: u8; // in scope 0 at $DIR/aggregate.rs:+3:19: +3:20
scope 1 {
debug first => _2; // in scope 1 at $DIR/aggregate.rs:+2:9: +2:14
let _6: i32; // in scope 1 at $DIR/aggregate.rs:+3:9: +3:15
scope 2 {
debug second => _6; // in scope 2 at $DIR/aggregate.rs:+3:9: +3:15
}
}
bb0: {
StorageLive(_2); // scope 0 at $DIR/aggregate.rs:+2:9: +2:14
StorageLive(_3); // scope 0 at $DIR/aggregate.rs:+2:17: +2:25
StorageLive(_4); // scope 0 at $DIR/aggregate.rs:+2:17: +2:23
StorageLive(_5); // scope 0 at $DIR/aggregate.rs:+2:21: +2:22
_5 = _1; // scope 0 at $DIR/aggregate.rs:+2:21: +2:22
_4 = (const 0_i32, move _5); // scope 0 at $DIR/aggregate.rs:+2:17: +2:23
StorageDead(_5); // scope 0 at $DIR/aggregate.rs:+2:22: +2:23
_3 = const 0_i32; // scope 0 at $DIR/aggregate.rs:+2:17: +2:25
_2 = const 1_i32; // scope 0 at $DIR/aggregate.rs:+2:17: +2:29
StorageDead(_3); // scope 0 at $DIR/aggregate.rs:+2:28: +2:29
StorageDead(_4); // scope 0 at $DIR/aggregate.rs:+2:29: +2:30
StorageLive(_6); // scope 1 at $DIR/aggregate.rs:+3:9: +3:15
StorageLive(_7); // scope 1 at $DIR/aggregate.rs:+3:18: +3:26
StorageLive(_8); // scope 1 at $DIR/aggregate.rs:+3:18: +3:24
StorageLive(_9); // scope 1 at $DIR/aggregate.rs:+3:19: +3:20
_9 = _1; // scope 1 at $DIR/aggregate.rs:+3:19: +3:20
_8 = (move _9, const 1_i32); // scope 1 at $DIR/aggregate.rs:+3:18: +3:24
StorageDead(_9); // scope 1 at $DIR/aggregate.rs:+3:23: +3:24
_7 = const 1_i32; // scope 1 at $DIR/aggregate.rs:+3:18: +3:26
_6 = const 3_i32; // scope 1 at $DIR/aggregate.rs:+3:18: +3:30
StorageDead(_7); // scope 1 at $DIR/aggregate.rs:+3:29: +3:30
StorageDead(_8); // scope 1 at $DIR/aggregate.rs:+3:30: +3:31
_0 = const (); // scope 0 at $DIR/aggregate.rs:+0:15: +4:2
StorageDead(_6); // scope 1 at $DIR/aggregate.rs:+4:1: +4:2
StorageDead(_2); // scope 0 at $DIR/aggregate.rs:+4:1: +4:2
return; // scope 0 at $DIR/aggregate.rs:+4:2: +4:2
}
}

View file

@ -3,9 +3,11 @@
fn main() -> () {
let mut _0: (); // return place in scope 0 at $DIR/aggregate.rs:+0:11: +0:11
let _1: i32; // in scope 0 at $DIR/aggregate.rs:+1:9: +1:10
let mut _2: i32; // in scope 0 at $DIR/aggregate.rs:+1:13: +1:24
let mut _3: (i32, i32, i32); // in scope 0 at $DIR/aggregate.rs:+1:13: +1:22
let _1: u8; // in scope 0 at $DIR/aggregate.rs:+1:9: +1:10
let mut _2: u8; // in scope 0 at $DIR/aggregate.rs:+1:13: +1:24
let mut _3: (i32, u8, i32); // in scope 0 at $DIR/aggregate.rs:+1:13: +1:22
let _4: (); // in scope 0 at $DIR/aggregate.rs:+2:5: +2:11
let mut _5: u8; // in scope 0 at $DIR/aggregate.rs:+2:9: +2:10
scope 1 {
debug x => _1; // in scope 1 at $DIR/aggregate.rs:+1:9: +1:10
}
@ -14,16 +16,29 @@
StorageLive(_1); // scope 0 at $DIR/aggregate.rs:+1:9: +1:10
StorageLive(_2); // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
StorageLive(_3); // scope 0 at $DIR/aggregate.rs:+1:13: +1:22
_3 = (const 0_i32, const 1_i32, const 2_i32); // scope 0 at $DIR/aggregate.rs:+1:13: +1:22
- _2 = (_3.1: i32); // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
- _1 = Add(move _2, const 0_i32); // scope 0 at $DIR/aggregate.rs:+1:13: +1:28
+ _2 = const 1_i32; // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
+ _1 = const 1_i32; // scope 0 at $DIR/aggregate.rs:+1:13: +1:28
_3 = (const 0_i32, const 1_u8, const 2_i32); // scope 0 at $DIR/aggregate.rs:+1:13: +1:22
- _2 = (_3.1: u8); // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
- _1 = Add(move _2, const 0_u8); // scope 0 at $DIR/aggregate.rs:+1:13: +1:28
+ _2 = const 1_u8; // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
+ _1 = const 1_u8; // scope 0 at $DIR/aggregate.rs:+1:13: +1:28
StorageDead(_2); // scope 0 at $DIR/aggregate.rs:+1:27: +1:28
StorageDead(_3); // scope 0 at $DIR/aggregate.rs:+1:28: +1:29
_0 = const (); // scope 0 at $DIR/aggregate.rs:+0:11: +2:2
StorageDead(_1); // scope 0 at $DIR/aggregate.rs:+2:1: +2:2
return; // scope 0 at $DIR/aggregate.rs:+2:2: +2:2
StorageLive(_4); // scope 1 at $DIR/aggregate.rs:+2:5: +2:11
StorageLive(_5); // scope 1 at $DIR/aggregate.rs:+2:9: +2:10
- _5 = _1; // scope 1 at $DIR/aggregate.rs:+2:9: +2:10
+ _5 = const 1_u8; // scope 1 at $DIR/aggregate.rs:+2:9: +2:10
_4 = foo(move _5) -> bb1; // scope 1 at $DIR/aggregate.rs:+2:5: +2:11
// mir::Constant
// + span: $DIR/aggregate.rs:8:5: 8:8
// + literal: Const { ty: fn(u8) {foo}, val: Value(<ZST>) }
}
bb1: {
StorageDead(_5); // scope 1 at $DIR/aggregate.rs:+2:10: +2:11
StorageDead(_4); // scope 1 at $DIR/aggregate.rs:+2:11: +2:12
_0 = const (); // scope 0 at $DIR/aggregate.rs:+0:11: +3:2
StorageDead(_1); // scope 0 at $DIR/aggregate.rs:+3:1: +3:2
return; // scope 0 at $DIR/aggregate.rs:+3:2: +3:2
}
}

View file

@ -2,9 +2,11 @@
fn main() -> () {
let mut _0: (); // return place in scope 0 at $DIR/aggregate.rs:+0:11: +0:11
let _1: i32; // in scope 0 at $DIR/aggregate.rs:+1:9: +1:10
let mut _2: i32; // in scope 0 at $DIR/aggregate.rs:+1:13: +1:24
let mut _3: (i32, i32, i32); // in scope 0 at $DIR/aggregate.rs:+1:13: +1:22
let _1: u8; // in scope 0 at $DIR/aggregate.rs:+1:9: +1:10
let mut _2: u8; // in scope 0 at $DIR/aggregate.rs:+1:13: +1:24
let mut _3: (i32, u8, i32); // in scope 0 at $DIR/aggregate.rs:+1:13: +1:22
let _4: (); // in scope 0 at $DIR/aggregate.rs:+2:5: +2:11
let mut _5: u8; // in scope 0 at $DIR/aggregate.rs:+2:9: +2:10
scope 1 {
debug x => _1; // in scope 1 at $DIR/aggregate.rs:+1:9: +1:10
}
@ -13,13 +15,25 @@ fn main() -> () {
StorageLive(_1); // scope 0 at $DIR/aggregate.rs:+1:9: +1:10
StorageLive(_2); // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
StorageLive(_3); // scope 0 at $DIR/aggregate.rs:+1:13: +1:22
_3 = (const 0_i32, const 1_i32, const 2_i32); // scope 0 at $DIR/aggregate.rs:+1:13: +1:22
_2 = const 1_i32; // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
_1 = const 1_i32; // scope 0 at $DIR/aggregate.rs:+1:13: +1:28
_3 = (const 0_i32, const 1_u8, const 2_i32); // scope 0 at $DIR/aggregate.rs:+1:13: +1:22
_2 = const 1_u8; // scope 0 at $DIR/aggregate.rs:+1:13: +1:24
_1 = const 1_u8; // scope 0 at $DIR/aggregate.rs:+1:13: +1:28
StorageDead(_2); // scope 0 at $DIR/aggregate.rs:+1:27: +1:28
StorageDead(_3); // scope 0 at $DIR/aggregate.rs:+1:28: +1:29
_0 = const (); // scope 0 at $DIR/aggregate.rs:+0:11: +2:2
StorageDead(_1); // scope 0 at $DIR/aggregate.rs:+2:1: +2:2
return; // scope 0 at $DIR/aggregate.rs:+2:2: +2:2
StorageLive(_4); // scope 1 at $DIR/aggregate.rs:+2:5: +2:11
StorageLive(_5); // scope 1 at $DIR/aggregate.rs:+2:9: +2:10
_5 = const 1_u8; // scope 1 at $DIR/aggregate.rs:+2:9: +2:10
_4 = foo(move _5) -> bb1; // scope 1 at $DIR/aggregate.rs:+2:5: +2:11
// mir::Constant
// + span: $DIR/aggregate.rs:8:5: 8:8
// + literal: Const { ty: fn(u8) {foo}, val: Value(<ZST>) }
}
bb1: {
StorageDead(_5); // scope 1 at $DIR/aggregate.rs:+2:10: +2:11
StorageDead(_4); // scope 1 at $DIR/aggregate.rs:+2:11: +2:12
_0 = const (); // scope 0 at $DIR/aggregate.rs:+0:11: +3:2
StorageDead(_1); // scope 0 at $DIR/aggregate.rs:+3:1: +3:2
return; // scope 0 at $DIR/aggregate.rs:+3:2: +3:2
}
}

View file

@ -5,4 +5,13 @@
// EMIT_MIR aggregate.main.PreCodegen.after.mir
fn main() {
let x = (0, 1, 2).1 + 0;
foo(x);
}
// EMIT_MIR aggregate.foo.ConstProp.diff
// EMIT_MIR aggregate.foo.PreCodegen.after.mir
fn foo(x: u8) {
// Verify that we still propagate if part of the aggregate is not known.
let first = (0, x).0 + 1;
let second = (x, 1).1 + 2;
}