about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2011-08-04 16:13:25 -0700
committerPatrick Walton <pcwalton@mimiga.net>2011-08-04 16:14:28 -0700
commitae3312002a87d673ae97a9e75455060fcd111069 (patch)
tree6f19db4fa5bb6b6f813f83d4f09ad61d27558161 /src
parente0985c10606d0b38be66734bf1a34bad70eec064 (diff)
downloadrust-ae3312002a87d673ae97a9e75455060fcd111069.tar.gz
rust-ae3312002a87d673ae97a9e75455060fcd111069.zip
rustc: Use memmove in copy_ty. 45% LLVM codegen speed improvement.
Diffstat (limited to 'src')
-rw-r--r--src/comp/middle/trans.rs9
1 files changed, 7 insertions, 2 deletions
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index d68d116790f..0793d390d57 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -2380,7 +2380,7 @@ fn call_memmove(cx: &@block_ctxt, dst: ValueRef, src: ValueRef,
     let src_ptr = cx.build.PointerCast(src, T_ptr(T_i8()));
     let dst_ptr = cx.build.PointerCast(dst, T_ptr(T_i8()));
     let size = cx.build.IntCast(n_bytes, T_i32());
-    let align = C_int(0);
+    let align = C_int(1);
     let volatile = C_bool(false);
     ret rslt(cx,
              cx.build.Call(memmove,
@@ -2411,7 +2411,12 @@ fn memmove_ty(cx: &@block_ctxt, dst: ValueRef, src: ValueRef, t: &ty::t) ->
     if ty::type_has_dynamic_size(bcx_tcx(cx), t) {
         let llsz = size_of(cx, t);
         ret call_memmove(llsz.bcx, dst, src, llsz.val);
-    } else { ret rslt(cx, cx.build.Store(cx.build.Load(src), dst)); }
+    } else if ty::type_is_structural(bcx_tcx(cx), t) {
+        let llsz = llsize_of(type_of(bcx_ccx(cx), cx.sp, t));
+        ret call_memmove(cx, dst, src, llsz);
+    } else {
+        ret rslt(cx, cx.build.Store(cx.build.Load(src), dst));
+    }
 }
 
 // Duplicates any heap-owned memory owned by a value of the given type.