OSDN Git Service

Fix GlobalOpt to avoid committing a store if the address getelementptr
authorDan Gohman <gohman@apple.com>
Mon, 7 Sep 2009 22:40:13 +0000 (22:40 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 7 Sep 2009 22:40:13 +0000 (22:40 +0000)
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

lib/Transforms/IPO/GlobalOpt.cpp

index 293de6c..71eeb75 100644 (file)
@@ -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.