On Tue, Aug 12, 2014 at 10:46:46AM -0700, Steve Ellcey wrote:
> --- /dev/null
> +++ b/gcc/tree-switch-shortcut.c
> +/* This file implements an optimization where, when a variable is set
> +   to a constant value and there is a path that leads from this definition
> +   to a switch statement that uses that variable as its controlling 
> expression
> +   we duplicate the blocks on this path and change the switch goto to a
> +   direct goto to the label of the switch block that control would goto based
> +   on the value of the variable.  */

Would be nice to have some short C example here in the comment.

> +static int
> +find_path_1(basic_block start_bb, basic_block end_bb, hash_set<basic_block> 
> *visited_bbs)
> +{
> +  edge_iterator ei;
> +  edge e;
> +
> +  if (start_bb == end_bb) return 1;

Sorry for pedantry, but you don't have space before ( in many places,
the find_path_1 line is too long.

> +
> +  if (!visited_bbs->add(start_bb))
> +    {
> +      FOR_EACH_EDGE (e, ei, start_bb->succs)
> +     if (find_path_1 (e->dest, end_bb, visited_bbs))
> +       return 1;
> +    }
> +    return 0;

return 0 not below if.

> +static int
> +find_path(basic_block start_bb, basic_block end_bb)

Again missing space.

> +  if (!visited_bbs.add(start_bb))

Likewise.

> +static basic_block **bbs_list_array;
> +static int *val_array;
> +static int *bbs_list_size;
> +static int max_path_count;
> +static int max_insn_count;
> +static int n_bbs_list;

For a simple pass like this, is it really necessary to add new global
variables?

> +     FOR_EACH_EDGE (e, ei, bbx->preds)
> +       {
> +         if (find_path (var_bb, e->src))
> +        {
> +                  bbs_list[n] = e->src;
> +                  n = n + 1;
> +          e_count = e_count + 1;
> +        }
> +       }

Weird indentation.

> +  if ((gimple_code (def_stmt) == GIMPLE_PHI)

Extraneous parens around the equality check.

> +       else if (arg && (TREE_CODE (arg) == SSA_NAME))

Likewise.

> +         {
> +               bbs_list[n] = gimple_phi_arg_edge (def_stmt, i)->src;
> +               process_switch (arg, switch_stmt, visited_phis, bbs_list, 
> n+1);

Weird indentation.

        Jakub

Reply via email to