[llvm-commits] [llvm] r122550 - /llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
Benjamin Kramer
benny.kra at googlemail.com
Fri Dec 24 14:23:59 PST 2010
Author: d0k
Date: Fri Dec 24 16:23:59 2010
New Revision: 122550
URL: http://llvm.org/viewvc/llvm-project?rev=122550&view=rev
Log:
Fix a thinko pointed out by Frits van Bommel: looking through global variables in isBytewiseValue is not safe.
Modified:
llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
Modified: llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp?rev=122550&r1=122549&r2=122550&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp (original)
+++ llvm/trunk/lib/Transforms/Scalar/MemCpyOptimizer.cpp Fri Dec 24 16:23:59 2010
@@ -40,13 +40,6 @@
/// i16 0xF0F0, double 0.0 etc. If the value can't be handled with a repeated
/// byte store (e.g. i16 0x1234), return null.
static Value *isBytewiseValue(Value *V) {
- // Look through constant globals.
- if (GlobalVariable *GV = dyn_cast<GlobalVariable>(V)) {
- if (GV->mayBeOverridden() || !GV->isConstant() || !GV->hasInitializer())
- return 0;
- V = GV->getInitializer();
- }
-
// All byte-wide stores are splatable, even of arbitrary variables.
if (V->getType()->isIntegerTy(8)) return V;
@@ -793,21 +786,25 @@
}
// If copying from a constant, try to turn the memcpy into a memset.
- if (Value *ByteVal = isBytewiseValue(M->getSource())) {
- Value *Ops[] = {
- M->getRawDest(), ByteVal, // Start, value
- CopySize, // Size
- M->getAlignmentCst(), // Alignment
- ConstantInt::getFalse(M->getContext()), // volatile
- };
- const Type *Tys[] = { Ops[0]->getType(), Ops[2]->getType() };
- Module *Mod = M->getParent()->getParent()->getParent();
- Function *MemSetF = Intrinsic::getDeclaration(Mod, Intrinsic::memset, Tys, 2);
- CallInst::Create(MemSetF, Ops, Ops+5, "", M);
- M->eraseFromParent();
- ++NumCpyToSet;
- return true;
- }
+ if (GlobalVariable *GV = dyn_cast<GlobalVariable>(M->getSource()))
+ if (!GV->mayBeOverridden() && GV->isConstant() && GV->hasInitializer())
+ if (Value *ByteVal = isBytewiseValue(GV->getInitializer())) {
+ Value *Ops[] = {
+ M->getRawDest(), ByteVal, // Start, value
+ CopySize, // Size
+ M->getAlignmentCst(), // Alignment
+ ConstantInt::getFalse(M->getContext()), // volatile
+ };
+ const Type *Tys[] = { Ops[0]->getType(), Ops[2]->getType() };
+ Module *Mod = M->getParent()->getParent()->getParent();
+ Function *MemSetF = Intrinsic::getDeclaration(Mod, Intrinsic::memset,
+ Tys, 2);
+ CallInst::Create(MemSetF, Ops, Ops+5, "", M);
+ MD->removeInstruction(M);
+ M->eraseFromParent();
+ ++NumCpyToSet;
+ return true;
+ }
// The are two possible optimizations we can do for memcpy:
// a) memcpy-memcpy xform which exposes redundance for DSE.
More information about the llvm-commits
mailing list