about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBjörn Steinbrink <bsteinbr@gmail.com>2013-07-18 20:45:01 +0200
committerBjörn Steinbrink <bsteinbr@gmail.com>2013-07-21 15:54:42 +0200
commit3cccdbd9ccccd8768caea7cdf03e88a4f26ea301 (patch)
treef6a2bb3b3cad0e5d282223c95b942f15575a7d05 /src
parentd4051178976aa0527ede20e6c053f72b3d4dc20c (diff)
downloadrust-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.rs29
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
 }