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)