diff options
| author | Patrick Walton <pcwalton@mimiga.net> | 2011-08-04 16:13:25 -0700 |
|---|---|---|
| committer | Patrick Walton <pcwalton@mimiga.net> | 2011-08-04 16:14:28 -0700 |
| commit | ae3312002a87d673ae97a9e75455060fcd111069 (patch) | |
| tree | 6f19db4fa5bb6b6f813f83d4f09ad61d27558161 /src | |
| parent | e0985c10606d0b38be66734bf1a34bad70eec064 (diff) | |
| download | rust-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.rs | 9 |
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. |
