about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorBjörn Steinbrink <bsteinbr@gmail.com>2013-07-11 18:44:40 +0200
committerBjörn Steinbrink <bsteinbr@gmail.com>2013-07-11 18:46:05 +0200
commit7e972772890ec0d28d2aa4e7ff5c7b004e5463e8 (patch)
treee5bc81493720ad60a3086f74c9c4b5991ce00c29 /src
parente95fcfafc7a2349217096bc1ed8b8c273b6a0e2b (diff)
downloadrust-7e972772890ec0d28d2aa4e7ff5c7b004e5463e8.tar.gz
rust-7e972772890ec0d28d2aa4e7ff5c7b004e5463e8.zip
transmute: Avoid double copy for immediate values
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.
Diffstat (limited to 'src')
-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" => {