From 7e972772890ec0d28d2aa4e7ff5c7b004e5463e8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B6rn=20Steinbrink?= Date: Thu, 11 Jul 2013 18:44:40 +0200 Subject: [PATCH] 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. --- src/librustc/middle/trans/foreign.rs | 25 +++++++++++-------------- 1 file 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 - }; - let llsrcptr = PointerCast(bcx, llsrcptr, Type::i8p()); + // 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 llsize = llsize_of(ccx, llintype); + call_memcpy(bcx, lldestptr, llsrcptr, llsize, 1); + }; } } "needs_drop" => {