Skip to content

Commit e8d3409

Browse files
authored
Merge pull request #8506 from diffblue/simplify-bitxnor
simplify bitxnor
2 parents 0db546b + 8f55154 commit e8d3409

File tree

3 files changed

+44
-6
lines changed

3 files changed

+44
-6
lines changed

src/util/bitvector_expr.h

+35
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,41 @@ inline bitxor_exprt &to_bitxor_expr(exprt &expr)
190190
return static_cast<bitxor_exprt &>(expr);
191191
}
192192

193+
/// \brief Bit-wise XNOR
194+
class bitxnor_exprt : public multi_ary_exprt
195+
{
196+
public:
197+
bitxnor_exprt(exprt _op0, exprt _op1)
198+
: multi_ary_exprt(std::move(_op0), ID_bitxnor, std::move(_op1))
199+
{
200+
}
201+
};
202+
203+
template <>
204+
inline bool can_cast_expr<bitxnor_exprt>(const exprt &base)
205+
{
206+
return base.id() == ID_bitxnor;
207+
}
208+
209+
/// \brief Cast an exprt to a \ref bitxnor_exprt
210+
///
211+
/// \a expr must be known to be \ref bitxnor_exprt.
212+
///
213+
/// \param expr: Source expression
214+
/// \return Object of type \ref bitxnor_exprt
215+
inline const bitxnor_exprt &to_bitxnor_expr(const exprt &expr)
216+
{
217+
PRECONDITION(expr.id() == ID_bitxnor);
218+
return static_cast<const bitxnor_exprt &>(expr);
219+
}
220+
221+
/// \copydoc to_bitxnor_expr(const exprt &)
222+
inline bitxnor_exprt &to_bitxnor_expr(exprt &expr)
223+
{
224+
PRECONDITION(expr.id() == ID_bitxnor);
225+
return static_cast<bitxnor_exprt &>(expr);
226+
}
227+
193228
/// \brief Bit-wise AND
194229
class bitand_exprt : public multi_ary_exprt
195230
{

src/util/simplify_expr.cpp

+7-6
Original file line numberDiff line numberDiff line change
@@ -950,9 +950,10 @@ simplify_exprt::simplify_typecast(const typecast_exprt &expr)
950950
{
951951
irep_idt op_id = expr.op().id();
952952

953-
if(op_id==ID_plus || op_id==ID_minus || op_id==ID_mult ||
954-
op_id==ID_unary_minus ||
955-
op_id==ID_bitxor || op_id==ID_bitor || op_id==ID_bitand)
953+
if(
954+
op_id == ID_plus || op_id == ID_minus || op_id == ID_mult ||
955+
op_id == ID_unary_minus || op_id == ID_bitxor || op_id == ID_bitxnor ||
956+
op_id == ID_bitor || op_id == ID_bitand)
956957
{
957958
exprt result = expr.op();
958959

@@ -2949,9 +2950,9 @@ simplify_exprt::resultt<> simplify_exprt::simplify_node(const exprt &node)
29492950
{
29502951
r = simplify_bitnot(to_bitnot_expr(expr));
29512952
}
2952-
else if(expr.id()==ID_bitand ||
2953-
expr.id()==ID_bitor ||
2954-
expr.id()==ID_bitxor)
2953+
else if(
2954+
expr.id() == ID_bitand || expr.id() == ID_bitor || expr.id() == ID_bitxor ||
2955+
expr.id() == ID_bitxnor)
29552956
{
29562957
r = simplify_bitwise(to_multi_ary_expr(expr));
29572958
}

src/util/simplify_expr_int.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -745,6 +745,8 @@ simplify_exprt::simplify_bitwise(const multi_ary_exprt &expr)
745745
f = [](bool a, bool b) { return a || b; };
746746
else if(new_expr.id() == ID_bitxor)
747747
f = [](bool a, bool b) { return a != b; };
748+
else if(new_expr.id() == ID_bitxnor)
749+
f = [](bool a, bool b) { return a == b; };
748750
else
749751
UNREACHABLE;
750752

0 commit comments

Comments
 (0)