tbsaunde+...@tbsaunde.org writes:
> diff --git a/gcc/loop-iv.c b/gcc/loop-iv.c
> index 57fb8c1..21c3180 100644
> --- a/gcc/loop-iv.c
> +++ b/gcc/loop-iv.c
> @@ -1860,7 +1860,6 @@ simplify_using_initial_values (struct loop *loop, enum 
> rtx_code op, rtx *expr)
>  {
>    bool expression_valid;
>    rtx head, tail, last_valid_expr;
> -  rtx_expr_list *cond_list;
>    rtx_insn *insn;
>    rtx neutral, aggr;
>    regset altered, this_altered;
> @@ -1936,7 +1935,7 @@ simplify_using_initial_values (struct loop *loop, enum 
> rtx_code op, rtx *expr)
>  
>    expression_valid = true;
>    last_valid_expr = *expr;
> -  cond_list = NULL;
> +  auto_vec<rtx> cond_list;
>    while (1)
>      {
>        insn = BB_END (e->src);

How about using "auto_vec<rtx, N>" for some small N, since we expect
cond_list to be used fairly often?

Wish I knew whether there was supposed to be a space before "<"...

> @@ -1988,39 +1988,30 @@ simplify_using_initial_values (struct loop *loop, 
> enum rtx_code op, rtx *expr)
>  
>         if (suitable_set_for_replacement (insn, &dest, &src))
>           {
> -           rtx_expr_list **pnote, **pnote_next;
> -
>             replace_in_expr (expr, dest, src);
>             if (CONSTANT_P (*expr))
>               goto out;
>  
> -           for (pnote = &cond_list; *pnote; pnote = pnote_next)
> +           unsigned int len = cond_list.length ();
> +           for (unsigned int i = len - 1; i < len; i--)
>               {
> -               rtx_expr_list *note = *pnote;
> -               rtx old_cond = XEXP (note, 0);
> +               rtx old_cond = cond_list[i];
>  
> -               pnote_next = (rtx_expr_list **)&XEXP (note, 1);
> -               replace_in_expr (&XEXP (note, 0), dest, src);
> +               replace_in_expr (&cond_list[i], dest, src);
>  
>                 /* We can no longer use a condition that has been simplified
>                    to a constant, and simplify_using_condition will abort if
>                    we try.  */
> -               if (CONSTANT_P (XEXP (note, 0)))
> -                 {
> -                   *pnote = *pnote_next;
> -                   pnote_next = pnote;
> -                   free_EXPR_LIST_node (note);
> -                 }
> +               if (CONSTANT_P (cond_list[i]))
> +                 cond_list.ordered_remove (i);

Do we really need ordered removes here and below?  Obviously it turns
the original O(1) operation into O(n), and it wasn't obvious from first
glance that the order of the conditions was relevant.

Thanks,
Richard

Reply via email to