Skip to content

Commit

Permalink
Fix translation of semi-constant if-statements
Browse files Browse the repository at this point in the history
Thanks @dotdash
  • Loading branch information
arielb1 committed May 19, 2015
1 parent 27d2bd1 commit 3afd760
Show file tree
Hide file tree
Showing 3 changed files with 13 additions and 27 deletions.
3 changes: 1 addition & 2 deletions src/librustc_trans/trans/base.rs
Expand Up @@ -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;
}

Expand Down
6 changes: 0 additions & 6 deletions src/librustc_trans/trans/common.rs
Expand Up @@ -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)
Expand Down
31 changes: 12 additions & 19 deletions src/librustc_trans/trans/controlflow.rs
Expand Up @@ -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);
}
}

Expand Down

0 comments on commit 3afd760

Please sign in to comment.