Skip to content

Commit 9ceb95b

Browse files
authored
Merge pull request #3871 from tautschnig/symbol_exprt-constant-propagator
Add an identifier-based lookup to constant_propagator_is_constantt [blocks: #3768]
2 parents 2746997 + 4455fb5 commit 9ceb95b

File tree

2 files changed

+31
-24
lines changed

2 files changed

+31
-24
lines changed

src/analyses/constant_propagator.cpp

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -415,36 +415,42 @@ bool constant_propagator_domaint::ai_simplify(
415415
return partial_evaluate(values, condition, ns);
416416
}
417417

418-
419-
bool constant_propagator_domaint::valuest::is_constant(const exprt &expr) const
418+
class constant_propagator_is_constantt : public is_constantt
420419
{
421-
class constant_propagator_is_constantt : public is_constantt
420+
public:
421+
explicit constant_propagator_is_constantt(
422+
const replace_symbolt &replace_const)
423+
: replace_const(replace_const)
422424
{
423-
public:
424-
explicit constant_propagator_is_constantt(
425-
const replace_symbolt &replace_const)
426-
: replace_const(replace_const)
427-
{
428-
}
425+
}
429426

430-
protected:
431-
bool is_constant(const exprt &expr) const override
432-
{
433-
if(expr.id() == ID_symbol)
434-
{
435-
return replace_const.replaces_symbol(
436-
to_symbol_expr(expr).get_identifier());
437-
}
427+
bool is_constant(const irep_idt &id) const
428+
{
429+
return replace_const.replaces_symbol(id);
430+
}
438431

439-
return is_constantt::is_constant(expr);
440-
}
432+
protected:
433+
bool is_constant(const exprt &expr) const override
434+
{
435+
if(expr.id() == ID_symbol)
436+
return is_constant(to_symbol_expr(expr).get_identifier());
437+
438+
return is_constantt::is_constant(expr);
439+
}
441440

442-
const replace_symbolt &replace_const;
443-
};
441+
const replace_symbolt &replace_const;
442+
};
444443

444+
bool constant_propagator_domaint::valuest::is_constant(const exprt &expr) const
445+
{
445446
return constant_propagator_is_constantt(replace_const)(expr);
446447
}
447448

449+
bool constant_propagator_domaint::valuest::is_constant(const irep_idt &id) const
450+
{
451+
return constant_propagator_is_constantt(replace_const).is_constant(id);
452+
}
453+
448454
/// Do not call this when iterating over replace_const.expr_map!
449455
bool constant_propagator_domaint::valuest::set_to_top(
450456
const symbol_exprt &symbol_expr)
@@ -649,10 +655,9 @@ bool constant_propagator_domaint::partial_evaluate(
649655
// if the current rounding mode is top we can
650656
// still get a non-top result by trying all rounding
651657
// modes and checking if the results are all the same
652-
if(!known_values.is_constant(symbol_exprt(ID_cprover_rounding_mode_str)))
653-
{
658+
if(!known_values.is_constant(ID_cprover_rounding_mode_str))
654659
return partial_evaluate_with_all_rounding_modes(known_values, expr, ns);
655-
}
660+
656661
return replace_constants_and_simplify(known_values, expr, ns);
657662
}
658663

src/analyses/constant_propagator.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class constant_propagator_domaint:public ai_domain_baset
125125

126126
bool is_constant(const exprt &expr) const;
127127

128+
bool is_constant(const irep_idt &id) const;
129+
128130
bool is_empty() const
129131
{
130132
return replace_const.empty();

0 commit comments

Comments
 (0)