diff --git a/passes/opt/share.cc b/passes/opt/share.cc
index 20ec8d358..7bb48eddc 100644
--- a/passes/opt/share.cc
+++ b/passes/opt/share.cc
@@ -856,18 +856,20 @@ struct ShareWorker
 	}
 
 	template<typename Iterator>
-	void insert_capped(pool<ssc_pair_t>& cache, Iterator begin_pattern, Iterator end_pattern)
+	bool insert_capped(pool<ssc_pair_t>& cache, Iterator begin_pattern, Iterator end_pattern)
 	{
 		if (cache.size() + std::distance(begin_pattern, end_pattern) > config.pattern_limit) {
 			cache.clear();
 			cache.insert(ssc_pair_t());
+			return false;
 		} else {
 			cache.insert(begin_pattern, end_pattern);
 		}
+		return true;
 	}
-	void insert_capped(pool<ssc_pair_t>& cache, ssc_pair_t pattern)
+	bool insert_capped(pool<ssc_pair_t>& cache, ssc_pair_t pattern)
 	{
-		insert_capped(cache, &pattern, &pattern + 1);
+		return insert_capped(cache, &pattern, &pattern + 1);
 	}
 
 	const pool<ssc_pair_t> &find_cell_activation_patterns(RTLIL::Cell *cell, const char *indent)
@@ -926,20 +928,29 @@ struct ShareWorker
 					for (int i = 0; i < GetSize(sig_s); i++)
 						p.first.append(sig_s[i]), p.second.bits().push_back(RTLIL::State::S0);
 					if (sort_check_activation_pattern(p))
-						insert_capped(activation_patterns_cache[cell], p);
+						if (!insert_capped(activation_patterns_cache[cell], p)) {
+							recursion_state.erase(cell);
+							return activation_patterns_cache[cell];
+						}
 				}
 
 			for (int idx : used_in_b_parts)
 				for (auto p : c_patterns) {
 					p.first.append(sig_s[idx]), p.second.bits().push_back(RTLIL::State::S1);
 					if (sort_check_activation_pattern(p))
-						insert_capped(activation_patterns_cache[cell], p);
+					if (!insert_capped(activation_patterns_cache[cell], p)) {
+						recursion_state.erase(cell);
+						return activation_patterns_cache[cell];
+					}
 				}
 		}
 
 		for (auto c : driven_cells) {
 			const pool<ssc_pair_t> &c_patterns = find_cell_activation_patterns(c, indent);
-			insert_capped(activation_patterns_cache[cell], c_patterns.begin(), c_patterns.end());
+			if (!insert_capped(activation_patterns_cache[cell], c_patterns.begin(), c_patterns.end())) {
+				recursion_state.erase(cell);
+				return activation_patterns_cache[cell];
+			}
 		}
 
 		log_assert(recursion_state.count(cell) != 0);