diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/include/llvm/GlobalVariable.h | 9 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/InstructionCombining.cpp | 7 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Scalar/SCCP.cpp | 4 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/CloneFunction.cpp | 3 | 
4 files changed, 15 insertions, 8 deletions
| diff --git a/llvm/include/llvm/GlobalVariable.h b/llvm/include/llvm/GlobalVariable.h index bcbf3213462..ae64ccf614b 100644 --- a/llvm/include/llvm/GlobalVariable.h +++ b/llvm/include/llvm/GlobalVariable.h @@ -78,6 +78,15 @@ public:    ///    inline bool hasInitializer() const { return !isDeclaration(); } +  /// hasDefinitiveInitializer - Whether the global variable has an initializer, +  /// and this is the initializer that will be used in the final executable. +  inline bool hasDefinitiveInitializer() const { +    return hasInitializer() && +      // The initializer of a global variable with weak linkage may change at +      // link time. +      !mayBeOverridden(); +  } +    /// getInitializer - Return the initializer for this global variable.  It is    /// illegal to call this method if the global is external, because we cannot    /// tell what the value is initialized to! diff --git a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp index 6af0afd55e1..26963280bbe 100644 --- a/llvm/lib/Transforms/Scalar/InstructionCombining.cpp +++ b/llvm/lib/Transforms/Scalar/InstructionCombining.cpp @@ -11227,15 +11227,14 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {      // Instcombine load (constant global) into the value loaded.      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Op)) -      if (GV->isConstant() && !GV->isDeclaration() && !GV->mayBeOverridden()) +      if (GV->isConstant() && GV->hasDefinitiveInitializer())          return ReplaceInstUsesWith(LI, GV->getInitializer());      // Instcombine load (constantexpr_GEP global, 0, ...) into the value loaded.      if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Op)) {        if (CE->getOpcode() == Instruction::GetElementPtr) {          if (GlobalVariable *GV = dyn_cast<GlobalVariable>(CE->getOperand(0))) -          if (GV->isConstant() && !GV->isDeclaration() && -              !GV->mayBeOverridden()) +          if (GV->isConstant() && GV->hasDefinitiveInitializer())              if (Constant *V =                  ConstantFoldLoadThroughGEPConstantExpr(GV->getInitializer(), CE))                return ReplaceInstUsesWith(LI, V); @@ -11259,7 +11258,7 @@ Instruction *InstCombiner::visitLoadInst(LoadInst &LI) {    // If this load comes from anywhere in a constant global, and if the global    // is all undef or zero, we know what it loads.    if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Op->getUnderlyingObject())){ -    if (GV->isConstant() && GV->hasInitializer() && !GV->mayBeOverridden()) { +    if (GV->isConstant() && GV->hasDefinitiveInitializer()) {        if (GV->getInitializer()->isNullValue())          return ReplaceInstUsesWith(LI, Constant::getNullValue(LI.getType()));        else if (isa<UndefValue>(GV->getInitializer())) diff --git a/llvm/lib/Transforms/Scalar/SCCP.cpp b/llvm/lib/Transforms/Scalar/SCCP.cpp index a49bcc84547..d2a70ea9d00 100644 --- a/llvm/lib/Transforms/Scalar/SCCP.cpp +++ b/llvm/lib/Transforms/Scalar/SCCP.cpp @@ -1131,7 +1131,7 @@ void SCCPSolver::visitLoadInst(LoadInst &I) {      // Transform load (constant global) into the value loaded.      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(Ptr)) {        if (GV->isConstant()) { -        if (!GV->isDeclaration() && !GV->mayBeOverridden()) { +        if (GV->hasDefinitiveInitializer()) {            markConstant(IV, &I, GV->getInitializer());            return;          } @@ -1150,7 +1150,7 @@ void SCCPSolver::visitLoadInst(LoadInst &I) {      if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ptr))        if (CE->getOpcode() == Instruction::GetElementPtr)      if (GlobalVariable *GV = dyn_cast<GlobalVariable>(CE->getOperand(0))) -      if (GV->isConstant() && !GV->isDeclaration() && !GV->mayBeOverridden()) +      if (GV->isConstant() && GV->hasDefinitiveInitializer())          if (Constant *V =               ConstantFoldLoadThroughGEPConstantExpr(GV->getInitializer(), CE)) {            markConstant(IV, &I, V); diff --git a/llvm/lib/Transforms/Utils/CloneFunction.cpp b/llvm/lib/Transforms/Utils/CloneFunction.cpp index 5dc2d1cdc3a..d7b4bd3fd67 100644 --- a/llvm/lib/Transforms/Utils/CloneFunction.cpp +++ b/llvm/lib/Transforms/Utils/CloneFunction.cpp @@ -335,8 +335,7 @@ ConstantFoldMappedInstruction(const Instruction *I) {      if (ConstantExpr *CE = dyn_cast<ConstantExpr>(Ops[0]))        if (!LI->isVolatile() && CE->getOpcode() == Instruction::GetElementPtr)          if (GlobalVariable *GV = dyn_cast<GlobalVariable>(CE->getOperand(0))) -          if (GV->isConstant() && !GV->isDeclaration() && -              !GV->mayBeOverridden()) +          if (GV->isConstant() && GV->hasDefinitiveInitializer())              return ConstantFoldLoadThroughGEPConstantExpr(GV->getInitializer(),                                                            CE); | 

