aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Malcolm <dmalcolm@redhat.com>2020-01-30 15:23:40 -0500
committerDavid Malcolm <dmalcolm@redhat.com>2020-02-03 14:31:15 -0500
commit833f1e66e3a8efdbb941a44ac9e74101d771e0d5 (patch)
tree040579e351f6bb29bcfd37aa73ec740e94d52d34
parent8525d1f5f57b11fe04a97674cc2fc2b7727621d0 (diff)
downloadgcc-833f1e66e3a8efdbb941a44ac9e74101d771e0d5.zip
gcc-833f1e66e3a8efdbb941a44ac9e74101d771e0d5.tar.gz
gcc-833f1e66e3a8efdbb941a44ac9e74101d771e0d5.tar.bz2
analyzer: avoid use of fold_build2
Various places in the analyzer use fold_build2, test the result, then discard it. It's more efficient to use fold_binary, which avoids building and GC-ing a redundant tree for the cases where folding fails. gcc/analyzer/ChangeLog: * constraint-manager.cc (range::constrained_to_single_element): Replace fold_build2 with fold_binary. Remove unnecessary newline. (constraint_manager::get_or_add_equiv_class): Replace fold_build2 with fold_binary in two places, and remove out-of-date comment. (constraint_manager::eval_condition): Replace fold_build2 with fold_binary. * region-model.cc (constant_svalue::eval_condition): Likewise. (region_model::on_assignment): Likewise.
-rw-r--r--gcc/analyzer/ChangeLog11
-rw-r--r--gcc/analyzer/constraint-manager.cc15
-rw-r--r--gcc/analyzer/region-model.cc6
3 files changed, 20 insertions, 12 deletions
diff --git a/gcc/analyzer/ChangeLog b/gcc/analyzer/ChangeLog
index 5e44489..4f0d014 100644
--- a/gcc/analyzer/ChangeLog
+++ b/gcc/analyzer/ChangeLog
@@ -1,5 +1,16 @@
2020-02-03 David Malcolm <dmalcolm@redhat.com>
+ * constraint-manager.cc (range::constrained_to_single_element):
+ Replace fold_build2 with fold_binary. Remove unnecessary newline.
+ (constraint_manager::get_or_add_equiv_class): Replace fold_build2
+ with fold_binary in two places, and remove out-of-date comment.
+ (constraint_manager::eval_condition): Replace fold_build2 with
+ fold_binary.
+ * region-model.cc (constant_svalue::eval_condition): Likewise.
+ (region_model::on_assignment): Likewise.
+
+2020-02-03 David Malcolm <dmalcolm@redhat.com>
+
PR analyzer/93544
* diagnostic-manager.cc
(diagnostic_manager::prune_for_sm_diagnostic): Bulletproof
diff --git a/gcc/analyzer/constraint-manager.cc b/gcc/analyzer/constraint-manager.cc
index 4042c50..d5a6939 100644
--- a/gcc/analyzer/constraint-manager.cc
+++ b/gcc/analyzer/constraint-manager.cc
@@ -145,10 +145,9 @@ range::constrained_to_single_element (tree *out)
m_upper_bound.ensure_closed (true);
// Are they equal?
- tree comparison
- = fold_build2 (EQ_EXPR, boolean_type_node,
- m_lower_bound.m_constant,
- m_upper_bound.m_constant);
+ tree comparison = fold_binary (EQ_EXPR, boolean_type_node,
+ m_lower_bound.m_constant,
+ m_upper_bound.m_constant);
if (comparison == boolean_true_node)
{
*out = m_lower_bound.m_constant;
@@ -932,7 +931,7 @@ constraint_manager::get_or_add_equiv_class (svalue_id sid)
&& types_compatible_p (TREE_TYPE (cst),
TREE_TYPE (ec->m_constant)))
{
- tree eq = fold_build2 (EQ_EXPR, boolean_type_node,
+ tree eq = fold_binary (EQ_EXPR, boolean_type_node,
cst, ec->m_constant);
if (eq == boolean_true_node)
{
@@ -969,10 +968,8 @@ constraint_manager::get_or_add_equiv_class (svalue_id sid)
Determine the direction of the inequality, and record that
fact. */
tree lt
- = fold_build2 (LT_EXPR, boolean_type_node,
+ = fold_binary (LT_EXPR, boolean_type_node,
new_ec->m_constant, other_ec.m_constant);
- //gcc_assert (lt == boolean_true_node || lt == boolean_false_node);
- // not true for int vs float comparisons
if (lt == boolean_true_node)
add_constraint_internal (new_id, CONSTRAINT_LT, other_id);
else if (lt == boolean_false_node)
@@ -1018,7 +1015,7 @@ constraint_manager::eval_condition (equiv_class_id lhs_ec,
if (lhs_const && rhs_const)
{
tree comparison
- = fold_build2 (op, boolean_type_node, lhs_const, rhs_const);
+ = fold_binary (op, boolean_type_node, lhs_const, rhs_const);
if (comparison == boolean_true_node)
return tristate (tristate::TS_TRUE);
if (comparison == boolean_false_node)
diff --git a/gcc/analyzer/region-model.cc b/gcc/analyzer/region-model.cc
index 2cfded8..c837ec6 100644
--- a/gcc/analyzer/region-model.cc
+++ b/gcc/analyzer/region-model.cc
@@ -670,7 +670,7 @@ constant_svalue::eval_condition (constant_svalue *lhs,
if (types_compatible_p (TREE_TYPE (lhs_const), TREE_TYPE (rhs_const)))
{
tree comparison
- = fold_build2 (op, boolean_type_node, lhs_const, rhs_const);
+ = fold_binary (op, boolean_type_node, lhs_const, rhs_const);
if (comparison == boolean_true_node)
return tristate (tristate::TS_TRUE);
if (comparison == boolean_false_node)
@@ -4088,9 +4088,9 @@ region_model::on_assignment (const gassign *assign, region_model_context *ctxt)
if (tree rhs1_cst = maybe_get_constant (rhs1_sid))
if (tree rhs2_cst = maybe_get_constant (rhs2_sid))
{
- tree result = fold_build2 (op, TREE_TYPE (lhs),
+ tree result = fold_binary (op, TREE_TYPE (lhs),
rhs1_cst, rhs2_cst);
- if (CONSTANT_CLASS_P (result))
+ if (result && CONSTANT_CLASS_P (result))
{
svalue_id result_sid
= get_or_create_constant_svalue (result);