[llvm-commits] CVS: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp

Reid Spencer reid at x10sys.com
Tue Apr 26 12:56:08 PDT 2005



Changes in directory llvm/lib/Transforms/IPO:

SimplifyLibCalls.cpp updated: 1.8 -> 1.9
---
Log message:

Fix some bugs found by running on llvm-test:
* MemCpyOptimization can only be optimized if the 3rd and 4th arguments are
  constants and we weren't checking for that.
* The result of llvm.memcpy (and llvm.memmove) is void* not sbyte*, put in
  a cast.


---
Diffs of the changes:  (+17 -9)

 SimplifyLibCalls.cpp |   26 +++++++++++++++++---------
 1 files changed, 17 insertions(+), 9 deletions(-)


Index: llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp
diff -u llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.8 llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.9
--- llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp:1.8	Tue Apr 26 14:13:17 2005
+++ llvm/lib/Transforms/IPO/SimplifyLibCalls.cpp	Tue Apr 26 14:55:57 2005
@@ -535,7 +535,8 @@
   virtual bool ValidateCalledFunction(const Function* f, const TargetData& TD)
   {
     // Just make sure this has 4 arguments per LLVM spec.
-    return f->arg_size() == 4;
+    return (f->arg_size() == 4) && 
+           (f->getReturnType() == PointerType::get(Type::VoidTy));
   }
 
   /// Because of alignment and instruction information that we don't have, we
@@ -546,12 +547,17 @@
   /// @brief Perform the memcpy optimization.
   virtual bool OptimizeCall(CallInst* ci, const TargetData& TD)
   {
-    ConstantInt* CI = cast<ConstantInt>(ci->getOperand(3));
-    assert(CI && "Operand should be ConstantInt");
-    uint64_t len = CI->getRawValue();
-    CI = dyn_cast<ConstantInt>(ci->getOperand(4));
-    assert(CI && "Operand should be ConstantInt");
-    uint64_t alignment = CI->getRawValue();
+    // Make sure we have constant int values to work with
+    ConstantInt* LEN = dyn_cast<ConstantInt>(ci->getOperand(3));
+    if (!LEN)
+      return false;
+    ConstantInt* ALIGN = dyn_cast<ConstantInt>(ci->getOperand(4));
+    if (!ALIGN)
+      return false;
+
+    // If the length is larger than the alignment, we can't optimize
+    uint64_t len = LEN->getRawValue();
+    uint64_t alignment = ALIGN->getRawValue();
     if (len > alignment)
       return false;
 
@@ -564,7 +570,8 @@
       case 0:
         // Just replace with the destination parameter since a zero length
         // memcpy is a no-op.
-        ci->replaceAllUsesWith(dest);
+        ci->replaceAllUsesWith(
+            new CastInst(dest,PointerType::get(Type::VoidTy),"",ci));
         ci->eraseFromParent();
         return true;
       case 1:
@@ -588,7 +595,8 @@
     }
     LoadInst* LI = new LoadInst(SrcCast,"",ci);
     StoreInst* SI = new StoreInst(LI, DestCast, ci);
-    ci->replaceAllUsesWith(dest);
+    ci->replaceAllUsesWith(
+      new CastInst(dest,PointerType::get(Type::VoidTy),"",ci));
     ci->eraseFromParent();
     return true;
   }






More information about the llvm-commits mailing list