From 6d3dd0e48cdb23c99be9d2d2b33dbfda08b35e30 Mon Sep 17 00:00:00 2001 From: Brian Anderson Date: Tue, 13 Sep 2011 16:40:18 -0700 Subject: Try harder still to generate fewer landing pads Scopes that don't have cleanups don't need their own landing pads This takes the optimized rustc bin from 4.7MB to 4.4 --- src/comp/middle/trans.rs | 20 +++++++++++++++++++- 1 file changed, 19 insertions(+), 1 deletion(-) (limited to 'src') diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs index 09967f9034a..a579b8fbefa 100644 --- a/src/comp/middle/trans.rs +++ b/src/comp/middle/trans.rs @@ -3738,7 +3738,7 @@ fn invoke_(bcx: @block_ctxt, llfn: ValueRef, } fn get_landing_pad(bcx: @block_ctxt) -> BasicBlockRef { - let scope_bcx = find_scope_cx(bcx); + let scope_bcx = find_scope_for_lpad(bcx); if scope_bcx.need_new_lpad { let unwind_bcx = new_sub_block_ctxt(bcx, "unwind"); let lpadbb = trans_landing_pad(unwind_bcx); @@ -3747,6 +3747,24 @@ fn get_landing_pad(bcx: @block_ctxt) -> BasicBlockRef { } assert option::is_some(scope_bcx.lpad); ret option::get(scope_bcx.lpad); + + fn find_scope_for_lpad(bcx: @block_ctxt) -> @block_ctxt { + let scope_bcx = bcx; + while true { + scope_bcx = find_scope_cx(scope_bcx); + if vec::is_not_empty(scope_bcx.cleanups) { + ret scope_bcx; + } else { + scope_bcx = alt scope_bcx.parent { + parent_some(b) { b } + parent_none. { + ret scope_bcx; + } + } + } + } + fail; + } } fn trans_landing_pad(bcx: @block_ctxt) -> BasicBlockRef { -- cgit 1.4.1-3-g733a5