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:
parent
cd82205b06
commit
7869cdbbc8
|
@ -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
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue