37 std::vector<mp_integer> bytes;
40 for(std::size_t bit = 0; bit < width; bit += bits_per_byte)
41 bytes.push_back((value >> bit)%
power(2, bits_per_byte));
45 for(std::size_t bit = 0; bit < width; bit += bits_per_byte)
49 "bytes is not empty because we just pushed just as many elements on "
50 "top of it as we are popping now");
51 new_value+=bytes.back()<<bit;
73 type_id == ID_integer || type_id == ID_natural ||
74 type_id == ID_unsignedbv || type_id == ID_signedbv)
83 else if(type_id==ID_rational)
92 else if(type_id==ID_fixedbv)
99 else if(type_id==ID_floatbv)
122 type_id == ID_integer || type_id == ID_natural ||
123 type_id == ID_unsignedbv || type_id == ID_signedbv)
132 else if(type_id==ID_rational)
141 else if(type_id==ID_fixedbv)
148 else if(type_id==ID_floatbv)
169 bool no_change =
true;
172 exprt::operandst::iterator constant;
175 bool constant_found =
false;
180 for(exprt::operandst::iterator it = new_operands.begin();
181 it != new_operands.end();)
190 it->type().id()!=ID_floatbv)
196 bool do_erase =
false;
199 if(it->is_constant() && it->type()==expr.
type())
202 if(!c_sizeof_type.has_value())
204 const typet &sizeof_type =
205 static_cast<const typet &
>(it->find(ID_C_c_sizeof_type));
207 c_sizeof_type = sizeof_type;
220 constant_found =
true;
227 it = new_operands.erase(it);
234 if(c_sizeof_type.has_value())
238 "c_sizeof_type is only set to a non-nil value "
239 "if a constant has been found");
240 constant->set(ID_C_c_sizeof_type, *c_sizeof_type);
243 if(new_operands.size() == 1)
245 return new_operands.front();
250 if(constant_found && constant->is_one())
253 new_operands.erase(constant);
256 if(new_operands.size() == 1)
257 return new_operands.front();
266 tmp.
operands() = std::move(new_operands);
267 return std::move(tmp);
278 if(expr_type!=expr.
op0().
type() ||
284 if(expr_type.
id()==ID_signedbv ||
285 expr_type.
id()==ID_unsignedbv ||
286 expr_type.
id()==ID_natural ||
287 expr_type.
id()==ID_integer)
289 const auto int_value0 = numeric_cast<mp_integer>(expr.
op0());
290 const auto int_value1 = numeric_cast<mp_integer>(expr.
op1());
293 if(int_value1.has_value() && *int_value1 == 0)
297 if(int_value1.has_value() && *int_value1 == 1)
303 if(int_value0.has_value() && *int_value0 == 0)
308 if(int_value0.has_value() && int_value1.has_value())
310 mp_integer result = *int_value0 / *int_value1;
314 else if(expr_type.
id()==ID_rational)
322 if(ok1 && rat_value1.
is_zero())
325 if((ok1 && rat_value1.
is_one()) ||
337 return std::move(tmp);
340 else if(expr_type.
id()==ID_fixedbv)
370 if(expr.
type().
id()==ID_signedbv ||
371 expr.
type().
id()==ID_unsignedbv ||
372 expr.
type().
id()==ID_natural ||
373 expr.
type().
id()==ID_integer)
378 const auto int_value0 = numeric_cast<mp_integer>(expr.
op0());
379 const auto int_value1 = numeric_cast<mp_integer>(expr.
op1());
381 if(int_value1.has_value() && *int_value1 == 0)
385 (int_value1.has_value() && *int_value1 == 1) ||
386 (int_value0.has_value() && *int_value0 == 0))
391 if(int_value0.has_value() && int_value1.has_value())
393 mp_integer result = *int_value0 % *int_value1;
407 bool no_change =
true;
414 if(expr.
type().
id() == ID_floatbv)
419 const exprt::operandst::iterator next = std::next(it);
421 if(next != new_operands.end())
423 if(it->type()==next->type() &&
428 new_operands.erase(next);
439 expr.
op0().
id() == ID_plus && expr.
op0().
type().
id() == ID_pointer &&
443 if(
as_const(result).op0().type().
id() != ID_pointer)
447 if(op1.
id() == ID_plus)
467 if(
is_number(it->type()) && it->is_constant())
473 exprt::operandst::iterator const_sum;
474 bool const_sum_set=
false;
476 for(
auto it = new_operands.begin(); it != new_operands.end(); it++)
478 if(
is_number(it->type()) && it->is_constant())
500 typedef std::unordered_map<exprt, exprt::operandst::iterator, irep_hash>
504 for(
auto it = new_operands.begin(); it != new_operands.end(); it++)
505 if(it->id() == ID_unary_minus)
511 for(
auto it = new_operands.begin(); it != new_operands.end(); it++)
515 else if(it->id()==ID_unary_minus)
518 expr_mapt::iterator itm=expr_map.find(*it);
520 if(itm!=expr_map.end())
532 for(exprt::operandst::iterator it = new_operands.begin();
533 it != new_operands.end();
536 if(
is_number(it->type()) && it->is_zero())
538 it = new_operands.erase(it);
546 if(new_operands.empty())
550 else if(new_operands.size() == 1)
552 return new_operands.front();
560 tmp.
operands() = std::move(new_operands);
561 return std::move(tmp);
569 if(!
is_number(minus_expr.type()) && minus_expr.type().id() != ID_pointer)
584 minus_expr.type().id() == ID_pointer &&
585 operands[0].type().id() == ID_pointer &&
is_number(operands[1].type()))
595 is_number(minus_expr.type()) && operands[0].type().id() == ID_pointer &&
596 operands[1].type().id() == ID_pointer)
600 if(operands[0]==operands[1])
614 if(expr.
type().
id()!=ID_bool)
621 it->id() == ID_typecast &&
625 else if(it->is_zero() || it->is_one())
637 if(expr.
id()==ID_bitand)
639 else if(expr.
id()==ID_bitor)
641 else if(expr.
id()==ID_bitxor)
648 if(it->id()==ID_typecast)
650 else if(it->is_zero())
652 else if(it->is_one())
663 bool no_change =
true;
664 auto new_expr = expr;
670 while(new_expr.operands().size() >= 2)
672 if(!new_expr.op0().is_constant())
675 if(!new_expr.op1().is_constant())
678 if(new_expr.op0().type() != new_expr.type())
681 if(new_expr.op1().type() != new_expr.type())
687 std::function<bool(
bool,
bool)> f;
689 if(new_expr.id() == ID_bitand)
690 f = [](
bool a,
bool b) {
return a && b; };
691 else if(new_expr.id() == ID_bitor)
692 f = [](
bool a,
bool b) {
return a || b; };
693 else if(new_expr.id() == ID_bitxor)
694 f = [](
bool a,
bool b) {
return a != b; };
699 make_bvrep(width, [&a_val, &b_val, &width, &f](std::size_t i) {
707 new_expr.operands().erase(new_expr.operands().begin());
708 new_expr.op0().swap(new_op);
715 if(new_expr.id() == ID_bitor || new_expr.id() == ID_bitxor)
717 for(exprt::operandst::iterator it = new_expr.operands().begin();
718 it != new_expr.operands().end();)
720 if(it->is_zero() && new_expr.operands().size() > 1)
722 it = new_expr.operands().erase(it);
726 it->is_constant() && it->type().id() == ID_bv &&
728 new_expr.operands().size() > 1)
730 it = new_expr.operands().erase(it);
740 if(new_expr.id() == ID_bitand)
742 const auto all_ones =
power(2, width) - 1;
743 for(exprt::operandst::iterator it = new_expr.operands().begin();
744 it != new_expr.operands().end();)
750 new_expr.operands().size() > 1)
752 it = new_expr.operands().erase(it);
762 if(new_expr.operands().size() == 2 && new_expr.op0() == new_expr.op1())
764 if(new_expr.id() == ID_bitand || new_expr.id() == ID_bitor)
766 return new_expr.op0();
768 else if(new_expr.id() == ID_bitxor)
774 if(new_expr.operands().size() == 1)
775 return new_expr.op0();
780 return std::move(new_expr);
793 const auto index_converted_to_int = numeric_cast<mp_integer>(expr.
index());
795 !index_converted_to_int.has_value() || *index_converted_to_int < 0 ||
796 *index_converted_to_int >= src_bit_width)
807 numeric_cast_v<std::size_t>(*index_converted_to_int));
815 bool no_change =
true;
827 const bool value = op.
is_true();
836 while(i < new_expr.
operands().size() - 1)
851 const auto new_width = width_i + width_n;
854 new_width, [&value_i, &value_n, width_i, width_n](std::size_t x) {
869 else if(new_expr.
type().
id() == ID_verilog_unsignedbv)
874 while(i < new_expr.
operands().size() - 1)
881 (opi.
type().
id()==ID_verilog_unsignedbv ||
883 (opn.
type().
id()==ID_verilog_unsignedbv ||
887 const std::string new_value=
889 opi.
set(ID_value, new_value);
891 opi.
type().
id(ID_verilog_unsignedbv);
905 return new_expr.
op0();
911 return std::move(new_expr);
920 const auto distance = numeric_cast<mp_integer>(expr.
distance());
922 if(!distance.has_value())
928 auto value = numeric_cast<mp_integer>(expr.
op());
931 !value.has_value() && expr.
op().
type().
id() == ID_bv &&
932 expr.
op().
id() == ID_constant)
939 if(!value.has_value())
943 expr.
op().
type().
id() == ID_unsignedbv ||
948 if(expr.
id()==ID_lshr)
951 if(*distance >= width)
955 else if(*distance >= 0)
958 *value +=
power(2, width);
959 *value /=
power(2, *distance);
963 else if(expr.
id()==ID_ashr)
972 else if(expr.
id()==ID_shl)
975 if(*distance >= width)
979 else if(*distance >= 0)
981 *value *=
power(2, *distance);
989 if(expr.
id()==ID_lshr)
993 *value /=
power(2, *distance);
997 else if(expr.
id()==ID_ashr)
1003 if(*value < 0 && new_value == 0)
1009 else if(expr.
id()==ID_shl)
1013 *value *=
power(2, *distance);
1028 const auto base = numeric_cast<mp_integer>(expr.
op0());
1029 const auto exponent = numeric_cast<mp_integer>(expr.
op1());
1031 if(!base.has_value())
1034 if(!exponent.has_value())
1054 const auto start = numeric_cast<mp_integer>(expr.
upper());
1055 const auto end = numeric_cast<mp_integer>(expr.
lower());
1057 if(!start.has_value())
1060 if(!end.has_value())
1065 if(!width.has_value())
1068 if(*start < 0 || *start >= (*width) || *end < 0 || *end >= (*width))
1071 DATA_INVARIANT(*start >= *end,
"extractbits must have upper() >= lower()");
1077 if(!svalue.has_value() || svalue->size() != *width)
1080 std::string extracted_value = svalue->substr(
1081 numeric_cast_v<std::size_t>(*end),
1082 numeric_cast_v<std::size_t>(*start - *end + 1));
1085 if(!result.has_value())
1088 return std::move(*result);
1090 else if(expr.
src().
id() == ID_concatenation)
1100 if(!op_width.has_value() || *op_width <= 0)
1103 if(*start + 1 == offset && *end + *op_width == offset)
1109 return std::move(tmp);
1112 offset -= *op_width;
1132 const exprt &operand = expr.
op();
1137 if(operand.
id()==ID_unary_minus)
1145 else if(operand.
id()==ID_constant)
1150 if(type_id==ID_integer ||
1151 type_id==ID_signedbv ||
1152 type_id==ID_unsignedbv)
1154 const auto int_value = numeric_cast<mp_integer>(constant_expr);
1156 if(!int_value.has_value())
1161 else if(type_id==ID_rational)
1169 else if(type_id==ID_fixedbv)
1175 else if(type_id==ID_floatbv)
1191 const auto &type = expr.
type();
1194 type.id() == ID_bv || type.id() == ID_unsignedbv ||
1195 type.id() == ID_signedbv)
1199 if(op.
type() == type)
1201 if(op.
id()==ID_constant)
1204 const auto new_value =
1205 make_bvrep(width, [&value, &width](std::size_t i) {
1220 if(expr.
type().
id()!=ID_bool)
1231 if((expr.
id()==ID_equal || expr.
id()==ID_notequal) &&
1235 auto new_expr = expr;
1236 new_expr.
op0().
swap(new_expr.op1());
1240 if(tmp0.
id()==ID_if && tmp0.
operands().size()==3)
1254 (expr.
id() == ID_equal || expr.
id() == ID_notequal))
1259 if(tmp0.
id()==ID_pointer_object &&
1260 tmp1.
id()==ID_pointer_object &&
1261 (expr.
id()==ID_equal || expr.
id()==ID_notequal))
1266 if(tmp0.
type().
id()==ID_c_enum_tag)
1269 if(tmp1.
type().
id()==ID_c_enum_tag)
1276 if(tmp0_const && tmp1_const)
1286 if(expr.
id()==ID_ge)
1288 else if(expr.
id()==ID_le)
1290 else if(expr.
id()==ID_gt)
1292 else if(expr.
id()==ID_lt)
1320 if(tmp0.
type().
id() == ID_c_enum_tag)
1323 if(tmp1.
type().
id() == ID_c_enum_tag)
1329 if(expr.
id() == ID_equal || expr.
id() == ID_notequal)
1333 bool equal = (tmp0_const.get_value() == tmp1_const.get_value());
1335 !equal && tmp0_const.type().id() == ID_pointer &&
1336 tmp1_const.type().id() == ID_pointer)
1340 tmp1_const.get_value() == ID_NULL))
1346 equal = tmp0_const.is_zero() && tmp1_const.is_zero();
1351 if(tmp0.
type().
id() == ID_fixedbv)
1356 if(expr.
id() == ID_ge)
1358 else if(expr.
id() == ID_le)
1360 else if(expr.
id() == ID_gt)
1362 else if(expr.
id() == ID_lt)
1367 else if(tmp0.
type().
id() == ID_floatbv)
1372 if(expr.
id() == ID_ge)
1374 else if(expr.
id() == ID_le)
1376 else if(expr.
id() == ID_gt)
1378 else if(expr.
id() == ID_lt)
1383 else if(tmp0.
type().
id() == ID_rational)
1393 if(expr.
id() == ID_ge)
1395 else if(expr.
id() == ID_le)
1397 else if(expr.
id() == ID_gt)
1399 else if(expr.
id() == ID_lt)
1406 const auto v0 = numeric_cast<mp_integer>(tmp0_const);
1411 const auto v1 = numeric_cast<mp_integer>(tmp1_const);
1416 if(expr.
id() == ID_ge)
1418 else if(expr.
id() == ID_le)
1420 else if(expr.
id() == ID_gt)
1422 else if(expr.
id() == ID_lt)
1440 if(op0.
id()==ID_plus)
1442 bool no_change =
true;
1450 else if(op1.
id()==ID_plus)
1452 bool no_change =
true;
1463 op0.
type().
id()!=ID_complex)
1481 if(expr.
op0().
type().
id() == ID_floatbv)
1486 expr.
op0().
type().
id() == ID_pointer && expr.
id() != ID_equal &&
1487 expr.
id() != ID_notequal)
1493 if(expr.
id()==ID_notequal)
1495 auto new_rel_expr = expr;
1496 new_rel_expr.
id(ID_equal);
1500 else if(expr.
id()==ID_gt)
1502 auto new_rel_expr = expr;
1503 new_rel_expr.
id(ID_ge);
1505 new_rel_expr.lhs().
swap(new_rel_expr.rhs());
1509 else if(expr.
id()==ID_lt)
1511 auto new_rel_expr = expr;
1512 new_rel_expr.
id(ID_ge);
1516 else if(expr.
id()==ID_le)
1518 auto new_rel_expr = expr;
1519 new_rel_expr.
id(ID_ge);
1521 new_rel_expr.lhs().
swap(new_rel_expr.rhs());
1528 expr.
id() == ID_ge || expr.
id() == ID_equal,
1529 "we previously converted all other cases to >= or ==");
1533 if(expr.
op0() == expr.
op1())
1538 if(expr.
id()==ID_equal)
1574 if(expr.
id()==ID_notequal)
1576 auto new_rel_expr = expr;
1577 new_rel_expr.
id(ID_equal);
1583 if(expr.
id() != ID_equal)
1592 if(expr.
op0().
id() == ID_address_of)
1597 object.
id() == ID_symbol ||
object.
id() == ID_dynamic_object ||
1598 object.
id() == ID_member ||
object.
id() == ID_index ||
1599 object.
id() == ID_string_constant)
1605 expr.
op0().
id() == ID_typecast &&
1609 const auto &
object =
1613 object.
id() == ID_symbol ||
object.
id() == ID_dynamic_object ||
1614 object.
id() == ID_member ||
object.
id() == ID_index ||
1615 object.
id() == ID_string_constant)
1621 expr.
op0().
id() == ID_typecast && expr.
op0().
type().
id() == ID_pointer)
1625 op.
type().
id() != ID_pointer &&
1627 op.
type().
id() == ID_complex))
1634 auto new_expr = expr;
1636 if(new_expr.op0().type().id() != ID_pointer)
1637 new_expr.op1() =
from_integer(0, new_expr.op0().type());
1639 new_expr.op1().type() = new_expr.op0().type();
1650 if(expr.
op0().
id()==ID_plus)
1654 if(expr.
id()==ID_equal || expr.
id()==ID_notequal)
1657 bool op_changed =
false;
1658 auto new_expr = expr;
1662 if(it->is_constant())
1680 new_expr.op1() =
from_integer(i, new_expr.op1().type());
1693 expr.
op0().
id() == ID_typecast && expr.
op0().
type().
id() == ID_floatbv &&
1700 ieee_floatt const_val_converted_back=const_val_converted;
1703 if(const_val_converted_back==const_val)
1708 return std::move(result);
1717 if(expr.
id()==ID_ge &&
1724 auto new_expr = expr;
1727 if(expr.
id()==ID_equal)
1730 if(operand.
id()==ID_unary_minus)
1733 return std::move(new_expr);
1735 else if(operand.
id()==ID_plus)
1740 if(operand_plus_expr.operands().size() == 2)
1743 if(operand_plus_expr.op0().id() == ID_unary_minus)
1744 operand_plus_expr.op0().swap(operand_plus_expr.op1());
1746 if(operand_plus_expr.op1().id() == ID_unary_minus)
1749 operand_plus_expr.op0(),
1761 expr.
op0().
id() == ID_typecast &&
1775 return lhs_typecast_op;
1779 #define NORMALISE_CONSTANT_TESTS
1780 #ifdef NORMALISE_CONSTANT_TESTS
1782 if(expr.
op0().
type().
id()==ID_unsignedbv ||
1787 if(expr.
id()==ID_notequal)
1789 auto new_rel_expr = expr;
1790 new_rel_expr.
id(ID_equal);
1794 else if(expr.
id()==ID_gt)
1803 auto new_expr = expr;
1806 new_expr.op1() =
from_integer(i, new_expr.op1().type());
1809 else if(expr.
id()==ID_lt)
1811 auto new_rel_expr = expr;
1812 new_rel_expr.
id(ID_ge);
1816 else if(expr.
id()==ID_le)
1825 auto new_rel_expr = expr;
1826 new_rel_expr.
id(ID_ge);
1828 new_rel_expr.op1() =
from_integer(i, new_rel_expr.op1().type());
1845 if(!const_bits_opt.has_value())
1848 std::reverse(const_bits_opt->begin(), const_bits_opt->end());
1855 if(!result.has_value())
1858 return std::move(*result);