@@ -35,6 +35,12 @@ static bool have_to_remove_vector(const exprt &expr)
35
35
}
36
36
else if (expr.id ()==ID_unary_minus || expr.id ()==ID_bitnot)
37
37
return true ;
38
+ else if (
39
+ expr.id () == ID_equal || expr.id () == ID_notequal || expr.id () == ID_lt ||
40
+ expr.id () == ID_le || expr.id () == ID_gt || expr.id () == ID_ge)
41
+ {
42
+ return true ;
43
+ }
38
44
else if (expr.id ()==ID_vector)
39
45
return true ;
40
46
}
@@ -141,6 +147,39 @@ static void remove_vector(exprt &expr)
141
147
142
148
expr=array_expr;
143
149
}
150
+ else if (
151
+ expr.id () == ID_equal || expr.id () == ID_notequal || expr.id () == ID_lt ||
152
+ expr.id () == ID_le || expr.id () == ID_gt || expr.id () == ID_ge)
153
+ {
154
+ // component-wise and generate 0 (false) or -1 (true)
155
+ // x ~ y -> vector(x[0] ~ y[0] ? -1 : 0, x[1] ~ y[1] ? -1 : 0, ...)
156
+
157
+ auto const &binary_expr = to_binary_expr (expr);
158
+ const vector_typet &vector_type = to_vector_type (expr.type ());
159
+ const auto dimension = numeric_cast_v<std::size_t >(vector_type.size ());
160
+
161
+ const typet &subtype = vector_type.subtype ();
162
+ exprt minus_one = from_integer (-1 , subtype);
163
+ exprt zero = from_integer (0 , subtype);
164
+
165
+ exprt::operandst operands;
166
+ operands.reserve (dimension);
167
+
168
+ for (std::size_t i = 0 ; i < dimension; ++i)
169
+ {
170
+ exprt index = from_integer (i, vector_type.size ().type ());
171
+
172
+ operands.push_back (
173
+ if_exprt{binary_relation_exprt{index_exprt{binary_expr.lhs (), index },
174
+ binary_expr.id (),
175
+ index_exprt{binary_expr.rhs (), index }},
176
+ minus_one,
177
+ zero});
178
+ }
179
+
180
+ expr = array_exprt{std::move (operands),
181
+ array_typet{subtype, vector_type.size ()}};
182
+ }
144
183
else if (expr.id ()==ID_vector)
145
184
{
146
185
expr.id (ID_array);
0 commit comments