Make the global opt optimizer work on modules with a null terminator, by
authorChris Lattner <sabre@nondot.org>
Mon, 26 Sep 2005 02:19:27 +0000 (02:19 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 26 Sep 2005 02:19:27 +0000 (02:19 +0000)
accepting the null even with a non-65535 init prio

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@23434 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Transforms/IPO/GlobalOpt.cpp

index 03f8bf0d38684b660a895e6e76c0458103c60755..b0163146530f6aeed2566d6ad23b4dd12ba45149 100644 (file)
@@ -1144,15 +1144,17 @@ GlobalVariable *GlobalOpt::FindGlobalCtors(Module &M) {
       if (!CA) return 0;
       for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i)
         if (ConstantStruct *CS = dyn_cast<ConstantStruct>(CA->getOperand(i))) {
+          if (isa<ConstantPointerNull>(CS->getOperand(1)))
+            continue;
+
+          // Must have a function or null ptr.
+          if (!isa<Function>(CS->getOperand(1)))
+            return 0;
+          
           // Init priority must be standard.
           ConstantInt *CI = dyn_cast<ConstantInt>(CS->getOperand(0));
           if (!CI || CI->getRawValue() != 65535)
             return 0;
-          
-          // Must have a function or null ptr.
-          if (!isa<Function>(CS->getOperand(1)) &&
-              !isa<ConstantPointerNull>(CS->getOperand(1)))
-            return 0;
         } else {
           return 0;
         }
@@ -1185,9 +1187,11 @@ bool GlobalOpt::OptimizeGlobalCtorsList(GlobalVariable *&GCL) {
     Function *F = Ctors[i];
     // Found a null terminator in the middle of the list, prune off the rest of
     // the list.
-    if (F == 0 && i != Ctors.size()-1) {
-      Ctors.resize(i+1);
-      MadeChange = true;
+    if (F == 0) {
+      if (i != Ctors.size()-1) {
+        Ctors.resize(i+1);
+        MadeChange = true;
+      }
       break;
     }
     
@@ -1217,6 +1221,7 @@ bool GlobalOpt::OptimizeGlobalCtorsList(GlobalVariable *&GCL) {
                                           std::vector<const Type*>(), false);
       const PointerType *PFTy = PointerType::get(FTy);
       CSVals[1] = Constant::getNullValue(PFTy);
+      CSVals[0] = ConstantSInt::get(Type::IntTy, 2147483647);
     }
     CAList.push_back(ConstantStruct::get(CSVals));
   }