about summary refs log tree commit diff
diff options
context:
space:
mode:
authorbors <bors@rust-lang.org>2013-07-12 07:43:38 -0700
committerbors <bors@rust-lang.org>2013-07-12 07:43:38 -0700
commit96b3163c835eb3821e23deefb57c86d80324a54a (patch)
treebe7a8c27009bba0517a8391eac22a2fae0ea41d0
parentad708139fefe4710f002c549ba8bbb11af16f267 (diff)
parent7e972772890ec0d28d2aa4e7ff5c7b004e5463e8 (diff)
downloadrust-96b3163c835eb3821e23deefb57c86d80324a54a.tar.gz
rust-96b3163c835eb3821e23deefb57c86d80324a54a.zip
auto merge of #7717 : dotdash/rust/transmute, r=pcwalton
Currently, immediate values are copied into an alloca only to have an
addressable storage so that it can be used with memcpy. Obviously we
can skip the memcpy in this case.
-rw-r--r--src/librustc/middle/trans/foreign.rs25
1 files changed, 11 insertions, 14 deletions
diff --git a/src/librustc/middle/trans/foreign.rs b/src/librustc/middle/trans/foreign.rs
index bdae2220598..9019cd72ff8 100644
--- a/src/librustc/middle/trans/foreign.rs
+++ b/src/librustc/middle/trans/foreign.rs
@@ -725,24 +725,21 @@ pub fn trans_intrinsic(ccx: @mut CrateContext,
             }
 
             if !ty::type_is_nil(out_type) {
-                // NB: Do not use a Load and Store here. This causes massive
-                // code bloat when `transmute` is used on large structural
-                // types.
                 let lldestptr = fcx.llretptr.get();
-                let lldestptr = PointerCast(bcx, lldestptr, Type::i8p());
-
                 let llsrcval = get_param(decl, first_real_arg);
-                let llsrcptr = if ty::type_is_immediate(ccx.tcx, in_type) {
-                    let llsrcptr = alloca(bcx, llintype, "__llsrcptr");
-                    Store(bcx, llsrcval, llsrcptr);
-                    llsrcptr
+                if ty::type_is_immediate(ccx.tcx, in_type) {
+                    let lldestptr = PointerCast(bcx, lldestptr, llintype.ptr_to());
+                    Store(bcx, llsrcval, lldestptr);
                 } else {
-                    llsrcval
+                    // NB: Do not use a Load and Store here. This causes massive
+                    // code bloat when `transmute` is used on large structural
+                    // types.
+                    let lldestptr = PointerCast(bcx, lldestptr, Type::i8p());
+                    let llsrcptr = PointerCast(bcx, llsrcval, Type::i8p());
+
+                    let llsize = llsize_of(ccx, llintype);
+                    call_memcpy(bcx, lldestptr, llsrcptr, llsize, 1);
                 };
-                let llsrcptr = PointerCast(bcx, llsrcptr, Type::i8p());
-
-                let llsize = llsize_of(ccx, llintype);
-                call_memcpy(bcx, lldestptr, llsrcptr, llsize, 1);
             }
         }
         "needs_drop" => {