[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