[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