On Sat, May 16, 2026 at 5:38 AM Andrew Pinski
<[email protected]> wrote:
>
> In the process of converting gswitch away from CASE_LABEL_EXPR,
> I found a place in dom where we store the whole CASE_LABEL_EXPR.
> This place only needed to store the value of the case rather than
> the whole case expression. This does that small optimization
> and adds a few comments for the next person to understand what
> is going on here. It was not obvious at my first read of the code
> what it was doing or what error_mark was being used for.
>
> Bootstrapped and tested on x86_64-linux-gnu.

OK

> gcc/ChangeLog:
>
>         * tree-ssa-dom.cc (record_edge_info): For switches
>         info only store the case low value to be recorded as
>         the only value. Add comments.
>
> Signed-off-by: Andrew Pinski <[email protected]>
> ---
>  gcc/tree-ssa-dom.cc | 17 +++++++++++++----
>  1 file changed, 13 insertions(+), 4 deletions(-)
>
> diff --git a/gcc/tree-ssa-dom.cc b/gcc/tree-ssa-dom.cc
> index 10a1c3f0b21..3be7979f528 100644
> --- a/gcc/tree-ssa-dom.cc
> +++ b/gcc/tree-ssa-dom.cc
> @@ -524,6 +524,11 @@ record_edge_info (basic_block bb)
>             {
>               int i;
>                int n_labels = gimple_switch_num_labels (switch_stmt);
> +             /* info contains NULL, error_mark_node or a value.
> +                error_mark signifies there are multiple values already.
> +                A NULL signifies there it is uninitialized.
> +                A value signifies that is the only value on that edge
> +                to that bb.  */
>               tree *info = XCNEWVEC (tree, last_basic_block_for_fn (cfun));
>
>               for (i = 0; i < n_labels; i++)
> @@ -531,23 +536,27 @@ record_edge_info (basic_block bb)
>                   tree label = gimple_switch_label (switch_stmt, i);
>                   basic_block target_bb
>                     = label_to_block (cfun, CASE_LABEL (label));
> +                 /* The default case is a case with multiple values.
> +                    If the value is already set then it has multiple values. 
>  */
>                   if (CASE_HIGH (label)
>                       || !CASE_LOW (label)
>                       || info[target_bb->index])
>                     info[target_bb->index] = error_mark_node;
>                   else
> -                   info[target_bb->index] = label;
> +                   /* Record the one value that can be on that edge to the
> +                      target_bb.  */
> +                   info[target_bb->index] = CASE_LOW (label);
>                 }
>
>               FOR_EACH_EDGE (e, ei, bb->succs)
>                 {
>                   basic_block target_bb = e->dest;
> -                 tree label = info[target_bb->index];
> +                 tree value = info[target_bb->index];
>
> -                 if (label != NULL && label != error_mark_node)
> +                 if (value != NULL && value != error_mark_node)
>                     {
>                       tree x = fold_convert_loc (loc, TREE_TYPE (index),
> -                                                CASE_LOW (label));
> +                                                value);
>                       edge_info = new class edge_info (e);
>                       edge_info->record_simple_equiv (index, x);
>                     }
> --
> 2.43.0
>

Reply via email to