Skip to content

Commit 2bf6663

Browse files
committed
librustc: Fastisel dislikes memmove, switch to memcpy. Perf win, r=catamorphism.
Fastisel actually has a special case for memcpy, the intrinsic, by name. It has no such special case for memmove, so bails. Close #3987.
1 parent 8b309e5 commit 2bf6663

File tree

5 files changed

+27
-27
lines changed

5 files changed

+27
-27
lines changed

src/librustc/middle/trans/base.rs

+21-21
Original file line numberDiff line numberDiff line change
@@ -1275,33 +1275,33 @@ fn with_cond(bcx: block, val: ValueRef, f: fn(block) -> block) -> block {
12751275
next_cx
12761276
}
12771277

1278-
fn call_memmove(cx: block, dst: ValueRef, src: ValueRef,
1278+
fn call_memcpy(cx: block, dst: ValueRef, src: ValueRef,
12791279
n_bytes: ValueRef) {
12801280
// FIXME (Related to #1645, I think?): Provide LLVM with better
12811281
// alignment information when the alignment is statically known (it must
12821282
// be nothing more than a constant int, or LLVM complains -- not even a
12831283
// constant element of a tydesc works).
1284-
let _icx = cx.insn_ctxt("call_memmove");
1284+
let _icx = cx.insn_ctxt("call_memcpy");
12851285
let ccx = cx.ccx();
12861286
let key = match ccx.sess.targ_cfg.arch {
1287-
session::arch_x86 | session::arch_arm => ~"llvm.memmove.p0i8.p0i8.i32",
1288-
session::arch_x86_64 => ~"llvm.memmove.p0i8.p0i8.i64"
1287+
session::arch_x86 | session::arch_arm => ~"llvm.memcpy.p0i8.p0i8.i32",
1288+
session::arch_x86_64 => ~"llvm.memcpy.p0i8.p0i8.i64"
12891289
};
1290-
let memmove = ccx.intrinsics.get(key);
1290+
let memcpy = ccx.intrinsics.get(key);
12911291
let src_ptr = PointerCast(cx, src, T_ptr(T_i8()));
12921292
let dst_ptr = PointerCast(cx, dst, T_ptr(T_i8()));
12931293
let size = IntCast(cx, n_bytes, ccx.int_type);
12941294
let align = C_i32(1i32);
12951295
let volatile = C_bool(false);
1296-
Call(cx, memmove, ~[dst_ptr, src_ptr, size, align, volatile]);
1296+
Call(cx, memcpy, ~[dst_ptr, src_ptr, size, align, volatile]);
12971297
}
12981298

1299-
fn memmove_ty(bcx: block, dst: ValueRef, src: ValueRef, t: ty::t) {
1300-
let _icx = bcx.insn_ctxt("memmove_ty");
1299+
fn memcpy_ty(bcx: block, dst: ValueRef, src: ValueRef, t: ty::t) {
1300+
let _icx = bcx.insn_ctxt("memcpy_ty");
13011301
let ccx = bcx.ccx();
13021302
if ty::type_is_structural(t) {
13031303
let llsz = llsize_of(ccx, type_of::type_of(ccx, t));
1304-
call_memmove(bcx, dst, src, llsz);
1304+
call_memcpy(bcx, dst, src, llsz);
13051305
} else {
13061306
Store(bcx, Load(bcx, src), dst);
13071307
}
@@ -1711,7 +1711,7 @@ fn trans_enum_variant(ccx: @crate_ctxt,
17111711
_ => fail ~"trans_enum_variant: how do we know this works?",
17121712
};
17131713
let arg_ty = arg_tys[i].ty;
1714-
memmove_ty(bcx, lldestptr, llarg, arg_ty);
1714+
memcpy_ty(bcx, lldestptr, llarg, arg_ty);
17151715
}
17161716
build_return(bcx);
17171717
finish_fn(fcx, lltop);
@@ -1757,7 +1757,7 @@ fn trans_tuple_struct(ccx: @crate_ctxt,
17571757
}
17581758
};
17591759
let arg_ty = arg_tys[i].ty;
1760-
memmove_ty(bcx, lldestptr, llarg, arg_ty);
1760+
memcpy_ty(bcx, lldestptr, llarg, arg_ty);
17611761
}
17621762

17631763
build_return(bcx);
@@ -2333,9 +2333,9 @@ fn p2i(ccx: @crate_ctxt, v: ValueRef) -> ValueRef {
23332333
}
23342334

23352335
fn declare_intrinsics(llmod: ModuleRef) -> HashMap<~str, ValueRef> {
2336-
let T_memmove32_args: ~[TypeRef] =
2336+
let T_memcpy32_args: ~[TypeRef] =
23372337
~[T_ptr(T_i8()), T_ptr(T_i8()), T_i32(), T_i32(), T_i1()];
2338-
let T_memmove64_args: ~[TypeRef] =
2338+
let T_memcpy64_args: ~[TypeRef] =
23392339
~[T_ptr(T_i8()), T_ptr(T_i8()), T_i64(), T_i32(), T_i1()];
23402340
let T_memset32_args: ~[TypeRef] =
23412341
~[T_ptr(T_i8()), T_i8(), T_i32(), T_i32(), T_i1()];
@@ -2351,12 +2351,12 @@ fn declare_intrinsics(llmod: ModuleRef) -> HashMap<~str, ValueRef> {
23512351
decl_cdecl_fn(llmod, ~"llvm.gcread",
23522352
T_fn(~[T_ptr(T_i8()), T_ptr(T_ptr(T_i8()))],
23532353
T_void()));
2354-
let memmove32 =
2355-
decl_cdecl_fn(llmod, ~"llvm.memmove.p0i8.p0i8.i32",
2356-
T_fn(T_memmove32_args, T_void()));
2357-
let memmove64 =
2358-
decl_cdecl_fn(llmod, ~"llvm.memmove.p0i8.p0i8.i64",
2359-
T_fn(T_memmove64_args, T_void()));
2354+
let memcpy32 =
2355+
decl_cdecl_fn(llmod, ~"llvm.memcpy.p0i8.p0i8.i32",
2356+
T_fn(T_memcpy32_args, T_void()));
2357+
let memcpy64 =
2358+
decl_cdecl_fn(llmod, ~"llvm.memcpy.p0i8.p0i8.i64",
2359+
T_fn(T_memcpy64_args, T_void()));
23602360
let memset32 =
23612361
decl_cdecl_fn(llmod, ~"llvm.memset.p0i8.i32",
23622362
T_fn(T_memset32_args, T_void()));
@@ -2371,8 +2371,8 @@ fn declare_intrinsics(llmod: ModuleRef) -> HashMap<~str, ValueRef> {
23712371
let intrinsics = HashMap();
23722372
intrinsics.insert(~"llvm.gcroot", gcroot);
23732373
intrinsics.insert(~"llvm.gcread", gcread);
2374-
intrinsics.insert(~"llvm.memmove.p0i8.p0i8.i32", memmove32);
2375-
intrinsics.insert(~"llvm.memmove.p0i8.p0i8.i64", memmove64);
2374+
intrinsics.insert(~"llvm.memcpy.p0i8.p0i8.i32", memcpy32);
2375+
intrinsics.insert(~"llvm.memcpy.p0i8.p0i8.i64", memcpy64);
23762376
intrinsics.insert(~"llvm.memset.p0i8.i32", memset32);
23772377
intrinsics.insert(~"llvm.memset.p0i8.i64", memset64);
23782378
intrinsics.insert(~"llvm.trap", trap);

src/librustc/middle/trans/closure.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -485,7 +485,7 @@ fn make_opaque_cbox_take_glue(
485485
let bcx = callee::trans_rtcall(bcx, malloc, ~[opaque_tydesc, sz],
486486
expr::SaveIn(rval));
487487
let cbox_out = PointerCast(bcx, Load(bcx, rval), llopaquecboxty);
488-
call_memmove(bcx, cbox_out, cbox_in, sz);
488+
call_memcpy(bcx, cbox_out, cbox_in, sz);
489489
Store(bcx, cbox_out, cboxptr);
490490

491491
// Take the (deeply cloned) type descriptor

src/librustc/middle/trans/datum.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ impl Datum {
326326
Store(bcx, self.val, dst);
327327
}
328328
ByRef => {
329-
memmove_ty(bcx, dst, self.val, self.ty);
329+
memcpy_ty(bcx, dst, self.val, self.ty);
330330
}
331331
}
332332

@@ -353,7 +353,7 @@ impl Datum {
353353

354354
match self.mode {
355355
ByRef => {
356-
glue::memmove_ty(bcx, dst, self.val, self.ty);
356+
glue::memcpy_ty(bcx, dst, self.val, self.ty);
357357
}
358358
ByValue => {
359359
Store(bcx, self.val, dst);

src/librustc/middle/trans/foreign.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,7 @@ fn trans_intrinsic(ccx: @crate_ctxt, decl: ValueRef, item: @ast::foreign_item,
971971
let llretptr = PointerCast(bcx, fcx.llretptr, T_ptr(T_i8()));
972972
let llcast = get_param(decl, first_real_arg);
973973
let llcast = PointerCast(bcx, llcast, T_ptr(T_i8()));
974-
call_memmove(bcx, llretptr, llcast, llsize_of(ccx, lltp_ty));
974+
call_memcpy(bcx, llretptr, llcast, llsize_of(ccx, lltp_ty));
975975
}
976976
}
977977
~"addr_of" => {

src/librustc/middle/trans/tvec.rs

+2-2
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ fn duplicate_uniq(bcx: block, vptr: ValueRef, vec_ty: ty::t) -> Result {
9999

100100
let data_ptr = get_dataptr(bcx, get_bodyptr(bcx, vptr));
101101
let new_data_ptr = get_dataptr(bcx, get_bodyptr(bcx, newptr));
102-
base::call_memmove(bcx, new_data_ptr, data_ptr, fill);
102+
base::call_memcpy(bcx, new_data_ptr, data_ptr, fill);
103103

104104
let bcx = if ty::type_needs_drop(bcx.tcx(), unit_ty) {
105105
iter_vec_raw(bcx, new_data_ptr, vec_ty, fill, glue::take_ty)
@@ -309,7 +309,7 @@ fn write_content(bcx: block,
309309
let bytes = s.len() + 1; // copy null-terminator too
310310
let llbytes = C_uint(bcx.ccx(), bytes);
311311
let llcstr = C_cstr(bcx.ccx(), *s);
312-
base::call_memmove(bcx, lldest, llcstr, llbytes);
312+
base::call_memcpy(bcx, lldest, llcstr, llbytes);
313313
return bcx;
314314
}
315315
}

0 commit comments

Comments
 (0)