On Tue, 12 Nov 2019, Jakub Jelinek wrote:

> Hi!
> 
> The testcase from the PR ICEs on rs6000.  For __builtin_isunordered etc.
> the folding makes sure that there is no *ORDERED_EXPR etc. in the IL
> if !HONOR_NANS, but the complex multiplication can emit it when mixing
> -Ofast with -fno-cx-limited-range.
> The following patch makes sure we don't emit it even in that case.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

OK, but IMHO it is not a good idea to assert UNORDERED_EXPR cannot
appear with !HONOR_NANS, is it?

Richard.

> I'll defer the addition of the testcase and rs6000 changes to Segher.
> 
> 2019-11-11  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR target/92449
>       * tree-complex.c (expand_complex_multiplication): If !HONOR_NANS,
>       don't emit UNORDERED_EXPR guarded libcall.  Formatting fixes.
> 
> --- gcc/tree-complex.c.jj     2019-01-10 11:43:02.252577041 +0100
> +++ gcc/tree-complex.c        2019-11-11 20:26:28.585315282 +0100
> @@ -1144,6 +1144,16 @@ expand_complex_multiplication (gimple_st
>             return;
>           }
>  
> +       if (!HONOR_NANS (inner_type))
> +         {
> +           /* If we are not worrying about NaNs expand to
> +              (ar*br - ai*bi) + i(ar*bi + br*ai) directly.  */
> +           expand_complex_multiplication_components (gsi, inner_type,
> +                                                     ar, ai, br, bi,
> +                                                     &rr, &ri);
> +           break;
> +         }
> +
>         /* Else, expand x = a * b into
>            x = (ar*br - ai*bi) + i(ar*bi + br*ai);
>            if (isunordered (__real__ x, __imag__ x))
> @@ -1151,7 +1161,7 @@ expand_complex_multiplication (gimple_st
>  
>         tree tmpr, tmpi;
>         expand_complex_multiplication_components (gsi, inner_type, ar, ai,
> -                                                  br, bi, &tmpr, &tmpi);
> +                                                 br, bi, &tmpr, &tmpi);
>  
>         gimple *check
>           = gimple_build_cond (UNORDERED_EXPR, tmpr, tmpi,
> @@ -1167,13 +1177,12 @@ expand_complex_multiplication (gimple_st
>           = insert_cond_bb (gsi_bb (*gsi), gsi_stmt (*gsi), check,
>                             profile_probability::very_unlikely ());
>  
> -
>         gimple_stmt_iterator cond_bb_gsi = gsi_last_bb (cond_bb);
>         gsi_insert_after (&cond_bb_gsi, gimple_build_nop (), GSI_NEW_STMT);
>  
>         tree libcall_res
>           = expand_complex_libcall (&cond_bb_gsi, type, ar, ai, br,
> -                                    bi, MULT_EXPR, false);
> +                                   bi, MULT_EXPR, false);
>         tree cond_real = gimplify_build1 (&cond_bb_gsi, REALPART_EXPR,
>                                           inner_type, libcall_res);
>         tree cond_imag = gimplify_build1 (&cond_bb_gsi, IMAGPART_EXPR,
> @@ -1190,20 +1199,18 @@ expand_complex_multiplication (gimple_st
>         edge orig_to_join = find_edge (orig_bb, join_bb);
>  
>         gphi *real_phi = create_phi_node (rr, gsi_bb (*gsi));
> -       add_phi_arg (real_phi, cond_real, cond_to_join,
> -                     UNKNOWN_LOCATION);
> +       add_phi_arg (real_phi, cond_real, cond_to_join, UNKNOWN_LOCATION);
>         add_phi_arg (real_phi, tmpr, orig_to_join, UNKNOWN_LOCATION);
>  
>         gphi *imag_phi = create_phi_node (ri, gsi_bb (*gsi));
> -       add_phi_arg (imag_phi, cond_imag, cond_to_join,
> -                     UNKNOWN_LOCATION);
> +       add_phi_arg (imag_phi, cond_imag, cond_to_join, UNKNOWN_LOCATION);
>         add_phi_arg (imag_phi, tmpi, orig_to_join, UNKNOWN_LOCATION);
>       }
>        else
>       /* If we are not worrying about NaNs expand to
>         (ar*br - ai*bi) + i(ar*bi + br*ai) directly.  */
>       expand_complex_multiplication_components (gsi, inner_type, ar, ai,
> -                                                   br, bi, &rr, &ri);
> +                                               br, bi, &rr, &ri);
>        break;
>  
>      default:
> 
>       Jakub
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to