[llvm-commits] CVS: gcc-3.4/gcc/llvm-expand.c
Chris Lattner
lattner at cs.uiuc.edu
Fri Feb 27 23:07:01 PST 2004
Changes in directory gcc-3.4/gcc:
llvm-expand.c updated: 1.15 -> 1.16
---
Log message:
turn builtin_memmove -> llvm.memmove
---
Diffs of the changes: (+41 -10)
Index: gcc-3.4/gcc/llvm-expand.c
diff -u gcc-3.4/gcc/llvm-expand.c:1.15 gcc-3.4/gcc/llvm-expand.c:1.16
--- gcc-3.4/gcc/llvm-expand.c:1.15 Fri Feb 27 01:07:56 2004
+++ gcc-3.4/gcc/llvm-expand.c Fri Feb 27 23:06:31 2004
@@ -322,14 +322,16 @@
}
}
-static void EmitMemcpy(llvm_function *Fn, llvm_value *DestPtr,
- llvm_value *SrcPtr, llvm_value *Size,
- unsigned Alignment) {
- static llvm_function *llvm_memcpy_fn = 0;
+// EmitMemCpyMove - Emit a call to llvm.memcpy or llvm.memmove (depending on
+// whether the isMove flag is set).
+static void EmitMemCpyMove(llvm_function *Fn, llvm_value *DestPtr,
+ llvm_value *SrcPtr, llvm_value *Size,
+ unsigned Alignment, int isMove) {
+ static llvm_function *llvm_memcpy_fn = 0, *llvm_memmove_fn = 0;
static llvm_type *size_tTy = 0;
llvm_instruction *I;
- if (!llvm_memcpy_fn) {
+ if (!isMove && !llvm_memcpy_fn) {
llvm_type *FnTy = llvm_type_create_function(4, VoidTy);
FnTy->Elements[1] = FnTy->Elements[2] = VoidPtrTy;
FnTy->Elements[3] = size_tTy = llvm_type_get_from_tree(size_type_node);
@@ -337,9 +339,18 @@
FnTy = llvm_type_get_cannonical_function(FnTy);
llvm_memcpy_fn = CreateIntrinsicFnWithType("llvm.memcpy", FnTy);
}
+
+ if (isMove && !llvm_memmove_fn) {
+ llvm_type *FnTy = llvm_type_create_function(4, VoidTy);
+ FnTy->Elements[1] = FnTy->Elements[2] = VoidPtrTy;
+ FnTy->Elements[3] = size_tTy = llvm_type_get_from_tree(size_type_node);
+ FnTy->Elements[4] = UIntTy;
+ FnTy = llvm_type_get_cannonical_function(FnTy);
+ llvm_memmove_fn = CreateIntrinsicFnWithType("llvm.memmove", FnTy);
+ }
I = llvm_instruction_new(VoidTy, "", O_Call, 5);
- I->Operands[0] = G2V(llvm_memcpy_fn);
+ I->Operands[0] = G2V(isMove ? llvm_memmove_fn : llvm_memcpy_fn);
I->Operands[1] = cast_if_type_not_equal(Fn, DestPtr, VoidPtrTy);
I->Operands[2] = cast_if_type_not_equal(Fn, SrcPtr, VoidPtrTy);
I->Operands[3] = cast_if_type_not_equal(Fn, Size, size_tTy);
@@ -404,9 +415,9 @@
/* If this is a large object copy, emit a call to the llvm.memcpy intrinsic.
*/
if (llvm_type_get_size(ObjTy) > 128) {
- EmitMemcpy(Fn, DestPtr, SrcPtr,
- llvm_constant_new_integral(LongTy, llvm_type_get_size(ObjTy)),
- Alignment);
+ EmitMemCpyMove(Fn, DestPtr, SrcPtr,
+ llvm_constant_new_integral(LongTy,llvm_type_get_size(ObjTy)),
+ Alignment, 0);
return;
}
@@ -4030,11 +4041,25 @@
arglist = TREE_CHAIN(arglist);
Op2 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0);
- EmitMemcpy(Fn, Op0, Op1, Op2, 1);
+ EmitMemCpyMove(Fn, Op0, Op1, Op2, 1, 0);
+ return Op0;
+}
+
+static llvm_value *llvm_expand_builtin_memmove(llvm_function *Fn, tree arglist){
+ llvm_value *Op0, *Op1, *Op2;
+
+ Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0);
+ arglist = TREE_CHAIN(arglist);
+ Op1 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0);
+ arglist = TREE_CHAIN(arglist);
+ Op2 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0);
+
+ EmitMemCpyMove(Fn, Op0, Op1, Op2, 1, 1);
return Op0;
}
+
static void llvm_expand_builtin_va_start(llvm_function *Fn, tree exp) {
tree arglist = TREE_OPERAND (exp, 1);
@@ -4292,6 +4317,12 @@
case BUILT_IN_MEMCPY:
assert(DestLoc == 0 && "memcpy doesn't return aggregate!");
return llvm_expand_builtin_memcpy(Fn, arglist);
+
+ case BUILT_IN_MEMMOVE:
+ assert(DestLoc == 0 && "memmove doesn't return aggregate!");
+ return llvm_expand_builtin_memmove(Fn, arglist);
+ break;
+
case BUILT_IN_BZERO: {
llvm_value *Op0 = llvm_expand_expr(Fn, TREE_VALUE(arglist), 0);
More information about the llvm-commits
mailing list