1
Fork 0

[const-prop] Handle MIR Rvalue::Box

This commit is contained in:
Wesley Wiser 2019-09-15 12:03:52 -04:00
parent 4d89031e80
commit 2d22063e4c
2 changed files with 57 additions and 18 deletions

View file

@ -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);

View 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