Hi,

no need to test a phi argument with itself (testing arg0 != arg1 is not 
the right test, though, so remembering the candidate index):

> @@ -1948,18 +1958,35 @@ get_continuation_for_phi (gimple phi, ao
>       until we hit the phi argument definition that dominates the other one.  
> */
>    else if (nargs >= 2)
>      {
> -      tree arg0 = PHI_ARG_DEF (phi, 0);
> -      tree arg1;
> -      unsigned i = 1;
> -      do
> +      tree arg0, arg1;
> +      unsigned i;

unsigned j;

> +      /* Find a candidate for the virtual operand which definition
> +      dominates those of all others.  */
> +      arg0 = PHI_ARG_DEF (phi, 0);

j = 0;

> +      if (!SSA_NAME_IS_DEFAULT_DEF (arg0))
> +     for (i = 1; i < nargs; ++i)
> +       {
> +         arg1 = PHI_ARG_DEF (phi, i);
> +         if (SSA_NAME_IS_DEFAULT_DEF (arg1))
> +           {
> +             arg0 = arg1;

j = i;

> +             break;
> +           }
> +         if (dominated_by_p (CDI_DOMINATORS,
> +                             gimple_bb (SSA_NAME_DEF_STMT (arg0)),
> +                             gimple_bb (SSA_NAME_DEF_STMT (arg1))))
> +           arg0 = arg1;

, j = i;

> +       }
> +
> +      /* Then pairwise reduce against the found candidate.  */
> +      for (i = 0; i < nargs; ++i)
>       {
>         arg1 = PHI_ARG_DEF (phi, i);

if (i != j)

>         arg0 = get_continuation_for_phi_1 (phi, arg0, arg1, ref, visited);
>         if (!arg0)
>           return NULL_TREE;
> -
>       }
> -      while (++i < nargs);


Ciao,
Michael.

Reply via email to