[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