[const-prop] Handle MIR Rvalue::Box
This commit is contained in:
parent
4d89031e80
commit
2d22063e4c
2 changed files with 57 additions and 18 deletions
|
@ -8,7 +8,7 @@ use rustc::hir::def::DefKind;
|
||||||
use rustc::hir::def_id::DefId;
|
use rustc::hir::def_id::DefId;
|
||||||
use rustc::mir::{
|
use rustc::mir::{
|
||||||
AggregateKind, Constant, Location, Place, PlaceBase, Body, Operand, Rvalue,
|
AggregateKind, Constant, Location, Place, PlaceBase, Body, Operand, Rvalue,
|
||||||
Local, NullOp, UnOp, StatementKind, Statement, LocalKind,
|
Local, UnOp, StatementKind, Statement, LocalKind,
|
||||||
TerminatorKind, Terminator, ClearCrossCrate, SourceInfo, BinOp,
|
TerminatorKind, Terminator, ClearCrossCrate, SourceInfo, BinOp,
|
||||||
SourceScope, SourceScopeLocalData, LocalDecl, BasicBlock,
|
SourceScope, SourceScopeLocalData, LocalDecl, BasicBlock,
|
||||||
};
|
};
|
||||||
|
@ -434,23 +434,6 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> {
|
||||||
) -> Option<Const<'tcx>> {
|
) -> Option<Const<'tcx>> {
|
||||||
let span = source_info.span;
|
let span = source_info.span;
|
||||||
|
|
||||||
// if this isn't a supported operation, then return None
|
|
||||||
match rvalue {
|
|
||||||
Rvalue::NullaryOp(NullOp::Box, _) => return None,
|
|
||||||
|
|
||||||
Rvalue::Use(_) |
|
|
||||||
Rvalue::Len(_) |
|
|
||||||
Rvalue::Repeat(..) |
|
|
||||||
Rvalue::Aggregate(..) |
|
|
||||||
Rvalue::Discriminant(..) |
|
|
||||||
Rvalue::Cast(..) |
|
|
||||||
Rvalue::NullaryOp(..) |
|
|
||||||
Rvalue::CheckedBinaryOp(..) |
|
|
||||||
Rvalue::Ref(..) |
|
|
||||||
Rvalue::UnaryOp(..) |
|
|
||||||
Rvalue::BinaryOp(..) => { }
|
|
||||||
}
|
|
||||||
|
|
||||||
// perform any special checking for specific Rvalue types
|
// perform any special checking for specific Rvalue types
|
||||||
if let Rvalue::UnaryOp(op, arg) = rvalue {
|
if let Rvalue::UnaryOp(op, arg) = rvalue {
|
||||||
trace!("checking UnaryOp(op = {:?}, arg = {:?})", op, arg);
|
trace!("checking UnaryOp(op = {:?}, arg = {:?})", op, arg);
|
||||||
|
|
56
src/test/mir-opt/const_prop/boxes.rs
Normal file
56
src/test/mir-opt/const_prop/boxes.rs
Normal file
|
@ -0,0 +1,56 @@
|
||||||
|
// compile-flags: -O
|
||||||
|
// ignore-emscripten compiled with panic=abort by default
|
||||||
|
// ignore-wasm32
|
||||||
|
// ignore-wasm64
|
||||||
|
|
||||||
|
#![feature(box_syntax)]
|
||||||
|
|
||||||
|
// Note: this test verifies that we, in fact, do not const prop `box`
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
let x = *(box 42) + 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
// END RUST SOURCE
|
||||||
|
// START rustc.main.ConstProp.before.mir
|
||||||
|
// bb0: {
|
||||||
|
// ...
|
||||||
|
// _4 = Box(i32);
|
||||||
|
// (*_4) = const 42i32;
|
||||||
|
// _3 = move _4;
|
||||||
|
// ...
|
||||||
|
// _2 = (*_3);
|
||||||
|
// _1 = Add(move _2, const 0i32);
|
||||||
|
// ...
|
||||||
|
// drop(_3) -> [return: bb2, unwind: bb1];
|
||||||
|
// }
|
||||||
|
// bb1 (cleanup): {
|
||||||
|
// resume;
|
||||||
|
// }
|
||||||
|
// bb2: {
|
||||||
|
// ...
|
||||||
|
// _0 = ();
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
// END rustc.main.ConstProp.before.mir
|
||||||
|
// START rustc.main.ConstProp.after.mir
|
||||||
|
// bb0: {
|
||||||
|
// ...
|
||||||
|
// _4 = Box(i32);
|
||||||
|
// (*_4) = const 42i32;
|
||||||
|
// _3 = move _4;
|
||||||
|
// ...
|
||||||
|
// _2 = (*_3);
|
||||||
|
// _1 = Add(move _2, const 0i32);
|
||||||
|
// ...
|
||||||
|
// drop(_3) -> [return: bb2, unwind: bb1];
|
||||||
|
// }
|
||||||
|
// bb1 (cleanup): {
|
||||||
|
// resume;
|
||||||
|
// }
|
||||||
|
// bb2: {
|
||||||
|
// ...
|
||||||
|
// _0 = ();
|
||||||
|
// ...
|
||||||
|
// }
|
||||||
|
// END rustc.main.ConstProp.after.mir
|
Loading…
Add table
Add a link
Reference in a new issue