On Tue, Nov 11, 2014 at 4:51 AM, Patrick Palka <patr...@parcs.ath.cx> wrote:
> Hi,
>
> This patch tweaks the VRP code to simply inspect the need_assert_for
> bitmap when determining whether any asserts need to be inserted.
> Consequently we no longer have to manually keep track of whether a call
> to register_new_assert_for() was made.
>
> This patch is an updated version of a patch that was approved a few
> months ago but was never committed.  Bootstrapped and regtested on
> x86_64-unknown-linux-gnu with no new regressions.  Is it OK to commit?

Ok.

Thanks,
Richard.

> 2014-08-13  Patrick Palka  <ppa...@gcc.gnu.org>
>
>         * tree-vrp.c (register_edge_assert_for_2): Change return type to
>         void and adjust accordingly.
>         (register_edge_assert_for_1): Likewise.
>         (register_edge_assert_for): Likewise.
>         (find_conditional_asserts): Likewise.
>         (find_switch_asserts): Likewise.
>         (find_assert_locations_1): Likewise.
>         (find_assert_locations): Likewise.
>         (insert_range_insertions): Inspect the need_assert_for bitmap.
> ---
>  gcc/tree-vrp.c | 157 
> ++++++++++++++++++---------------------------------------
>  1 file changed, 49 insertions(+), 108 deletions(-)
>
> diff --git a/gcc/tree-vrp.c b/gcc/tree-vrp.c
> index 4e4ebe0..f0a4382 100644
> --- a/gcc/tree-vrp.c
> +++ b/gcc/tree-vrp.c
> @@ -4977,32 +4977,27 @@ masked_increment (const wide_int &val_in, const 
> wide_int &mask,
>
>  /* Try to register an edge assertion for SSA name NAME on edge E for
>     the condition COND contributing to the conditional jump pointed to by BSI.
> -   Invert the condition COND if INVERT is true.
> -   Return true if an assertion for NAME could be registered.  */
> +   Invert the condition COND if INVERT is true.  */
>
> -static bool
> +static void
>  register_edge_assert_for_2 (tree name, edge e, gimple_stmt_iterator bsi,
>                             enum tree_code cond_code,
>                             tree cond_op0, tree cond_op1, bool invert)
>  {
>    tree val;
>    enum tree_code comp_code;
> -  bool retval = false;
>
>    if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
>                                                 cond_op0,
>                                                 cond_op1,
>                                                 invert, &comp_code, &val))
> -    return false;
> +    return;
>
>    /* Only register an ASSERT_EXPR if NAME was found in the sub-graph
>       reachable from E.  */
>    if (live_on_edge (e, name)
>        && !has_single_use (name))
> -    {
> -      register_new_assert_for (name, name, comp_code, val, NULL, e, bsi);
> -      retval = true;
> -    }
> +    register_new_assert_for (name, name, comp_code, val, NULL, e, bsi);
>
>    /* In the case of NAME <= CST and NAME being defined as
>       NAME = (unsigned) NAME2 + CST2 we can assert NAME2 >= -CST2
> @@ -5063,8 +5058,6 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>             }
>
>           register_new_assert_for (name3, tmp, comp_code, val, NULL, e, bsi);
> -
> -         retval = true;
>         }
>
>        /* If name2 is used later, create an ASSERT_EXPR for it.  */
> @@ -5094,8 +5087,6 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>             }
>
>           register_new_assert_for (name2, tmp, comp_code, val, NULL, e, bsi);
> -
> -         retval = true;
>         }
>      }
>
> @@ -5133,7 +5124,6 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>               cst = int_const_binop (code, val, cst);
>               register_new_assert_for (name2, name2, comp_code, cst,
>                                        NULL, e, bsi);
> -             retval = true;
>             }
>         }
>      }
> @@ -5197,8 +5187,6 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>
>               register_new_assert_for (name2, tmp, new_comp_code, cst, NULL,
>                                        e, bsi);
> -
> -             retval = true;
>             }
>         }
>
> @@ -5276,7 +5264,6 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>
>               register_new_assert_for (name2, tmp, new_comp_code, new_val,
>                                        NULL, e, bsi);
> -             retval = true;
>             }
>         }
>
> @@ -5297,8 +5284,7 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>               && TREE_CODE (TREE_TYPE (val)) == INTEGER_TYPE
>               && TYPE_UNSIGNED (TREE_TYPE (val))
>               && TYPE_PRECISION (TREE_TYPE (gimple_assign_rhs1 (def_stmt)))
> -                > prec
> -             && !retval))
> +                > prec))
>         {
>           name2 = gimple_assign_rhs1 (def_stmt);
>           if (rhs_code == BIT_AND_EXPR)
> @@ -5522,13 +5508,10 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>
>                     register_new_assert_for (names[i], tmp, LE_EXPR,
>                                              new_val, NULL, e, bsi);
> -                   retval = true;
>                   }
>             }
>         }
>      }
> -
> -  return retval;
>  }
>
>  /* OP is an operand of a truth value expression which is known to have
> @@ -5538,18 +5521,17 @@ register_edge_assert_for_2 (tree name, edge e, 
> gimple_stmt_iterator bsi,
>     If CODE is EQ_EXPR, then we want to register OP is zero (false),
>     if CODE is NE_EXPR, then we want to register OP is nonzero (true).   */
>
> -static bool
> +static void
>  register_edge_assert_for_1 (tree op, enum tree_code code,
>                             edge e, gimple_stmt_iterator bsi)
>  {
> -  bool retval = false;
>    gimple op_def;
>    tree val;
>    enum tree_code rhs_code;
>
>    /* We only care about SSA_NAMEs.  */
>    if (TREE_CODE (op) != SSA_NAME)
> -    return false;
> +    return;
>
>    /* We know that OP will have a zero or nonzero value.  If OP is used
>       more than once go ahead and register an assert for OP.  */
> @@ -5558,7 +5540,6 @@ register_edge_assert_for_1 (tree op, enum tree_code 
> code,
>      {
>        val = build_int_cst (TREE_TYPE (op), 0);
>        register_new_assert_for (op, op, code, val, NULL, e, bsi);
> -      retval = true;
>      }
>
>    /* Now look at how OP is set.  If it's set from a comparison,
> @@ -5566,7 +5547,7 @@ register_edge_assert_for_1 (tree op, enum tree_code 
> code,
>       to register information about the operands of that assignment.  */
>    op_def = SSA_NAME_DEF_STMT (op);
>    if (gimple_code (op_def) != GIMPLE_ASSIGN)
> -    return retval;
> +    return;
>
>    rhs_code = gimple_assign_rhs_code (op_def);
>
> @@ -5577,11 +5558,9 @@ register_edge_assert_for_1 (tree op, enum tree_code 
> code,
>        tree op1 = gimple_assign_rhs2 (op_def);
>
>        if (TREE_CODE (op0) == SSA_NAME)
> -        retval |= register_edge_assert_for_2 (op0, e, bsi, rhs_code, op0, 
> op1,
> -                                             invert);
> +        register_edge_assert_for_2 (op0, e, bsi, rhs_code, op0, op1, invert);
>        if (TREE_CODE (op1) == SSA_NAME)
> -        retval |= register_edge_assert_for_2 (op1, e, bsi, rhs_code, op0, 
> op1,
> -                                             invert);
> +        register_edge_assert_for_2 (op1, e, bsi, rhs_code, op0, op1, invert);
>      }
>    else if ((code == NE_EXPR
>             && gimple_assign_rhs_code (op_def) == BIT_AND_EXPR)
> @@ -5593,24 +5572,22 @@ register_edge_assert_for_1 (tree op, enum tree_code 
> code,
>        tree op1 = gimple_assign_rhs2 (op_def);
>        if (TREE_CODE (op0) == SSA_NAME
>           && has_single_use (op0))
> -       retval |= register_edge_assert_for_1 (op0, code, e, bsi);
> +       register_edge_assert_for_1 (op0, code, e, bsi);
>        if (TREE_CODE (op1) == SSA_NAME
>           && has_single_use (op1))
> -       retval |= register_edge_assert_for_1 (op1, code, e, bsi);
> +       register_edge_assert_for_1 (op1, code, e, bsi);
>      }
>    else if (gimple_assign_rhs_code (op_def) == BIT_NOT_EXPR
>            && TYPE_PRECISION (TREE_TYPE (gimple_assign_lhs (op_def))) == 1)
>      {
>        /* Recurse, flipping CODE.  */
>        code = invert_tree_comparison (code, false);
> -      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
> -                                           code, e, bsi);
> +      register_edge_assert_for_1 (gimple_assign_rhs1 (op_def), code, e, bsi);
>      }
>    else if (gimple_assign_rhs_code (op_def) == SSA_NAME)
>      {
>        /* Recurse through the copy.  */
> -      retval |= register_edge_assert_for_1 (gimple_assign_rhs1 (op_def),
> -                                           code, e, bsi);
> +      register_edge_assert_for_1 (gimple_assign_rhs1 (op_def), code, e, bsi);
>      }
>    else if (CONVERT_EXPR_CODE_P (gimple_assign_rhs_code (op_def)))
>      {
> @@ -5620,40 +5597,37 @@ register_edge_assert_for_1 (tree op, enum tree_code 
> code,
>        if (INTEGRAL_TYPE_P (TREE_TYPE (rhs))
>           && (TYPE_PRECISION (TREE_TYPE (rhs))
>               <= TYPE_PRECISION (TREE_TYPE (op))))
> -       retval |= register_edge_assert_for_1 (rhs, code, e, bsi);
> +       register_edge_assert_for_1 (rhs, code, e, bsi);
>      }
> -
> -  return retval;
>  }
>
>  /* Try to register an edge assertion for SSA name NAME on edge E for
> -   the condition COND contributing to the conditional jump pointed to by SI.
> -   Return true if an assertion for NAME could be registered.  */
> +   the condition COND contributing to the conditional jump pointed to by
> +   SI.  */
>
> -static bool
> +static void
>  register_edge_assert_for (tree name, edge e, gimple_stmt_iterator si,
>                           enum tree_code cond_code, tree cond_op0,
>                           tree cond_op1)
>  {
>    tree val;
>    enum tree_code comp_code;
> -  bool retval = false;
>    bool is_else_edge = (e->flags & EDGE_FALSE_VALUE) != 0;
>
>    /* Do not attempt to infer anything in names that flow through
>       abnormal edges.  */
>    if (SSA_NAME_OCCURS_IN_ABNORMAL_PHI (name))
> -    return false;
> +    return;
>
>    if (!extract_code_and_val_from_cond_with_ops (name, cond_code,
>                                                 cond_op0, cond_op1,
>                                                 is_else_edge,
>                                                 &comp_code, &val))
> -    return false;
> +    return;
>
>    /* Register ASSERT_EXPRs for name.  */
> -  retval |= register_edge_assert_for_2 (name, e, si, cond_code, cond_op0,
> -                                       cond_op1, is_else_edge);
> +  register_edge_assert_for_2 (name, e, si, cond_code, cond_op0,
> +                             cond_op1, is_else_edge);
>
>
>    /* If COND is effectively an equality test of an SSA_NAME against
> @@ -5673,8 +5647,8 @@ register_edge_assert_for (tree name, edge e, 
> gimple_stmt_iterator si,
>         {
>           tree op0 = gimple_assign_rhs1 (def_stmt);
>           tree op1 = gimple_assign_rhs2 (def_stmt);
> -         retval |= register_edge_assert_for_1 (op0, NE_EXPR, e, si);
> -         retval |= register_edge_assert_for_1 (op1, NE_EXPR, e, si);
> +         register_edge_assert_for_1 (op0, NE_EXPR, e, si);
> +         register_edge_assert_for_1 (op1, NE_EXPR, e, si);
>         }
>      }
>
> @@ -5695,12 +5669,10 @@ register_edge_assert_for (tree name, edge e, 
> gimple_stmt_iterator si,
>         {
>           tree op0 = gimple_assign_rhs1 (def_stmt);
>           tree op1 = gimple_assign_rhs2 (def_stmt);
> -         retval |= register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
> -         retval |= register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
> +         register_edge_assert_for_1 (op0, EQ_EXPR, e, si);
> +         register_edge_assert_for_1 (op1, EQ_EXPR, e, si);
>         }
>      }
> -
> -  return retval;
>  }
>
>
> @@ -5712,17 +5684,15 @@ register_edge_assert_for (tree name, edge e, 
> gimple_stmt_iterator si,
>     the predicate operands, an assert location node is added to the
>     list of assertions for the corresponding operands.  */
>
> -static bool
> +static void
>  find_conditional_asserts (basic_block bb, gimple last)
>  {
> -  bool need_assert;
>    gimple_stmt_iterator bsi;
>    tree op;
>    edge_iterator ei;
>    edge e;
>    ssa_op_iter iter;
>
> -  need_assert = false;
>    bsi = gsi_for_stmt (last);
>
>    /* Look for uses of the operands in each of the sub-graphs
> @@ -5737,15 +5707,11 @@ find_conditional_asserts (basic_block bb, gimple last)
>        /* Register the necessary assertions for each operand in the
>          conditional predicate.  */
>        FOR_EACH_SSA_TREE_OPERAND (op, last, iter, SSA_OP_USE)
> -       {
> -         need_assert |= register_edge_assert_for (op, e, bsi,
> -                                                  gimple_cond_code (last),
> -                                                  gimple_cond_lhs (last),
> -                                                  gimple_cond_rhs (last));
> -       }
> +       register_edge_assert_for (op, e, bsi,
> +                                 gimple_cond_code (last),
> +                                 gimple_cond_lhs (last),
> +                                 gimple_cond_rhs (last));
>      }
> -
> -  return need_assert;
>  }
>
>  struct case_info
> @@ -5790,10 +5756,9 @@ compare_case_labels (const void *p1, const void *p2)
>     the predicate operands, an assert location node is added to the
>     list of assertions for the corresponding operands.  */
>
> -static bool
> +static void
>  find_switch_asserts (basic_block bb, gimple last)
>  {
> -  bool need_assert;
>    gimple_stmt_iterator bsi;
>    tree op;
>    edge e;
> @@ -5806,11 +5771,10 @@ find_switch_asserts (basic_block bb, gimple last)
>    volatile unsigned int idx;
>  #endif
>
> -  need_assert = false;
>    bsi = gsi_for_stmt (last);
>    op = gimple_switch_index (last);
>    if (TREE_CODE (op) != SSA_NAME)
> -    return false;
> +    return;
>
>    /* Build a vector of case labels sorted by destination label.  */
>    ci = XNEWVEC (struct case_info, n);
> @@ -5857,22 +5821,15 @@ find_switch_asserts (basic_block bb, gimple last)
>
>        /* Register the necessary assertions for the operand in the
>          SWITCH_EXPR.  */
> -      need_assert |= register_edge_assert_for (op, e, bsi,
> -                                              max ? GE_EXPR : EQ_EXPR,
> -                                              op,
> -                                              fold_convert (TREE_TYPE (op),
> -                                                            min));
> +      register_edge_assert_for (op, e, bsi,
> +                               max ? GE_EXPR : EQ_EXPR,
> +                               op, fold_convert (TREE_TYPE (op), min));
>        if (max)
> -       {
> -         need_assert |= register_edge_assert_for (op, e, bsi, LE_EXPR,
> -                                                  op,
> -                                                  fold_convert (TREE_TYPE 
> (op),
> -                                                                max));
> -       }
> +       register_edge_assert_for (op, e, bsi, LE_EXPR, op,
> +                                 fold_convert (TREE_TYPE (op), max));
>      }
>
>    XDELETEVEC (ci);
> -  return need_assert;
>  }
>
>
> @@ -5933,20 +5890,14 @@ find_switch_asserts (basic_block bb, gimple last)
>     registered assertions to prevent adding unnecessary assertions.
>     For instance, if a pointer P_4 is dereferenced more than once in a
>     dominator tree, only the location dominating all the dereference of
> -   P_4 will receive an ASSERT_EXPR.
> +   P_4 will receive an ASSERT_EXPR.  */
>
> -   If this function returns true, then it means that there are names
> -   for which we need to generate ASSERT_EXPRs.  Those assertions are
> -   inserted by process_assert_insertions.  */
> -
> -static bool
> +static void
>  find_assert_locations_1 (basic_block bb, sbitmap live)
>  {
>    gimple_stmt_iterator si;
>    gimple last;
> -  bool need_assert;
>
> -  need_assert = false;
>    last = last_stmt (bb);
>
>    /* If BB's last statement is a conditional statement involving integer
> @@ -5955,14 +5906,14 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
>        && gimple_code (last) == GIMPLE_COND
>        && !fp_predicate (last)
>        && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
> -    need_assert |= find_conditional_asserts (bb, last);
> +    find_conditional_asserts (bb, last);
>
>    /* If BB's last statement is a switch statement involving integer
>       operands, determine if we need to add ASSERT_EXPRs.  */
>    if (last
>        && gimple_code (last) == GIMPLE_SWITCH
>        && !ZERO_SSA_OPERANDS (last, SSA_OP_USE))
> -    need_assert |= find_switch_asserts (bb, last);
> +    find_switch_asserts (bb, last);
>
>    /* Traverse all the statements in BB marking used names and looking
>       for statements that may infer assertions for their used operands.  */
> @@ -6019,16 +5970,12 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
>                          operand of the NOP_EXPR after SI, not after the
>                          conversion.  */
>                       if (! has_single_use (t))
> -                       {
> -                         register_new_assert_for (t, t, comp_code, value,
> -                                                  bb, NULL, si);
> -                         need_assert = true;
> -                       }
> +                       register_new_assert_for (t, t, comp_code, value,
> +                                                bb, NULL, si);
>                     }
>                 }
>
>               register_new_assert_for (op, op, comp_code, value, bb, NULL, 
> si);
> -             need_assert = true;
>             }
>         }
>
> @@ -6059,22 +6006,18 @@ find_assert_locations_1 (basic_block bb, sbitmap live)
>
>        bitmap_clear_bit (live, SSA_NAME_VERSION (res));
>      }
> -
> -  return need_assert;
>  }
>
>  /* Do an RPO walk over the function computing SSA name liveness
> -   on-the-fly and deciding on assert expressions to insert.
> -   Returns true if there are assert expressions to be inserted.  */
> +   on-the-fly and deciding on assert expressions to insert.  */
>
> -static bool
> +static void
>  find_assert_locations (void)
>  {
>    int *rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
>    int *bb_rpo = XNEWVEC (int, last_basic_block_for_fn (cfun));
>    int *last_rpo = XCNEWVEC (int, last_basic_block_for_fn (cfun));
>    int rpo_cnt, i;
> -  bool need_asserts;
>
>    live = XCNEWVEC (sbitmap, last_basic_block_for_fn (cfun));
>    rpo_cnt = pre_and_rev_post_order_compute (NULL, rpo, false);
> @@ -6108,7 +6051,6 @@ find_assert_locations (void)
>         }
>      }
>
> -  need_asserts = false;
>    for (i = rpo_cnt - 1; i >= 0; --i)
>      {
>        basic_block bb = BASIC_BLOCK_FOR_FN (cfun, rpo[i]);
> @@ -6123,7 +6065,7 @@ find_assert_locations (void)
>
>        /* Process BB and update the live information with uses in
>           this block.  */
> -      need_asserts |= find_assert_locations_1 (bb, live[rpo[i]]);
> +      find_assert_locations_1 (bb, live[rpo[i]]);
>
>        /* Merge liveness into the predecessor blocks and free it.  */
>        if (!bitmap_empty_p (live[rpo[i]]))
> @@ -6174,8 +6116,6 @@ find_assert_locations (void)
>      if (live[i])
>        sbitmap_free (live[i]);
>    XDELETEVEC (live);
> -
> -  return need_asserts;
>  }
>
>  /* Create an ASSERT_EXPR for NAME and insert it in the location
> @@ -6311,7 +6251,8 @@ insert_range_assertions (void)
>
>    calculate_dominance_info (CDI_DOMINATORS);
>
> -  if (find_assert_locations ())
> +  find_assert_locations ();
> +  if (!bitmap_empty_p (need_assert_for))
>      {
>        process_assert_insertions ();
>        update_ssa (TODO_update_ssa_no_phi);
> --
> 2.2.0.rc1.16.g6066a7e
>

Reply via email to