Skip to content

Commit 2fa8d96

Browse files
committed
Interval evaluation wants expressions rather than objects
Prevent repeated calls to obj->to_interval() by returning a list of expressions in the first place. Removes a level of indirection in the subsequent code.
1 parent d1fc4cd commit 2fa8d96

File tree

5 files changed

+30
-40
lines changed

5 files changed

+30
-40
lines changed

src/analyses/variable-sensitivity/abstract_value_object.cpp

Lines changed: 23 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -362,16 +362,16 @@ class interval_evaluator
362362
return make_top<interval_abstract_valuet>(expression.type());
363363

364364
if(expression.id() == ID_if)
365-
return interval_evaluate_conditional(interval_operands);
365+
return evaluate_conditional(interval_operands);
366366

367367
if(num_operands == 1)
368-
return interval_evaluate_unary_expr(interval_operands);
368+
return evaluate_unary_expr(interval_operands);
369369

370-
constant_interval_exprt result = interval_operands[0]->to_interval();
370+
constant_interval_exprt result = interval_operands[0];
371371

372372
for(size_t opIndex = 1; opIndex != interval_operands.size(); ++opIndex)
373373
{
374-
auto &interval_next = interval_operands[opIndex]->to_interval();
374+
auto &interval_next = interval_operands[opIndex];
375375
result = result.eval(expression.id(), interval_next);
376376
}
377377

@@ -381,22 +381,22 @@ class interval_evaluator
381381
return make_interval(result);
382382
}
383383

384-
std::vector<interval_abstract_value_pointert> operands_as_intervals() const
384+
std::vector<constant_interval_exprt> operands_as_intervals() const
385385
{
386-
std::vector<interval_abstract_value_pointert> interval_operands;
386+
std::vector<constant_interval_exprt> interval_operands;
387387

388388
for(const auto &op : operands)
389389
{
390390
auto iav = std::dynamic_pointer_cast<const interval_abstract_valuet>(op);
391391
if(!iav)
392392
{
393-
// The operand isn't an interval - if it's an integral constant we can
394-
// convert it into an interval.
393+
// The operand isn't an interval
394+
// if it's an integral constant we can convert it into an interval.
395395
if(constant_interval_exprt::is_int(op->type()))
396396
{
397397
const auto op_as_constant = op->to_constant();
398398
if(op_as_constant.is_nil())
399-
return std::vector<interval_abstract_value_pointert>();
399+
return std::vector<constant_interval_exprt>();
400400

401401
iav = make_interval(op_as_constant);
402402
}
@@ -405,19 +405,18 @@ class interval_evaluator
405405
}
406406

407407
if(iav)
408-
interval_operands.push_back(iav);
408+
interval_operands.push_back(iav->to_interval());
409409
}
410410

411411
return interval_operands;
412412
}
413413

414-
abstract_object_pointert interval_evaluate_conditional(
415-
const std::vector<interval_abstract_value_pointert> &interval_operands)
416-
const
414+
abstract_object_pointert evaluate_conditional(
415+
const std::vector<constant_interval_exprt> &interval_operands) const
417416
{
418-
auto const &condition_interval = interval_operands[0]->to_interval();
419-
auto const &true_interval = interval_operands[1]->to_interval();
420-
auto const &false_interval = interval_operands[2]->to_interval();
417+
auto const &condition_interval = interval_operands[0];
418+
auto const &true_interval = interval_operands[1];
419+
auto const &false_interval = interval_operands[2];
421420

422421
auto condition_result = condition_interval.is_definitely_true();
423422

@@ -436,12 +435,10 @@ class interval_evaluator
436435
: make_interval(false_interval);
437436
}
438437

439-
abstract_object_pointert interval_evaluate_unary_expr(
440-
const std::vector<interval_abstract_value_pointert> &interval_operands)
441-
const
438+
abstract_object_pointert evaluate_unary_expr(
439+
const std::vector<constant_interval_exprt> &interval_operands) const
442440
{
443-
const constant_interval_exprt &operand_expr =
444-
interval_operands[0]->to_interval();
441+
const constant_interval_exprt &operand_expr = interval_operands[0];
445442

446443
if(expression.id() == ID_typecast)
447444
{
@@ -509,12 +506,12 @@ class value_set_evaluator
509506
private:
510507
abstract_object_pointert transform() const
511508
{
512-
auto collective_operands = unwrap_operands();
509+
auto ranges = operands_as_ranges();
513510

514511
if(expression.id() == ID_if)
515-
return value_set_evaluate_conditional(collective_operands);
512+
return evaluate_conditional(ranges);
516513

517-
auto resulting_objects = evaluate_each_combination(collective_operands);
514+
auto resulting_objects = evaluate_each_combination(ranges);
518515

519516
return resolve_values(resulting_objects);
520517
}
@@ -565,7 +562,7 @@ class value_set_evaluator
565562
return rewritten_expr;
566563
}
567564

568-
std::vector<value_ranget> unwrap_operands() const
565+
std::vector<value_ranget> operands_as_ranges() const
569566
{
570567
auto unwrapped = std::vector<value_ranget>{};
571568

@@ -633,7 +630,7 @@ class value_set_evaluator
633630
}
634631

635632
static abstract_object_pointert
636-
value_set_evaluate_conditional(const std::vector<value_ranget> &ops)
633+
evaluate_conditional(const std::vector<value_ranget> &ops)
637634
{
638635
auto const &condition = ops[0];
639636

src/analyses/variable-sensitivity/interval_abstract_value.cpp

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -427,11 +427,6 @@ interval_abstract_valuet::index_range_implementation(const namespacet &ns) const
427427
return make_interval_index_range(interval, ns);
428428
}
429429

430-
const constant_interval_exprt &interval_abstract_valuet::get_interval() const
431-
{
432-
return interval;
433-
}
434-
435430
void interval_abstract_valuet::get_statistics(
436431
abstract_object_statisticst &statistics,
437432
abstract_object_visitedt &visited,

src/analyses/variable-sensitivity/interval_abstract_value.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -49,8 +49,6 @@ class interval_abstract_valuet : public abstract_value_objectt
4949
const class ai_baset &ai,
5050
const class namespacet &ns) const override;
5151

52-
const constant_interval_exprt &get_interval() const;
53-
5452
void get_statistics(
5553
abstract_object_statisticst &statistics,
5654
abstract_object_visitedt &visited,

unit/analyses/variable-sensitivity/eval.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,10 +56,10 @@ SCENARIO(
5656
std::dynamic_pointer_cast<const interval_abstract_valuet>(unwrapped);
5757
REQUIRE(result_as_interval);
5858
REQUIRE(
59-
result_as_interval->get_interval().get_lower() ==
59+
result_as_interval->to_interval().get_lower() ==
6060
from_integer(0, number_type));
6161
REQUIRE(
62-
result_as_interval->get_interval().get_upper() ==
62+
result_as_interval->to_interval().get_upper() ==
6363
from_integer(1, number_type));
6464
}
6565

unit/analyses/variable-sensitivity/interval_abstract_value/meet.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ SCENARIO(
7676
REQUIRE_FALSE(modified);
7777
REQUIRE_FALSE(cast_result->is_top());
7878
REQUIRE_FALSE(cast_result->is_bottom());
79-
REQUIRE(cast_result->get_interval() == interval1_10);
79+
REQUIRE(cast_result->to_interval() == interval1_10);
8080

8181
// Is optimal
8282
REQUIRE(result == op1);
@@ -143,7 +143,7 @@ SCENARIO(
143143
REQUIRE_FALSE(cast_result->is_bottom());
144144

145145
// Intersection should have this exact value
146-
REQUIRE(cast_result->get_interval() == interval2_10);
146+
REQUIRE(cast_result->to_interval() == interval2_10);
147147
}
148148
}
149149
WHEN(
@@ -178,7 +178,7 @@ SCENARIO(
178178
REQUIRE_FALSE(cast_result->is_bottom());
179179

180180
// Intersection should have this exact value
181-
REQUIRE(cast_result->get_interval() == interval2_10);
181+
REQUIRE(cast_result->to_interval() == interval2_10);
182182
}
183183
}
184184
WHEN(
@@ -213,7 +213,7 @@ SCENARIO(
213213
REQUIRE_FALSE(cast_result->is_bottom());
214214

215215
// Intersection should have this exact value
216-
REQUIRE(cast_result->get_interval() == interval11_15);
216+
REQUIRE(cast_result->to_interval() == interval11_15);
217217
}
218218
}
219219
WHEN(
@@ -249,7 +249,7 @@ SCENARIO(
249249
REQUIRE_FALSE(cast_result->is_bottom());
250250

251251
// Intersection should have this exact value
252-
REQUIRE(cast_result->get_interval() == intervalmax_max);
252+
REQUIRE(cast_result->to_interval() == intervalmax_max);
253253
}
254254
}
255255
WHEN(

0 commit comments

Comments
 (0)