3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-04-12 12:08:18 +00:00

#5259 - the Ranjit 2s shave

shave a couple of seconds from the Ranjit regression
This commit is contained in:
Nikolaj Bjorner 2021-05-12 10:43:16 -07:00
parent cd82205b06
commit 7869cdbbc8
4 changed files with 31 additions and 9 deletions

View file

@ -72,6 +72,7 @@ class skolemizer {
cache m_cache; cache m_cache;
cache m_cache_pr; cache m_cache_pr;
bool m_proofs_enabled; bool m_proofs_enabled;
used_vars m_uv;
void process(quantifier * q, expr_ref & r, proof_ref & p) { void process(quantifier * q, expr_ref & r, proof_ref & p) {
@ -81,14 +82,14 @@ class skolemizer {
p = nullptr; p = nullptr;
return; return;
} }
used_vars uv; m_uv.reset();
uv(q); m_uv(q);
SASSERT(is_well_sorted(m, q)); SASSERT(is_well_sorted(m, q));
unsigned sz = uv.get_max_found_var_idx_plus_1(); unsigned sz = m_uv.get_max_found_var_idx_plus_1();
ptr_buffer<sort> sorts; ptr_buffer<sort> sorts;
expr_ref_vector args(m); expr_ref_vector args(m);
for (unsigned i = 0; i < sz; i++) { for (unsigned i = 0; i < sz; i++) {
sort * s = uv.get(i); sort * s = m_uv.get(i);
if (s != nullptr) { if (s != nullptr) {
sorts.push_back(s); sorts.push_back(s);
args.push_back(m.mk_var(i, s)); args.push_back(m.mk_var(i, s));
@ -111,7 +112,7 @@ class skolemizer {
// (VAR num_decls-1) is in the last position. // (VAR num_decls-1) is in the last position.
// //
for (unsigned i = 0; i < sz; i++) { for (unsigned i = 0; i < sz; i++) {
sort * s = uv.get(i); sort * s = m_uv.get(i);
if (s != nullptr) if (s != nullptr)
substitution.push_back(m.mk_var(i, s)); substitution.push_back(m.mk_var(i, s));
else else

View file

@ -79,7 +79,9 @@ expr_ref unused_vars_eliminator::operator()(quantifier* q) {
result = q; result = q;
return result; return result;
} }
unsigned num_decls = q->get_num_decls();
m_used.reset(); m_used.reset();
m_used.set_num_decls(num_decls);
m_used.process(q->get_expr()); m_used.process(q->get_expr());
unsigned num_patterns = q->get_num_patterns(); unsigned num_patterns = q->get_num_patterns();
for (unsigned i = 0; i < num_patterns; i++) for (unsigned i = 0; i < num_patterns; i++)
@ -88,7 +90,7 @@ expr_ref unused_vars_eliminator::operator()(quantifier* q) {
for (unsigned i = 0; i < num_no_patterns; i++) for (unsigned i = 0; i < num_no_patterns; i++)
m_used.process(q->get_no_pattern(i)); m_used.process(q->get_no_pattern(i));
unsigned num_decls = q->get_num_decls();
if (m_used.uses_all_vars(num_decls)) { if (m_used.uses_all_vars(num_decls)) {
q->set_no_unused_vars(); q->set_no_unused_vars();
result = q; result = q;

View file

@ -22,6 +22,9 @@ Revision History:
void used_vars::process(expr * n, unsigned delta) { void used_vars::process(expr * n, unsigned delta) {
unsigned j, idx; unsigned j, idx;
if (m_num_found_vars == m_num_decls)
return;
m_cache.reset(); m_cache.reset();
m_todo.reset(); m_todo.reset();
m_todo.push_back(expr_delta_pair(n, delta)); m_todo.push_back(expr_delta_pair(n, delta));
@ -58,8 +61,16 @@ void used_vars::process(expr * n, unsigned delta) {
if (idx >= delta) { if (idx >= delta) {
idx = idx - delta; idx = idx - delta;
if (idx >= m_found_vars.size()) if (idx >= m_found_vars.size())
m_found_vars.resize(idx + 1); m_found_vars.resize(idx + 1, nullptr);
m_found_vars[idx] = to_var(n)->get_sort(); if (!m_found_vars[idx]) {
m_found_vars[idx] = to_var(n)->get_sort();
if (idx < m_num_decls)
m_num_found_vars++;
if (m_num_found_vars == m_num_decls) {
m_todo.reset();
return;
}
}
} }
break; break;
case AST_QUANTIFIER: case AST_QUANTIFIER:

View file

@ -26,18 +26,26 @@ class used_vars {
typedef hashtable<expr_delta_pair, obj_hash<expr_delta_pair>, default_eq<expr_delta_pair> > cache; typedef hashtable<expr_delta_pair, obj_hash<expr_delta_pair>, default_eq<expr_delta_pair> > cache;
cache m_cache; cache m_cache;
svector<expr_delta_pair> m_todo; svector<expr_delta_pair> m_todo;
unsigned m_num_decls{ UINT_MAX };
unsigned m_num_found_vars{ 0 };
void process(expr * n, unsigned delta); void process(expr * n, unsigned delta);
public: public:
void operator()(expr * n) { void operator()(expr * n) {
m_found_vars.reset(); reset();
process(n, 0); process(n, 0);
} }
void reset() { void reset() {
m_found_vars.reset(); m_found_vars.reset();
m_num_decls = UINT_MAX;
m_num_found_vars = 0;
}
void set_num_decls(unsigned n) {
m_num_decls = n;
} }
void process(expr * n) { void process(expr * n) {