Check for the correct size in the invariant marker.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@151003 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp
index d197a3c..bb37bf4 100644
--- a/lib/Transforms/IPO/GlobalOpt.cpp
+++ b/lib/Transforms/IPO/GlobalOpt.cpp
@@ -2511,10 +2511,13 @@
           if (!II->use_empty())
             return false;
           ConstantInt *Size = cast<ConstantInt>(II->getArgOperand(0));
-          if (Size->isAllOnesValue()) {
-            Value *PtrArg = getVal(II->getArgOperand(1));
-            Value *Ptr = PtrArg->stripPointerCasts();
-            if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr))
+          Value *PtrArg = getVal(II->getArgOperand(1));
+          Value *Ptr = PtrArg->stripPointerCasts();
+          if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr)) {
+            Type *ElemTy = cast<PointerType>(GV->getType())->getElementType();
+            if (!Size->isAllOnesValue() &&
+                Size->getValue().getLimitedValue() >=
+                TD->getTypeStoreSize(ElemTy))
               Invariants.insert(GV);
           }
           // Continue even if we do nothing.