Factorize out a concept - no functionality change.
authorDuncan Sands <baldrick@free.fr>
Sat, 21 Mar 2009 21:27:31 +0000 (21:27 +0000)
committerDuncan Sands <baldrick@free.fr>
Sat, 21 Mar 2009 21:27:31 +0000 (21:27 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@67454 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/GlobalVariable.h
lib/Transforms/Scalar/InstructionCombining.cpp
lib/Transforms/Scalar/SCCP.cpp
lib/Transforms/Utils/CloneFunction.cpp

index bcbf3213462732c7689e49a60ddea2040d3fb9ac..ae64ccf614be3654cebeabd88a58fdd5974bf14b 100644 (file)
@@ -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!
index 6af0afd55e18e40de3ab3a5ea0476c1ee41fcd61..26963280bbe73899c3ede11d3918b36647b32bb1 100644 (file)
@@ -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()))
index a49bcc84547b7ba2a74aa0fb1864509359f3f3fe..d2a70ea9d001b3efbe32d5a3317de5126f406030 100644 (file)
@@ -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);
index 5dc2d1cdc3a773ae234d0fa1648eb61191732172..d7b4bd3fd6776cf65f7cf25ede357e58773a3033 100644 (file)
@@ -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);