Implement GlobalOpt/deadglobal-2.llx, deletion of globals that are only
authorChris Lattner <sabre@nondot.org>
Sun, 10 Oct 2004 16:47:33 +0000 (16:47 +0000)
committerChris Lattner <sabre@nondot.org>
Sun, 10 Oct 2004 16:47:33 +0000 (16:47 +0000)
stored to, but are stored at variable indexes.  This occurs at least in
176.gcc, but probably others, and we should handle it for completeness.

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

lib/Transforms/IPO/GlobalOpt.cpp

index 7c0c32251293047b3af2919a2d1b3ba87aaf5389..3a58afdc260970470738ad1280f6c9fe0dc8ac64 100644 (file)
@@ -259,6 +259,17 @@ static bool CleanupConstantGlobalUsers(Value *V, Constant *Init) {
     } else if (GetElementPtrInst *GEP = dyn_cast<GetElementPtrInst>(U)) {
       if (Constant *SubInit = TraverseGEPInitializer(GEP, Init))
         Changed |= CleanupConstantGlobalUsers(GEP, SubInit);
+      else {
+        // If this GEP has variable indexes, we should still be able to delete
+        // any stores through it.
+        for (Value::use_iterator GUI = GEP->use_begin(), E = GEP->use_end();
+             GUI != E;)
+          if (StoreInst *SI = dyn_cast<StoreInst>(*GUI++)) {
+            SI->getParent()->getInstList().erase(SI);
+            Changed = true;
+          }
+      }
+
       if (GEP->use_empty()) {
         GEP->getParent()->getInstList().erase(GEP);
         Changed = true;