On Tue, 5 Apr 2022, Jakub Jelinek wrote:

> Hi!
> 
> In the following testcase sqrt is declared as unprototyped function
> and so it depends on what type has the argument passed to it.
> If an argument of incorrect type is passed, the sqrt comparison
> simplification can create invalid GIMPLE.
> 
> The patch fixes it by punting if there is a mismatch of types.
> As I didn't want to reindent 133 lines, the first hunk contains an
> ugly hack with if (false).  If you prefer reindentation, I can do that
> too.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

So why does this get pas gimple_call_combined_fn ()?  Are those
internal functions at the point we match them?  Otherwise we
invoke gimple_builtin_call_types_compatible_p on them.  If
they are internal functions why did we rewrite the calls to them
when the types do not match?  If gimple_builtin_call_types_compatible_p
is fine then why did the frontend assign BUILT_IN_SQRT to the
function decls?

Richard.

> 2022-04-05  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/105150
>       * match.pd (sqrt (x) cmp real_cst, sqrt (x) cmp sqrt (y)): Punt
>       if sqrt operand has incompatible types.
> 
>       * gcc.dg/pr105150.c: New test.
> 
> --- gcc/match.pd.jj   2022-03-18 18:32:36.000000000 +0100
> +++ gcc/match.pd      2022-04-04 19:49:28.621934784 +0200
> @@ -4927,6 +4927,10 @@ (define_operator_list SYNC_FETCH_AND_AND
>     (simplify
>      (cmp (sq @0) REAL_CST@1)
>      (switch
> +     (if (!types_match (TREE_TYPE (@0), TREE_TYPE (@1)))
> +      /* Punt if there is a type mismatch.  */
> +      (if (false)
> +       @1))
>       (if (REAL_VALUE_NEGATIVE (TREE_REAL_CST (@1)))
>        (switch
>         /* sqrt(x) < y is always false, if y is negative.  */
> @@ -5062,7 +5066,7 @@ (define_operator_list SYNC_FETCH_AND_AND
>     /* Transform sqrt(x) cmp sqrt(y) -> x cmp y.  */
>     (simplify
>      (cmp (sq @0) (sq @1))
> -      (if (! HONOR_NANS (@0))
> +      (if (! HONOR_NANS (@0) && types_match (TREE_TYPE (@0), TREE_TYPE (@1)))
>       (cmp @0 @1))))))
>  
>  /* Optimize various special cases of (FTYPE) N CMP (FTYPE) M.  */
> --- gcc/testsuite/gcc.dg/pr105150.c.jj        2022-04-04 19:53:03.597935060 
> +0200
> +++ gcc/testsuite/gcc.dg/pr105150.c   2022-04-04 19:54:55.734370333 +0200
> @@ -0,0 +1,8 @@
> +/* PR tree-optimization/105150 */
> +/* { dg-options "-w -Ofast" } */
> +
> +#define A(name) __typeof (__builtin_##name (0)) name (); \
> +  float name##1 () { return !name (1); } \
> +  double name##2 () { return name (1.0L); }
> +#define B(name) A(name) A(name##l)
> +B (sqrt)
> 
>       Jakub
> 
> 

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

Reply via email to