From db8f2d590385786c176b5f7d9e887814d31db9ad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Thu, 4 Sep 2014 13:36:39 +0200 Subject: [PATCH] Avoid unnecessary codegen in with_cond() Currently "k / 2" generates one (k: uint) or two (k: int) "br false, ..." instructions and the corresponding basic blocks, producing quite some noise and making the code unnecessarily hard to read. Additionally we can skip translation if the code would end up unreachable anyway. --- src/librustc_trans/trans/_match.rs | 6 ++++-- src/librustc_trans/trans/base.rs | 6 ++++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/librustc_trans/trans/_match.rs b/src/librustc_trans/trans/_match.rs index 52fe8797592..6d9c157985f 100644 --- a/src/librustc_trans/trans/_match.rs +++ b/src/librustc_trans/trans/_match.rs @@ -889,11 +889,13 @@ fn compile_guard<'a, 'p, 'blk, 'tcx>(bcx: Block<'blk, 'tcx>, } } + for (_, &binding_info) in &data.bindings_map { + bcx.fcx.lllocals.borrow_mut().remove(&binding_info.id); + } + with_cond(bcx, Not(bcx, val, guard_expr.debug_loc()), |bcx| { - // Guard does not match: remove all bindings from the lllocals table for (_, &binding_info) in &data.bindings_map { call_lifetime_end(bcx, binding_info.llmatch); - bcx.fcx.lllocals.borrow_mut().remove(&binding_info.id); } match chk { // If the default arm is the only one left, move on to the next diff --git a/src/librustc_trans/trans/base.rs b/src/librustc_trans/trans/base.rs index 6901eb25b31..1c43daf35bf 100644 --- a/src/librustc_trans/trans/base.rs +++ b/src/librustc_trans/trans/base.rs @@ -1079,6 +1079,12 @@ pub fn with_cond<'blk, 'tcx, F>(bcx: Block<'blk, 'tcx>, F: FnOnce(Block<'blk, 'tcx>) -> Block<'blk, 'tcx>, { let _icx = push_ctxt("with_cond"); + + if bcx.unreachable.get() || + (common::is_const(val) && common::const_to_uint(val) == 0) { + return bcx; + } + let fcx = bcx.fcx; let next_cx = fcx.new_temp_block("next"); let cond_cx = fcx.new_temp_block("cond");