changeset 1493:7cca8cf730de

Increment the iterator before deleting redundant functions or globals in the StripExternals pass.
author Christian Kamm <kamm incasoftware de>
date Thu, 11 Jun 2009 21:48:10 +0200
parents ef76f6e1693c
children b243e28f63d4
files gen/passes/StripExternals.cpp
diffstat 1 files changed, 13 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/gen/passes/StripExternals.cpp	Thu Jun 11 16:57:45 2009 +0200
+++ b/gen/passes/StripExternals.cpp	Thu Jun 11 21:48:10 2009 +0200
@@ -54,36 +54,44 @@
 bool StripExternals::runOnModule(Module &M) {
   bool Changed = false;
 
-  for (Module::iterator I = M.begin(), E = M.end(); I != E; ++I) {
+  for (Module::iterator I = M.begin(); I != M.end(); ) {
     if (I->hasAvailableExternallyLinkage()) {
       assert(!I->isDeclaration()&&"Declarations can't be available_externally");
       Changed = true;
       ++NumFunctions;
       if (I->use_empty()) {
         DOUT << "Deleting function: " << *I;
-        I->eraseFromParent();
+        Module::iterator todelete = I;
+        ++I;
+        todelete->eraseFromParent();
+        continue;
       } else {
         I->deleteBody();
         DOUT << "Deleted function body: " << *I;
       }
     }
+    ++I;
   }
 
-  for (Module::global_iterator I = M.global_begin(), E = M.global_end();
-       I != E; ++I) {
+  for (Module::global_iterator I = M.global_begin();
+       I != M.global_end(); ) {
     if (I->hasAvailableExternallyLinkage()) {
       assert(!I->isDeclaration()&&"Declarations can't be available_externally");
       Changed = true;
       ++NumVariables;
       if (I->use_empty()) {
         DOUT << "Deleting global: " << *I;
-        I->eraseFromParent();
+        Module::global_iterator todelete = I;
+        ++I;
+        todelete->eraseFromParent();
+        continue;
       } else {
         I->setInitializer(0);
         I->setLinkage(GlobalValue::ExternalLinkage);
         DOUT << "Deleted initializer: " << *I;
       }
     }
+    ++I;
   }
 
   return Changed;