diff options
author | Nick Lewycky <nicholas@mxc.ca> | 2012-02-20 23:32:26 +0000 |
---|---|---|
committer | Nick Lewycky <nicholas@mxc.ca> | 2012-02-20 23:32:26 +0000 |
commit | 519561f418c77dcf46fd6d96d25d884fa07fd7da (patch) | |
tree | e195b6ac3c6176b1c2a0132e89908c2cf82f29e4 /llvm/lib/Transforms | |
parent | 63618f9ba62da2ee447896ea49e9ac5f1d087971 (diff) | |
download | bcm5719-llvm-519561f418c77dcf46fd6d96d25d884fa07fd7da.tar.gz bcm5719-llvm-519561f418c77dcf46fd6d96d25d884fa07fd7da.zip |
Check for the correct size in the invariant marker.
llvm-svn: 151003
Diffstat (limited to 'llvm/lib/Transforms')
-rw-r--r-- | llvm/lib/Transforms/IPO/GlobalOpt.cpp | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/llvm/lib/Transforms/IPO/GlobalOpt.cpp b/llvm/lib/Transforms/IPO/GlobalOpt.cpp index d197a3c87ad..bb37bf4c26e 100644 --- a/llvm/lib/Transforms/IPO/GlobalOpt.cpp +++ b/llvm/lib/Transforms/IPO/GlobalOpt.cpp @@ -2511,10 +2511,13 @@ bool Evaluator::EvaluateBlock(BasicBlock::iterator CurInst, 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. |