diff options
| author | Manish Goregaokar <manishsmail@gmail.com> | 2019-05-16 12:31:46 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2019-05-16 12:31:46 -0700 |
| commit | e7f27947cf03501865827b9066d3522e5dc613a6 (patch) | |
| tree | 2259b26bf3a8aca61047e29ccdffb1768a609e00 /src/test | |
| parent | 2ae06976e47f06bcf0b9d50fe2603add1204bf26 (diff) | |
| parent | b17066dd5eaf3dabd403bd4caccfca193c7184db (diff) | |
| download | rust-e7f27947cf03501865827b9066d3522e5dc613a6.tar.gz rust-e7f27947cf03501865827b9066d3522e5dc613a6.zip | |
Rollup merge of #60597 - wesleywiser:const_prop, r=oli-obk
Do some simple constant propagation in the ConstProp pass r? @oli-obk I added a few test cases. Let me know if you think there should be more.
Diffstat (limited to 'src/test')
| -rw-r--r-- | src/test/mir-opt/const_prop/array_index.rs | 33 | ||||
| -rw-r--r-- | src/test/mir-opt/const_prop/checked_add.rs | 21 | ||||
| -rw-r--r-- | src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs | 34 | ||||
| -rw-r--r-- | src/test/mir-opt/const_prop/slice_len.rs | 37 |
4 files changed, 125 insertions, 0 deletions
diff --git a/src/test/mir-opt/const_prop/array_index.rs b/src/test/mir-opt/const_prop/array_index.rs new file mode 100644 index 00000000000..4b97af68ff0 --- /dev/null +++ b/src/test/mir-opt/const_prop/array_index.rs @@ -0,0 +1,33 @@ +fn main() { + let x: u32 = [0, 1, 2, 3][2]; +} + +// END RUST SOURCE +// START rustc.main.ConstProp.before.mir +// bb0: { +// ... +// _2 = [const 0u32, const 1u32, const 2u32, const 3u32]; +// ... +// _3 = const 2usize; +// _4 = const 4usize; +// _5 = Lt(_3, _4); +// assert(move _5, "index out of bounds: the len is move _4 but the index is _3") -> bb1; +// } +// bb1: { +// _1 = _2[_3]; +// ... +// return; +// } +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// bb0: { +// ... +// _5 = const true; +// assert(move _5, "index out of bounds: the len is move _4 but the index is _3") -> bb1; +// } +// bb1: { +// _1 = _2[_3]; +// ... +// return; +// } +// END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/checked_add.rs b/src/test/mir-opt/const_prop/checked_add.rs new file mode 100644 index 00000000000..0718316307c --- /dev/null +++ b/src/test/mir-opt/const_prop/checked_add.rs @@ -0,0 +1,21 @@ +// compile-flags: -C overflow-checks=on + +fn main() { + let x: u32 = 1 + 1; +} + +// END RUST SOURCE +// START rustc.main.ConstProp.before.mir +// bb0: { +// ... +// _2 = CheckedAdd(const 1u32, const 1u32); +// assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1; +// } +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// bb0: { +// ... +// _2 = (const 2u32, const false); +// assert(!move (_2.1: bool), "attempt to add with overflow") -> bb1; +// } +// END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs b/src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs new file mode 100644 index 00000000000..97d3abdcc6c --- /dev/null +++ b/src/test/mir-opt/const_prop/const_prop_fails_gracefully.rs @@ -0,0 +1,34 @@ +#[inline(never)] +fn read(_: usize) { } + +fn main() { + const FOO: &i32 = &1; + let x = FOO as *const i32 as usize; + read(x); +} + +// END RUST SOURCE +// START rustc.main.ConstProp.before.mir +// bb0: { +// ... +// _3 = _4; +// _2 = move _3 as *const i32 (Misc); +// ... +// _1 = move _2 as usize (Misc); +// ... +// _6 = _1; +// _5 = const read(move _6) -> bb1; +// } +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// bb0: { +// ... +// _3 = _4; +// _2 = move _3 as *const i32 (Misc); +// ... +// _1 = move _2 as usize (Misc); +// ... +// _6 = _1; +// _5 = const read(move _6) -> bb1; +// } +// END rustc.main.ConstProp.after.mir diff --git a/src/test/mir-opt/const_prop/slice_len.rs b/src/test/mir-opt/const_prop/slice_len.rs new file mode 100644 index 00000000000..3435ca07f4c --- /dev/null +++ b/src/test/mir-opt/const_prop/slice_len.rs @@ -0,0 +1,37 @@ +fn test() -> &'static [u32] { + &[1, 2] +} + +fn main() { + let x = test()[0]; +} + +// END RUST SOURCE +// START rustc.main.ConstProp.before.mir +// bb1: { +// ... +// _3 = const 0usize; +// _4 = Len((*_2)); +// _5 = Lt(_3, _4); +// assert(move _5, "index out of bounds: the len is move _4 but the index is _3") -> bb2; +// } +// bb2: { +// _1 = (*_2)[_3]; +// ... +// return; +// } +// END rustc.main.ConstProp.before.mir +// START rustc.main.ConstProp.after.mir +// bb0: { +// ... +// _3 = const 0usize; +// _4 = Len((*_2)); +// _5 = Lt(_3, _4); +// assert(move _5, "index out of bounds: the len is move _4 but the index is _3") -> bb2; +// } +// bb2: { +// _1 = (*_2)[_3]; +// ... +// return; +// } +// END rustc.main.ConstProp.after.mir |
