diff options
| author | Björn Steinbrink <bsteinbr@gmail.com> | 2013-07-18 20:45:01 +0200 |
|---|---|---|
| committer | Björn Steinbrink <bsteinbr@gmail.com> | 2013-07-21 15:54:42 +0200 |
| commit | 3cccdbd9ccccd8768caea7cdf03e88a4f26ea301 (patch) | |
| tree | f6a2bb3b3cad0e5d282223c95b942f15575a7d05 /src | |
| parent | d4051178976aa0527ede20e6c053f72b3d4dc20c (diff) | |
| download | rust-3cccdbd9ccccd8768caea7cdf03e88a4f26ea301.tar.gz rust-3cccdbd9ccccd8768caea7cdf03e88a4f26ea301.zip | |
Remove an unnecessary block/jump from the drop glue for @-pointer
The nested with_cond calls each introduce a "next" block, with the inner one just jumping to the outer one.
Diffstat (limited to 'src')
| -rw-r--r-- | src/librustc/middle/trans/glue.rs | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/src/librustc/middle/trans/glue.rs b/src/librustc/middle/trans/glue.rs index ffe6d22d581..4a2072364e9 100644 --- a/src/librustc/middle/trans/glue.rs +++ b/src/librustc/middle/trans/glue.rs @@ -546,18 +546,23 @@ pub fn decr_refcnt_maybe_free(bcx: block, box_ptr: ValueRef, let _icx = push_ctxt("decr_refcnt_maybe_free"); let ccx = bcx.ccx(); - do with_cond(bcx, IsNotNull(bcx, box_ptr)) |bcx| { - let rc_ptr = GEPi(bcx, box_ptr, [0u, abi::box_field_refcnt]); - let rc = Sub(bcx, Load(bcx, rc_ptr), C_int(ccx, 1)); - Store(bcx, rc, rc_ptr); - let zero_test = ICmp(bcx, lib::llvm::IntEQ, C_int(ccx, 0), rc); - do with_cond(bcx, zero_test) |bcx| { - match box_ptr_ptr { - Some(p) => free_ty(bcx, p, t), - None => free_ty_immediate(bcx, box_ptr, t) - } - } - } + let decr_bcx = sub_block(bcx, "decr"); + let free_bcx = sub_block(decr_bcx, "free"); + let next_bcx = sub_block(bcx, "next"); + CondBr(bcx, IsNotNull(bcx, box_ptr), decr_bcx.llbb, next_bcx.llbb); + + let rc_ptr = GEPi(decr_bcx, box_ptr, [0u, abi::box_field_refcnt]); + let rc = Sub(decr_bcx, Load(decr_bcx, rc_ptr), C_int(ccx, 1)); + Store(decr_bcx, rc, rc_ptr); + CondBr(decr_bcx, IsNull(decr_bcx, rc), free_bcx.llbb, next_bcx.llbb); + + let free_bcx = match box_ptr_ptr { + Some(p) => free_ty(free_bcx, p, t), + None => free_ty_immediate(free_bcx, box_ptr, t) + }; + Br(free_bcx, next_bcx.llbb); + + next_bcx } |
