@@ -273,25 +273,31 @@ class constants_evaluator
273
273
274
274
abstract_object_pointert try_transform_expr_with_all_rounding_modes () const
275
275
{
276
- std::vector<abstract_object_pointert> possible_results;
276
+ abstract_object_pointert last_result;
277
+
278
+ auto results_differ = [](
279
+ const abstract_object_pointert &prev,
280
+ const abstract_object_pointert &cur) {
281
+ if (prev == nullptr )
282
+ return false ;
283
+ return prev->to_constant () != cur->to_constant ();
284
+ };
285
+
277
286
for (auto rounding_mode : all_rounding_modes)
278
287
{
279
288
auto child_env (environment_with_rounding_mode (rounding_mode));
280
289
auto child_operands =
281
290
reeval_operands (expression.operands (), child_env, ns);
282
291
283
- possible_results.push_back (
284
- constants_evaluator (expression, child_operands, child_env, ns)());
285
- }
292
+ auto result =
293
+ constants_evaluator (expression, child_operands, child_env, ns)();
286
294
287
- auto first = possible_results.front ()->to_constant ();
288
- for (auto const &possible_result : possible_results)
289
- {
290
- auto current = possible_result->to_constant ();
291
- if (current.is_nil () || current != first)
295
+ if (result->is_top () || results_differ (last_result, result))
292
296
return top (expression.type ());
297
+ last_result = result;
293
298
}
294
- return possible_results.front ();
299
+
300
+ return last_result;
295
301
}
296
302
297
303
abstract_environmentt
0 commit comments