3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2025-06-28 17:08:45 +00:00

overhead with push-ite on shared terms

This commit is contained in:
Nikolaj Bjorner 2022-02-14 19:36:14 +02:00
parent 3d26b501e7
commit 9a4d6cee6c
3 changed files with 8 additions and 6 deletions

View file

@ -979,9 +979,8 @@ expr* poly_rewriter<Config>::merge_muls(expr* x, expr* y) {
template<typename Config> template<typename Config>
bool poly_rewriter<Config>::hoist_ite(expr_ref& e) { bool poly_rewriter<Config>::hoist_ite(expr_ref& e) {
if (!m_hoist_ite) { if (!m_hoist_ite)
return false; return false;
}
obj_hashtable<expr> shared; obj_hashtable<expr> shared;
ptr_buffer<expr> adds; ptr_buffer<expr> adds;
expr_ref_vector bs(m()), pinned(m()); expr_ref_vector bs(m()), pinned(m());

View file

@ -295,6 +295,8 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
bool is_ite_value_tree(expr * t) { bool is_ite_value_tree(expr * t) {
if (!m().is_ite(t)) if (!m().is_ite(t))
return false; return false;
if (t->get_ref_count() != 1)
return false;
ptr_buffer<app> todo; ptr_buffer<app> todo;
todo.push_back(to_app(t)); todo.push_back(to_app(t));
while (!todo.empty()) { while (!todo.empty()) {
@ -319,7 +321,7 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
br_status pull_ite(func_decl * f, unsigned num, expr * const * args, expr_ref & result) { br_status pull_ite(func_decl * f, unsigned num, expr * const * args, expr_ref & result) {
if (num == 2 && m().is_bool(f->get_range()) && !m().is_bool(args[0])) { if (num == 2 && m().is_bool(f->get_range()) && !m().is_bool(args[0])) {
if (m().is_ite(args[0])) { if (m().is_ite(args[0])) {
if (m().is_value(args[1])) if (m().is_value(args[1]) && args[0]->get_ref_count() == 1)
return pull_ite_core<false>(f, to_app(args[0]), to_app(args[1]), result); return pull_ite_core<false>(f, to_app(args[0]), to_app(args[1]), result);
if (m().is_ite(args[1]) && to_app(args[0])->get_arg(0) == to_app(args[1])->get_arg(0)) { if (m().is_ite(args[1]) && to_app(args[0])->get_arg(0) == to_app(args[1])->get_arg(0)) {
// (p (ite C A1 B1) (ite C A2 B2)) --> (ite (p A1 A2) (p B1 B2)) // (p (ite C A1 B1) (ite C A2 B2)) --> (ite (p A1 A2) (p B1 B2))
@ -329,7 +331,7 @@ struct th_rewriter_cfg : public default_rewriter_cfg {
return BR_REWRITE2; return BR_REWRITE2;
} }
} }
if (m().is_ite(args[1]) && m().is_value(args[0])) if (m().is_ite(args[1]) && m().is_value(args[0]) && args[1]->get_ref_count() == 1)
return pull_ite_core<true>(f, to_app(args[1]), to_app(args[0]), result); return pull_ite_core<true>(f, to_app(args[1]), to_app(args[0]), result);
} }
family_id fid = f->get_family_id(); family_id fid = f->get_family_id();

View file

@ -52,6 +52,7 @@ struct tactic_report::imp {
<< " :before-memory " << std::fixed << std::setprecision(2) << m_start_memory << " :before-memory " << std::fixed << std::setprecision(2) << m_start_memory
<< " :after-memory " << std::fixed << std::setprecision(2) << end_memory << " :after-memory " << std::fixed << std::setprecision(2) << end_memory
<< ")" << std::endl); << ")" << std::endl);
IF_VERBOSE(20, m_goal.display(verbose_stream() << m_id << "\n"));
SASSERT(m_goal.is_well_formed()); SASSERT(m_goal.is_well_formed());
} }
}; };