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

Marek Polacek <mpolacek at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|tree-optimization           |middle-end
   Target Milestone|---                         |5.5
            Summary|Incorrect behaviour at -O0  |[5/6/7/8 Regression]
                   |(conditional operator)      |Incorrect behaviour at -O0
                   |                            |(conditional operator)

--- Comment #9 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Marek Polacek from comment #8)
> I wonder if I could just
> 
> --- a/gcc/fold-const.c
> +++ b/gcc/fold-const.c
> @@ -3401,14 +3401,14 @@ operand_equal_for_comparison_p (tree arg0, tree
> arg1, tree other)
>  
>    primarg1 = get_narrower (arg1, &unsignedp1);
>    primother = get_narrower (other, &unsignedpo);
> +  tree type = TREE_TYPE (arg0);
>  
>    correct_width = TYPE_PRECISION (TREE_TYPE (arg1));
>    if (unsignedp1 == unsignedpo
> +      && TYPE_PRECISION (TREE_TYPE (primarg1)) == TYPE_PRECISION (type)
>        && TYPE_PRECISION (TREE_TYPE (primarg1)) < correct_width
>        && TYPE_PRECISION (TREE_TYPE (primother)) < correct_width)
>      {
> -      tree type = TREE_TYPE (arg0);
> -
>        /* Make sure shorter operand is extended the right way
>      to match the longer operand.  */
>        primarg1 = fold_convert (signed_or_unsigned_type_for
> 
> so far it seems to work.

Looks a bit too conservative to me, without explanation what exactly goes wrong
here.  The code might be confused where it does the extension.

Are there any testcases that break when we change operand_equal_for_comparison
to just do operand_equal_p?

Reply via email to