Make dropTriviallyDeadConstantArrays not quadratic
authorBenjamin Kramer <benny.kra@googlemail.com>
Tue, 21 Jan 2020 14:54:48 +0000 (15:54 +0100)
committerBenjamin Kramer <benny.kra@googlemail.com>
Tue, 21 Jan 2020 15:06:46 +0000 (16:06 +0100)
Only look at the operands of dead constant arrays instead of all
constant arrays again.

llvm/lib/IR/LLVMContextImpl.cpp

index 5f978271417059630ae57fc7cb736e03056ece09..ca2ee588d15da31ecc5a6bbcc98b8d02c8b87d6c 100644 (file)
@@ -11,6 +11,7 @@
 //===----------------------------------------------------------------------===//
 
 #include "LLVMContextImpl.h"
+#include "llvm/ADT/SetVector.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/OptBisect.h"
 #include "llvm/IR/Type.h"
@@ -142,18 +143,19 @@ LLVMContextImpl::~LLVMContextImpl() {
 }
 
 void LLVMContextImpl::dropTriviallyDeadConstantArrays() {
-  bool Changed;
-  do {
-    Changed = false;
-
-    for (auto I = ArrayConstants.begin(), E = ArrayConstants.end(); I != E;) {
-      auto *C = *I++;
-      if (C->use_empty()) {
-        Changed = true;
-        C->destroyConstant();
+  SmallSetVector<ConstantArray *, 4> WorkList(ArrayConstants.begin(),
+                                              ArrayConstants.end());
+
+  while (!WorkList.empty()) {
+    ConstantArray *C = WorkList.pop_back_val();
+    if (C->use_empty()) {
+      for (const Use &Op : C->operands()) {
+        if (auto *COp = dyn_cast<ConstantArray>(Op))
+          WorkList.insert(COp);
       }
+      C->destroyConstant();
     }
-  } while (Changed);
+  }
 }
 
 void Module::dropTriviallyDeadConstantArrays() {