@@ -1820,31 +1820,39 @@ br_status seq_rewriter::mk_re_inter(expr* a, expr* b, expr_ref& result) {
1820
1820
1821
1821
br_status seq_rewriter::mk_re_loop (func_decl* f, unsigned num_args, expr* const * args, expr_ref& result) {
1822
1822
rational n1, n2;
1823
- unsigned lo, hi;
1823
+ unsigned lo, hi, lo2, hi2, np ;
1824
1824
expr* a = nullptr ;
1825
1825
switch (num_args) {
1826
1826
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);
1829
1832
return BR_REWRITE1;
1830
1833
}
1831
1834
// (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);
1834
1842
return BR_REWRITE1;
1835
1843
}
1836
1844
// (loop a 0 0) = ""
1837
- if (f-> get_num_parameters () == 2 && f-> get_parameter ( 1 ). get_int () == 0 ) {
1845
+ if (np == 2 && hi2 == 0 ) {
1838
1846
result = m_util.re .mk_to_re (m_util.str .mk_empty (m_util.re .to_seq (m ().get_sort (args[0 ]))));
1839
1847
return BR_DONE;
1840
1848
}
1841
1849
// (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 ) {
1843
1851
result = args[0 ];
1844
1852
return BR_DONE;
1845
1853
}
1846
1854
// (loop a 0) = a*
1847
- if (f-> get_num_parameters () == 1 && f-> get_parameter ( 0 ). get_int () == 0 ) {
1855
+ if (np == 1 && lo2 == 0 ) {
1848
1856
result = m_util.re .mk_star (args[0 ]);
1849
1857
return BR_DONE;
1850
1858
}
0 commit comments