summary refs log tree commit diff
path: root/src/comp
diff options
context:
space:
mode:
authorMarijn Haverbeke <marijnh@gmail.com>2011-09-09 15:34:13 +0200
committerMarijn Haverbeke <marijnh@gmail.com>2011-09-09 15:34:13 +0200
commit985ef59efd971f1d6b9bf4b5e484b75733e00444 (patch)
tree430f2d80af6f4bc4550ad8271f0fdbe01dd690ae /src/comp
parent0eb56e60d212fb53dcb2e0c7c33a4539b9203428 (diff)
downloadrust-985ef59efd971f1d6b9bf4b5e484b75733e00444.tar.gz
rust-985ef59efd971f1d6b9bf4b5e484b75733e00444.zip
Make for loops alias the vec elements, rather than copy them
The alias analysis was already assuming that it worked like this.
Diffstat (limited to 'src/comp')
-rw-r--r--src/comp/middle/trans.rs18
1 files changed, 6 insertions, 12 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index 0bc28ca617e..227590b60b2 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2478,19 +2478,13 @@ fn trans_for(cx: &@block_ctxt, local: &@ast::local, seq: &@ast::expr,
     fn inner(cx: &@block_ctxt, local: @ast::local, curr: ValueRef, t: ty::t,
              body: &ast::blk, outer_next_cx: @block_ctxt) -> @block_ctxt {
         let next_cx = new_sub_block_ctxt(cx, "next");
-        let scope_cx =
-            new_loop_scope_block_ctxt(cx,
-                                      option::some::<@block_ctxt>(next_cx),
-                                      outer_next_cx, "for loop scope");
-        Br(cx, scope_cx.llbb);
-        let {bcx, val: dst} = alloc_local(scope_cx, local);
-        let val = load_if_immediate(bcx, PointerCast(bcx, curr,
-                                                     val_ty(dst)), t);
-        let bcx = copy_val(bcx, INIT, dst, val, t);
-        add_clean(scope_cx, dst, t);
-        let bcx = trans_alt::bind_irrefutable_pat(bcx, local.node.pat, dst,
+        let bcx = new_loop_scope_block_ctxt(cx, option::some(next_cx),
+                                            outer_next_cx, "for loop scope");
+        Br(cx, bcx.llbb);
+        let val = PointerCast(bcx, curr, T_ptr(type_of_or_i8(cx, t)));
+        let bcx = trans_alt::bind_irrefutable_pat(bcx, local.node.pat, val,
                                                   cx.fcx.lllocals, false);
-        bcx = trans_block(bcx, body, return).bcx;
+        let bcx = trans_block(bcx, body, return).bcx;
         if !is_terminated(bcx) {
             Br(bcx, next_cx.llbb);
             // otherwise, this code is unreachable