[llvm-commits] CVS: llvm/lib/CodeGen/IntrinsicLowering.cpp

Chris Lattner sabre at nondot.org
Tue Feb 6 11:06:54 PST 2007



Changes in directory llvm/lib/CodeGen:

IntrinsicLowering.cpp updated: 1.65 -> 1.66
---
Log message:

Two fixes:
1. Memset takes an i32 for the value to set, not i8.  This was causing GCC to
   ICE all over the place (PR1183: http://llvm.org/PR1183 ).
2. memcpy/memmove were not properly zext/trunc'ing the size in some cases.



---
Diffs of the changes:  (+33 -38)

 IntrinsicLowering.cpp |   71 +++++++++++++++++++++++---------------------------
 1 files changed, 33 insertions(+), 38 deletions(-)


Index: llvm/lib/CodeGen/IntrinsicLowering.cpp
diff -u llvm/lib/CodeGen/IntrinsicLowering.cpp:1.65 llvm/lib/CodeGen/IntrinsicLowering.cpp:1.66
--- llvm/lib/CodeGen/IntrinsicLowering.cpp:1.65	Tue Feb  6 00:07:51 2007
+++ llvm/lib/CodeGen/IntrinsicLowering.cpp	Tue Feb  6 13:06:38 2007
@@ -356,45 +356,29 @@
   case Intrinsic::dbg_declare:
     break;    // Simply strip out debugging intrinsics
 
-  case Intrinsic::memcpy_i32: {
-    static Constant *MemcpyFCache = 0;
-    Value * Size = cast<Value>(CI->op_end()-1);
-    if (Size->getType() != TD.getIntPtrType())
-      Size->replaceAllUsesWith(new ZExtInst(Size, TD.getIntPtrType()));
-    ReplaceCallWith("memcpy", CI, CI->op_begin()+1, CI->op_end()-1,
-                    (*(CI->op_begin()+1))->getType(), MemcpyFCache);
-    break;
-  }
+  case Intrinsic::memcpy_i32:
   case Intrinsic::memcpy_i64: {
     static Constant *MemcpyFCache = 0;
-    Value * Size = cast<Value>(CI->op_end()-1);
-    if (Size->getType() != TD.getIntPtrType())
-      Size->replaceAllUsesWith(new TruncInst(Size, TD.getIntPtrType()));
-    ReplaceCallWith("memcpy", CI, CI->op_begin()+1, CI->op_end()-1,
-                     (*(CI->op_begin()+1))->getType(), MemcpyFCache);
-    break;
-  }
-  case Intrinsic::memmove_i32: {
-    static Constant *MemmoveFCache = 0;
-    Value * Size = cast<Value>(CI->op_end()-1);
-    if (Size->getType() != TD.getIntPtrType())
-      Size->replaceAllUsesWith(new ZExtInst(Size, TD.getIntPtrType()));
-    ReplaceCallWith("memmove", CI, CI->op_begin()+1, CI->op_end()-1,
-                    (*(CI->op_begin()+1))->getType(), MemmoveFCache);
+    Value *Size = CI->getOperand(3);
+    const Type *IntPtr = TD.getIntPtrType();
+    if (Size->getType()->getPrimitiveSizeInBits() <
+        IntPtr->getPrimitiveSizeInBits())
+      Size = new ZExtInst(Size, IntPtr, "", CI);
+    else if (Size->getType()->getPrimitiveSizeInBits() >
+             IntPtr->getPrimitiveSizeInBits())
+      Size = new TruncInst(Size, IntPtr, "", CI);
+    Value *Ops[3];
+    Ops[0] = CI->getOperand(1);
+    Ops[1] = CI->getOperand(2);
+    Ops[2] = Size;
+    ReplaceCallWith("memcpy", CI, Ops, Ops+3, CI->getOperand(1)->getType(),
+                    MemcpyFCache);
     break;
   }
+  case Intrinsic::memmove_i32: 
   case Intrinsic::memmove_i64: {
     static Constant *MemmoveFCache = 0;
-    Value * Size = cast<Value>(CI->op_end()-1);
-    if (Size->getType() != TD.getIntPtrType())
-      Size->replaceAllUsesWith(new TruncInst(Size, TD.getIntPtrType()));
-    ReplaceCallWith("memmove", CI, CI->op_begin()+1, CI->op_end()-1,
-                    (*(CI->op_begin()+1))->getType(), MemmoveFCache);
-    break;
-  }
-  case Intrinsic::memset_i32: {
-    static Constant *MemsetFCache = 0;
-    Value *Size = cast<Value>(CI->op_end()-1);
+    Value *Size = CI->getOperand(3);
     const Type *IntPtr = TD.getIntPtrType();
     if (Size->getType()->getPrimitiveSizeInBits() <
         IntPtr->getPrimitiveSizeInBits())
@@ -402,12 +386,18 @@
     else if (Size->getType()->getPrimitiveSizeInBits() >
              IntPtr->getPrimitiveSizeInBits())
       Size = new TruncInst(Size, IntPtr, "", CI);
-    ReplaceCallWith("memset", CI, CI->op_begin()+1, CI->op_end()-1,
-                    (*(CI->op_begin()+1))->getType(), MemsetFCache);
+    Value *Ops[3];
+    Ops[0] = CI->getOperand(1);
+    Ops[1] = CI->getOperand(2);
+    Ops[2] = Size;
+    ReplaceCallWith("memmove", CI, Ops, Ops+3, CI->getOperand(1)->getType(),
+                    MemmoveFCache);
+    break;
   }
+  case Intrinsic::memset_i32:
   case Intrinsic::memset_i64: {
     static Constant *MemsetFCache = 0;
-    Value *Size = cast<Value>(CI->op_end()-1);
+    Value *Size = CI->getOperand(3);
     const Type *IntPtr = TD.getIntPtrType();
     if (Size->getType()->getPrimitiveSizeInBits() <
         IntPtr->getPrimitiveSizeInBits())
@@ -415,8 +405,13 @@
     else if (Size->getType()->getPrimitiveSizeInBits() >
              IntPtr->getPrimitiveSizeInBits())
       Size = new TruncInst(Size, IntPtr, "", CI);
-    ReplaceCallWith("memset", CI, CI->op_begin()+1, CI->op_end()-1,
-                    (*(CI->op_begin()+1))->getType(), MemsetFCache);
+    Value *Ops[3];
+    Ops[0] = CI->getOperand(1);
+    // Extend the amount to i32.
+    Ops[1] = new ZExtInst(CI->getOperand(2), Type::Int32Ty, "", CI);
+    Ops[2] = Size;
+    ReplaceCallWith("memset", CI, Ops, Ops+3, CI->getOperand(1)->getType(),
+                    MemsetFCache);
     break;
   }
   case Intrinsic::sqrt_f32: {






More information about the llvm-commits mailing list