Skip to content

Commit a15e4ad

Browse files
perf fix
1 parent e018b02 commit a15e4ad

File tree

1 file changed

+17
-6
lines changed

1 file changed

+17
-6
lines changed

src/ast/rewriter/bit_blaster/bit_blaster_tpl_def.h

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -993,16 +993,27 @@ void bit_blaster_tpl<Cfg>::mk_ext_rotate_left_right(unsigned sz, expr * const *
993993
for (unsigned j = 0; j < sz; ++j)
994994
out_bits.push_back(a_bits[j]);
995995
expr_ref_vector out(m());
996+
auto mk_ite = [&](expr* bit_i, expr* th, expr* el) {
997+
if (m().is_false(bit_i))
998+
return el;
999+
if (m().is_true(bit_i))
1000+
return th;
1001+
return (expr*)(m().mk_ite(bit_i, th, el));
1002+
};
9961003
for (unsigned i = 0, p = 1; i < sz; ++i) {
9971004
auto bit_i = b_bits[i];
9981005
// rotate by p if bit_i is set.
999-
out.reset();
1000-
for (unsigned j = 0; j < sz; ++j) {
1001-
unsigned src = (Left ? (sz + j - p) : (j + p)) % sz;
1002-
out.push_back(m().mk_ite(bit_i, out_bits.get(src), out_bits.get(j)));
1006+
1007+
if (!m().is_false(bit_i)) {
1008+
out.reset();
1009+
for (unsigned j = 0; j < sz; ++j) {
1010+
unsigned src = (Left ? (sz + j - p) : (j + p)) % sz;
1011+
out.push_back(mk_ite(bit_i, out_bits.get(src), out_bits.get(j)));
1012+
}
1013+
out_bits.reset();
1014+
out_bits.append(out);
10031015
}
1004-
out_bits.reset();
1005-
out_bits.append(out);
1016+
10061017
p *= 2;
10071018
if (is_power_of_two(sz) && sz == p)
10081019
break;

0 commit comments

Comments
 (0)