diff options
author | Dan Gohman <gohman@apple.com> | 2009-09-07 22:40:13 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-09-07 22:40:13 +0000 |
commit | c62482d4edecd416e6529e31427fa6fd8a9b7ece (patch) | |
tree | c5bd56008e83372345f36ab29332a9f921f35a30 /lib/Transforms | |
parent | 4a7e6b7a15cea1f8ead4d1bb1cf2e3a39a339cb3 (diff) | |
download | external_llvm-c62482d4edecd416e6529e31427fa6fd8a9b7ece.zip external_llvm-c62482d4edecd416e6529e31427fa6fd8a9b7ece.tar.gz external_llvm-c62482d4edecd416e6529e31427fa6fd8a9b7ece.tar.bz2 |
Fix GlobalOpt to avoid committing a store if the address getelementptr
is missing the inbounds flag. This is slightly conservative, but it
avoids problems with two constants pointing to the same address but
getting distinct entries in the Memory DenseMap.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@81163 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Transforms')
-rw-r--r-- | lib/Transforms/IPO/GlobalOpt.cpp | 3 |
1 files changed, 2 insertions, 1 deletions
diff --git a/lib/Transforms/IPO/GlobalOpt.cpp b/lib/Transforms/IPO/GlobalOpt.cpp index 293de6c..71eeb75 100644 --- a/lib/Transforms/IPO/GlobalOpt.cpp +++ b/lib/Transforms/IPO/GlobalOpt.cpp @@ -2032,7 +2032,8 @@ static bool isSimpleEnoughPointerToCommit(Constant *C, LLVMContext &Context) { if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) // Handle a constantexpr gep. if (CE->getOpcode() == Instruction::GetElementPtr && - isa<GlobalVariable>(CE->getOperand(0))) { + isa<GlobalVariable>(CE->getOperand(0)) && + cast<GEPOperator>(CE)->isInBounds()) { GlobalVariable *GV = cast<GlobalVariable>(CE->getOperand(0)); // Do not allow weak/linkonce/dllimport/dllexport linkage or // external globals. |