Skip to content

Commit cab3c45

Browse files
committed
remove unnecessary parameter copies
1 parent ab22e76 commit cab3c45

9 files changed

+23
-34
lines changed

src/ast/array_decl_plugin.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ sort * array_decl_plugin::mk_sort(decl_kind k, unsigned num_parameters, paramete
4949
m_manager->raise_exception("invalid array sort definition, invalid number of parameters");
5050
return nullptr;
5151
}
52-
parameter params[2] = { parameters[0], parameter(m_manager->mk_bool_sort()) };
52+
parameter params[2] = { parameter(parameters[0]), parameter(m_manager->mk_bool_sort()) };
5353
return mk_sort(ARRAY_SORT, 2, params);
5454
}
5555
SASSERT(k == ARRAY_SORT);

src/ast/ast.cpp

+1-9
Original file line numberDiff line numberDiff line change
@@ -48,21 +48,13 @@ parameter::~parameter() {
4848
}
4949
}
5050

51-
parameter& parameter::operator=(parameter const& other) {
52-
if (this == &other) {
53-
return *this;
54-
}
55-
56-
this->~parameter();
57-
m_val = other.m_val;
58-
51+
parameter::parameter(parameter const& other) : m_val(other.m_val) {
5952
if (auto p = std::get_if<rational*>(&m_val)) {
6053
m_val = alloc(rational, **p);
6154
}
6255
if (auto p = std::get_if<zstring*>(&m_val)) {
6356
m_val = alloc(zstring, **p);
6457
}
65-
return *this;
6658
}
6759

6860
void parameter::init_eh(ast_manager & m) {

src/ast/ast.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,18 @@ class parameter {
142142
explicit parameter(const char *s): m_val(symbol(s)) {}
143143
explicit parameter(const std::string &s): m_val(symbol(s)) {}
144144
explicit parameter(unsigned ext_id, bool): m_val(ext_id) {}
145-
parameter(parameter const& other) { *this = other; }
145+
explicit parameter(parameter const& other);
146146

147147
parameter(parameter && other) noexcept : m_val(std::move(other.m_val)) {
148148
other.m_val = 0;
149149
}
150150

151151
~parameter();
152152

153-
parameter& operator=(parameter const& other);
153+
parameter& operator=(parameter && other) {
154+
std::swap(other.m_val, m_val);
155+
return *this;
156+
}
154157

155158
kind_t get_kind() const { return static_cast<kind_t>(m_val.index()); }
156159
bool is_int() const { return get_kind() == PARAM_INT; }
@@ -1099,7 +1102,7 @@ class decl_plugin {
10991102

11001103
// Event handlers for deleting/translating PARAM_EXTERNAL
11011104
virtual void del(parameter const & p) {}
1102-
virtual parameter translate(parameter const & p, decl_plugin & target) { UNREACHABLE(); return p; }
1105+
virtual parameter translate(parameter const & p, decl_plugin & target) { UNREACHABLE(); return {}; }
11031106

11041107
virtual bool is_considered_uninterpreted(func_decl * f) { return false; }
11051108
};

src/ast/ast_lt.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -68,8 +68,8 @@ bool lt(ast * n1, ast * n2) {
6868
num = to_sort(n1)->get_num_parameters();
6969
SASSERT(num > 0);
7070
for (unsigned i = 0; i < num; i++) {
71-
parameter p1 = to_sort(n1)->get_parameter(i);
72-
parameter p2 = to_sort(n2)->get_parameter(i);
71+
const parameter &p1 = to_sort(n1)->get_parameter(i);
72+
const parameter &p2 = to_sort(n2)->get_parameter(i);
7373
check_parameter(p1, p2);
7474
}
7575
UNREACHABLE();
@@ -80,8 +80,8 @@ bool lt(ast * n1, ast * n2) {
8080
check_value(to_func_decl(n1)->get_num_parameters(), to_func_decl(n2)->get_num_parameters());
8181
num = to_func_decl(n1)->get_num_parameters();
8282
for (unsigned i = 0; i < num; i++) {
83-
parameter p1 = to_func_decl(n1)->get_parameter(i);
84-
parameter p2 = to_func_decl(n2)->get_parameter(i);
83+
const parameter &p1 = to_func_decl(n1)->get_parameter(i);
84+
const parameter &p2 = to_func_decl(n2)->get_parameter(i);
8585
check_parameter(p1, p2);
8686
}
8787
num = to_func_decl(n1)->get_arity();

src/ast/bv_decl_plugin.cpp

+2-3
Original file line numberDiff line numberDiff line change
@@ -454,9 +454,8 @@ func_decl * bv_decl_plugin::mk_num_decl(unsigned num_parameters, parameter const
454454
// This cannot be enforced now, since some Z3 modules try to generate these invalid numerals.
455455
// After SMT-COMP, I should find all offending modules.
456456
// For now, I will just simplify the numeral here.
457-
rational v = parameters[0].get_rational();
458-
parameter p0(mod2k(v, bv_size));
459-
parameter ps[2] = { std::move(p0), parameters[1] };
457+
const rational &v = parameters[0].get_rational();
458+
parameter ps[2] = { parameter(mod2k(v, bv_size)), parameter(parameters[1]) };
460459
sort * bv = get_bv_sort(bv_size);
461460
return m_manager->mk_const_decl(m_bv_sym, bv, func_decl_info(m_family_id, OP_BV_NUM, num_parameters, ps));
462461
}

src/ast/fpa/bv2fpa_converter.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ func_interp * bv2fpa_converter::convert_func_interp(model_core * mc, func_decl *
319319

320320
if (m_fpa_util.is_to_sbv(f) || m_fpa_util.is_to_ubv(f)) {
321321
auto k = m_fpa_util.is_to_sbv(f) ? OP_FPA_TO_SBV_I : OP_FPA_TO_UBV_I;
322-
parameter param = f->get_parameter(0);
322+
const parameter &param = f->get_parameter(0);
323323
func_decl_ref to_bv_i(m.mk_func_decl(fid, k, 1, &param, dom.size(), dom.data()), m);
324324
expr_ref else_value(m.mk_app(to_bv_i, dom.size(), dom.data()), m);
325325
result->set_else(else_value);

src/ast/fpa_decl_plugin.cpp

+1-2
Original file line numberDiff line numberDiff line change
@@ -208,8 +208,7 @@ sort * fpa_decl_plugin::mk_float_sort(unsigned ebits, unsigned sbits) {
208208
if (ebits > 63)
209209
m_manager->raise_exception("maximum number of exponent bits is 63");
210210

211-
parameter p1(ebits), p2(sbits);
212-
parameter ps[2] = { p1, p2 };
211+
parameter ps[2] = { parameter(ebits), parameter(sbits) };
213212
sort_size sz;
214213
sz = sort_size::mk_very_big(); // TODO: refine
215214
return m_manager->mk_sort(symbol("FloatingPoint"), sort_info(m_family_id, FLOATING_POINT_SORT, sz, 2, ps));

src/ast/polymorphism_util.cpp

+6-6
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ namespace polymorphism {
4040
unsigned n = s->get_num_parameters();
4141
vector<parameter> ps;
4242
for (unsigned i = 0; i < n; ++i) {
43-
auto p = s->get_parameter(i);
43+
auto &p = s->get_parameter(i);
4444
if (p.is_ast() && is_sort(p.get_ast())) {
4545
sort_ref s = (*this)(to_sort(p.get_ast()));
4646
ps.push_back(parameter(s.get()));
@@ -167,8 +167,8 @@ namespace polymorphism {
167167
if (s1->get_num_parameters() != s2->get_num_parameters())
168168
return false;
169169
for (unsigned i = s1->get_num_parameters(); i-- > 0;) {
170-
auto p1 = s1->get_parameter(i);
171-
auto p2 = s2->get_parameter(i);
170+
auto &p1 = s1->get_parameter(i);
171+
auto &p2 = s2->get_parameter(i);
172172
if (p1.is_ast() && is_sort(p1.get_ast())) {
173173
if (!p2.is_ast())
174174
return false;
@@ -204,8 +204,8 @@ namespace polymorphism {
204204
if (s1->get_num_parameters() != s2->get_num_parameters())
205205
return false;
206206
for (unsigned i = s1->get_num_parameters(); i-- > 0;) {
207-
auto p1 = s1->get_parameter(i);
208-
auto p2 = s2->get_parameter(i);
207+
auto &p1 = s1->get_parameter(i);
208+
auto &p2 = s2->get_parameter(i);
209209
if (p1.is_ast() && is_sort(p1.get_ast())) {
210210
if (!p2.is_ast())
211211
return false;
@@ -282,7 +282,7 @@ namespace polymorphism {
282282
}
283283
vector<parameter> params;
284284
for (unsigned i = 0; i < s->get_num_parameters(); ++i) {
285-
parameter p = s->get_parameter(i);
285+
const parameter &p = s->get_parameter(i);
286286
if (p.is_ast() && is_sort(p.get_ast())) {
287287
sort_ref fs = fresh(to_sort(p.get_ast()));
288288
params.push_back(parameter(fs.get()));

src/muz/spacer/spacer_proof_utils.cpp

+1-5
Original file line numberDiff line numberDiff line change
@@ -209,18 +209,14 @@ namespace spacer {
209209

210210
static proof_ref mk_th_lemma(ast_manager &m, ptr_buffer<proof> const &parents,
211211
unsigned num_params, parameter const *params) {
212-
buffer<parameter> v;
213-
for (unsigned i = 1; i < num_params; ++i)
214-
v.push_back(params[i]);
215-
216212
SASSERT(params[0].is_symbol());
217213
family_id tid = m.mk_family_id(params[0].get_symbol());
218214
SASSERT(tid != null_family_id);
219215

220216
proof_ref pf(m);
221217
pf = m.mk_th_lemma(tid, m.mk_false(),
222218
parents.size(), parents.data(),
223-
v.size(), v.data());
219+
num_params - 1, params + 1);
224220
return pf;
225221
}
226222

0 commit comments

Comments
 (0)