On Thu, Jan 30, 2020 at 5:19 PM David Malcolm <dmalc...@redhat.com> wrote:
>
> 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.

If these are all true integer constants, then you might want to use
tree_int_cst_compare instead of even using fold_binary/fold_build2.
Also if you are doing equal but always constant (but not always
integer ones), you could use simple_cst_equal instead.

Thanks,
Andrew Pinski

>
> 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.
> ---
>  gcc/analyzer/constraint-manager.cc | 15 ++++++---------
>  gcc/analyzer/region-model.cc       |  6 +++---
>  2 files changed, 9 insertions(+), 12 deletions(-)
>
> diff --git a/gcc/analyzer/constraint-manager.cc 
> b/gcc/analyzer/constraint-manager.cc
> index f3e31ee0830..4d138188856 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;
> @@ -930,7 +929,7 @@ constraint_manager::get_or_add_equiv_class (svalue_id sid)
>        FOR_EACH_VEC_ELT (m_equiv_classes, i, ec)
>         if (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)
>               {
> @@ -967,10 +966,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)
> @@ -1016,7 +1013,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 b546114bfd5..95d002f9c28 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)
> @@ -4070,9 +4070,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);
> --
> 2.21.0
>

Reply via email to