https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80072

--- Comment #8 from rguenther at suse dot de <rguenther at suse dot de> ---
On Wed, 22 Mar 2017, jakub at gcc dot gnu.org wrote:

> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80072
> 
> --- Comment #7 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
> So, found a bug and its bugfix fixes the testcase, but still need to figure 
> out
> what actually was going on, if it was just that we made (correct) assumptions
> that constants won't be weirdly sorted, or if there is some other (with this
> patch latent) bug.
> 
> --- gcc/tree-ssa-reassoc.c.jj   2017-02-10 09:46:50.000000000 +0100
> +++ gcc/tree-ssa-reassoc.c      2017-03-22 13:13:33.608745625 +0100
> @@ -510,7 +510,7 @@ sort_by_operand_rank (const void *pa, co
> 
>    /* Lastly, make sure the versions that are the same go next to each
>       other.  */
> -  if ((oeb->rank - oea->rank == 0)
> +  if (oeb->rank == oea->rank
>        && TREE_CODE (oea->op) == SSA_NAME
>        && TREE_CODE (oeb->op) == SSA_NAME)
>      {
> @@ -549,7 +549,7 @@ sort_by_operand_rank (const void *pa, co
>      }
> 
>    if (oeb->rank != oea->rank)
> -    return oeb->rank - oea->rank;
> +    return oeb->rank > oea->rank ? 1 : -1;
>    else
>      return oeb->id - oea->id;
>  }
> 
> ->rank is unsigned int, and on the huge testcase it is over 0x7fffffff, so
> (int) (oeb->rank > oea->rank) doesn't do what it expects and we happily sort
> a SSA_NAME with extra high rank after constants, which e.g. means we can't
> merge them together.

Ick ;)

Patch looks obvious.  For clarity the else return oeb->id - oea->id
should probably be adjusted similarly (and id made unsigned...).

Reply via email to