diff --git a/passes/opt/opt_reduce.cc b/passes/opt/opt_reduce.cc
index f947e9724..5f3c4d29e 100644
--- a/passes/opt/opt_reduce.cc
+++ b/passes/opt/opt_reduce.cc
@@ -368,8 +368,12 @@ struct OptReducePass : public Pass {
 		for (auto &mod_it : design->modules_) {
 			if (!design->selected(mod_it.second))
 				continue;
-			OptReduceWorker worker(design, mod_it.second, do_fine);
-			total_count += worker.total_count;
+			do {
+				OptReduceWorker worker(design, mod_it.second, do_fine);
+				total_count += worker.total_count;
+				if (worker.total_count == 0)
+					break;
+			} while (1);
 		}
 
 		log("Performed a total of %d changes.\n", total_count);