From 62be878ed1715650f080c3b113a85f73e7af0973 Mon Sep 17 00:00:00 2001 From: Patrick Walton Date: Sun, 26 Aug 2012 11:25:53 -0700 Subject: [PATCH] rustc: Use memmove in unsafe::reinterpret_cast (issue #3025). This was causing a bunch of structural copies, which when inlined was leading to enormous register pressure. Often this is seen in code which makes use of result::unwrap. --- src/rustc/middle/trans/foreign.rs | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/src/rustc/middle/trans/foreign.rs b/src/rustc/middle/trans/foreign.rs index 5cbdae9c0764..d7cc5e9139af 100644 --- a/src/rustc/middle/trans/foreign.rs +++ b/src/rustc/middle/trans/foreign.rs @@ -937,9 +937,12 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item, ty_to_str(ccx.tcx, substs.tys[1]), out_sz)); } if !ty::type_is_nil(substs.tys[1]) { - let cast = PointerCast(bcx, get_param(decl, first_real_arg), - T_ptr(llout_ty)); - Store(bcx, Load(bcx, cast), fcx.llretptr); + // NB: Do not use a Load and Store here. This causes massive code + // bloat when reinterpret_cast is used on large structural types. + let llretptr = PointerCast(bcx, fcx.llretptr, T_ptr(T_i8())); + let llcast = get_param(decl, first_real_arg); + let llcast = PointerCast(bcx, llcast, T_ptr(T_i8())); + call_memmove(bcx, llretptr, llcast, llsize_of(ccx, lltp_ty)); } } ~"addr_of" => {