@@ -1521,18 +1521,6 @@ expr_t reorder_nary_add_args(const expr_t &e, bool x64_first) {
15211521 return nary_op_t::make (nary_op->op_kind , new_args);
15221522}
15231523
1524- // Rewrites addition with mixed 64-bit/32-bit expressions to reduce 64-bit
1525- // arithmetic. Example:
1526- // Before: ((x.s64 + y.s32) + z.s32) [two 64-bit add]
1527- // After: ((y.s32 + z.s32) + x.s64) [one 32-bit add and one 64-bit add]
1528- class _64_bit_add_optimizer_t : public nary_op_mutator_t {
1529- public:
1530- object_t _mutate (const nary_op_t &obj) override {
1531- auto new_obj = nary_op_mutator_t::_mutate (obj);
1532- return reorder_nary_add_args (new_obj, /* x64_first=*/ false );
1533- }
1534- };
1535-
15361524// Simplifies using the N-ary form.
15371525expr_t simplify_with_nary (const expr_t &_e, const constraint_set_t &cset) {
15381526 auto e = _e;
@@ -1545,13 +1533,30 @@ expr_t simplify_with_nary(const expr_t &_e, const constraint_set_t &cset) {
15451533 e = int_div_mod_expander_t (cset).mutate (e);
15461534 e = common_factor_simplifier_t ().mutate (e);
15471535 e = int_div_mod_range_simplifier_t (cset).mutate (e);
1548- e = _64_bit_add_optimizer_t ().mutate (e);
15491536
15501537 e = nary_op_back_transform (e);
15511538
15521539 return e;
15531540}
15541541
1542+ class _64_bit_add_optimizer_t : public nary_op_mutator_t {
1543+ public:
1544+ object_t _mutate (const nary_op_t &obj) override {
1545+ auto new_obj = nary_op_mutator_t::_mutate (obj);
1546+ return reorder_nary_add_args (new_obj, /* x64_first=*/ false );
1547+ }
1548+ };
1549+
1550+ expr_t simplify_64_bit_add (const expr_t &_e) {
1551+ auto e = _e;
1552+
1553+ e = nary_op_canonicalize (e);
1554+ e = _64_bit_add_optimizer_t ().mutate (e);
1555+ e = nary_op_back_transform (e);
1556+
1557+ return e;
1558+ }
1559+
15551560class stmt_simplifier_t : public ir_mutator_t {
15561561public:
15571562 stmt_simplifier_t (const constraint_set_t &cset) : cset_(cset) {}
0 commit comments