Skip to content

Commit 64d4e59

Browse files
re rewriter for loop
Signed-off-by: Nikolaj Bjorner <[email protected]>
1 parent 6041cb2 commit 64d4e59

File tree

1 file changed

+16
-8
lines changed

1 file changed

+16
-8
lines changed

src/ast/rewriter/seq_rewriter.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,31 +1820,39 @@ br_status seq_rewriter::mk_re_inter(expr* a, expr* b, expr_ref& result) {
18201820

18211821
br_status seq_rewriter::mk_re_loop(func_decl* f, unsigned num_args, expr* const* args, expr_ref& result) {
18221822
rational n1, n2;
1823-
unsigned lo, hi;
1823+
unsigned lo, hi, lo2, hi2, np;
18241824
expr* a = nullptr;
18251825
switch (num_args) {
18261826
case 1:
1827-
if (f->get_num_parameters() == 2 && f->get_parameter(0).get_int() > f->get_parameter(1).get_int()) {
1828-
result = m_util.re.mk_loop(args[0], f->get_parameter(1).get_int(), f->get_parameter(1).get_int());
1827+
np = f->get_num_parameters();
1828+
lo2 = np > 0 ? f->get_parameter(0).get_int() : 0;
1829+
hi2 = np > 1 ? f->get_parameter(1).get_int() : 0;
1830+
if (np == 2 && lo2 > hi2) {
1831+
result = m_util.re.mk_loop(args[0], hi2, hi2);
18291832
return BR_REWRITE1;
18301833
}
18311834
// (loop (loop a lo) lo2) = (loop lo*lo2)
1832-
if (m_util.re.is_loop(args[0], a, lo) && f->get_num_parameters() == 1) {
1833-
result = m_util.re.mk_loop(a, f->get_parameter(0).get_int() * lo);
1835+
if (m_util.re.is_loop(args[0], a, lo) && np == 1) {
1836+
result = m_util.re.mk_loop(a, lo2 * lo);
1837+
return BR_REWRITE1;
1838+
}
1839+
// (loop (loop a l l) h h) = (loop a l*h l*h)
1840+
if (m_util.re.is_loop(args[0], a, lo, hi) && np == 2 && lo == hi && lo2 == hi2) {
1841+
result = m_util.re.mk_loop(a, lo2 * lo, hi2 * hi);
18341842
return BR_REWRITE1;
18351843
}
18361844
// (loop a 0 0) = ""
1837-
if (f->get_num_parameters() == 2 && f->get_parameter(1).get_int() == 0) {
1845+
if (np == 2 && hi2 == 0) {
18381846
result = m_util.re.mk_to_re(m_util.str.mk_empty(m_util.re.to_seq(m().get_sort(args[0]))));
18391847
return BR_DONE;
18401848
}
18411849
// (loop a 1 1) = a
1842-
if (f->get_num_parameters() == 2 && f->get_parameter(0).get_int() == 1 && f->get_parameter(1).get_int() == 1) {
1850+
if (np == 2 && lo2 == 1 && hi2 == 1) {
18431851
result = args[0];
18441852
return BR_DONE;
18451853
}
18461854
// (loop a 0) = a*
1847-
if (f->get_num_parameters() == 1 && f->get_parameter(0).get_int() == 0) {
1855+
if (np == 1 && lo2 == 0) {
18481856
result = m_util.re.mk_star(args[0]);
18491857
return BR_DONE;
18501858
}

0 commit comments

Comments
 (0)