Fix translation of semi-constant if-statements
Thanks @dotdash
This commit is contained in:
parent
27d2bd13c3
commit
3afd760bb3
@ -869,8 +869,7 @@ pub fn with_cond<'blk, 'tcx, F>(bcx: Block<'blk, 'tcx>,
|
||||
{
|
||||
let _icx = push_ctxt("with_cond");
|
||||
|
||||
if bcx.unreachable.get() ||
|
||||
(common::is_const(val) && common::const_to_uint(val) == 0) {
|
||||
if bcx.unreachable.get() || common::const_to_opt_uint(val) == Some(0) {
|
||||
return bcx;
|
||||
}
|
||||
|
||||
|
@ -919,12 +919,6 @@ pub fn const_get_elt(cx: &CrateContext, v: ValueRef, us: &[c_uint])
|
||||
}
|
||||
}
|
||||
|
||||
pub fn is_const(v: ValueRef) -> bool {
|
||||
unsafe {
|
||||
llvm::LLVMIsConstant(v) == True
|
||||
}
|
||||
}
|
||||
|
||||
pub fn const_to_int(v: ValueRef) -> i64 {
|
||||
unsafe {
|
||||
llvm::LLVMConstIntGetSExtValue(v)
|
||||
|
@ -166,31 +166,24 @@ pub fn trans_if<'blk, 'tcx>(bcx: Block<'blk, 'tcx>,
|
||||
let cond_val = unpack_result!(bcx, expr::trans(bcx, cond).to_llbool());
|
||||
|
||||
// Drop branches that are known to be impossible
|
||||
if is_const(cond_val) && !is_undef(cond_val) {
|
||||
if const_to_uint(cond_val) == 1 {
|
||||
match els {
|
||||
Some(elexpr) => {
|
||||
let mut trans = TransItemVisitor { ccx: bcx.fcx.ccx };
|
||||
trans.visit_expr(&*elexpr);
|
||||
}
|
||||
None => {}
|
||||
}
|
||||
if let Some(cv) = const_to_opt_uint(cond_val) {
|
||||
if cv == 1 {
|
||||
// if true { .. } [else { .. }]
|
||||
bcx = trans_block(bcx, &*thn, dest);
|
||||
trans::debuginfo::clear_source_location(bcx.fcx);
|
||||
|
||||
if let Some(elexpr) = els {
|
||||
let mut trans = TransItemVisitor { ccx: bcx.fcx.ccx };
|
||||
trans.visit_expr(&*elexpr);
|
||||
}
|
||||
} else {
|
||||
let mut trans = TransItemVisitor { ccx: bcx.fcx.ccx } ;
|
||||
// if false { .. } [else { .. }]
|
||||
let mut trans = TransItemVisitor { ccx: bcx.fcx.ccx };
|
||||
trans.visit_block(&*thn);
|
||||
|
||||
match els {
|
||||
// if false { .. } else { .. }
|
||||
Some(elexpr) => {
|
||||
bcx = expr::trans_into(bcx, &*elexpr, dest);
|
||||
trans::debuginfo::clear_source_location(bcx.fcx);
|
||||
}
|
||||
|
||||
// if false { .. }
|
||||
None => { }
|
||||
if let Some(elexpr) = els {
|
||||
bcx = expr::trans_into(bcx, &*elexpr, dest);
|
||||
trans::debuginfo::clear_source_location(bcx.fcx);
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user