On Wed, 26 Feb 2020, Jakub Jelinek wrote:

> Hi!
> 
> The following patch does the same check the tree-ssa-strlen.c pass does
> to punt on broken builtin redeclarations.
> I agree the ultimate fix is change the C FE, but don't feel I know that part
> of the FE good enough to know all the consequences and so it might be too
> risky for stage4.
> 
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Iff then we should make this change in 
gimple_builtin_call_types_compatible_p, not in gimple_fold_builtin.
I pasted such change in another recent PR but then backed off since
this is really ugly and instead the FEs should stop claiming sth is
BUILT_IN_FOO when it is not.  I even considered doing that during
cgraph build or so if the FE side is too difficult.  We could
even use exactly the same check there.

Richard.

> 2020-02-26  Jakub Jelinek  <ja...@redhat.com>
> 
>       PR tree-optimization/93927
>       * gimple-fold.c (gimple_fold_builtin): Punt if callee has incompatible
>       prototype.
> 
>       * gcc.c-torture/compile/pr93927-1.c: New test.
>       * gcc.c-torture/compile/pr93927-2.c: New test.
> 
> --- gcc/gimple-fold.c.jj      2020-02-06 09:13:21.732085293 +0100
> +++ gcc/gimple-fold.c 2020-02-25 11:46:14.863796864 +0100
> @@ -3906,6 +3906,12 @@ gimple_fold_builtin (gimple_stmt_iterato
>    if (avoid_folding_inline_builtin (callee))
>      return false;
>  
> +  tree decl = builtin_decl_explicit (DECL_FUNCTION_CODE (callee));
> +  if (decl
> +      && decl != callee
> +      && !gimple_builtin_call_types_compatible_p (stmt, decl))
> +    return false;
> +
>    unsigned n = gimple_call_num_args (stmt);
>    enum built_in_function fcode = DECL_FUNCTION_CODE (callee);
>    switch (fcode)
> --- gcc/testsuite/gcc.c-torture/compile/pr93927-1.c.jj        2020-02-25 
> 11:47:10.983971425 +0100
> +++ gcc/testsuite/gcc.c-torture/compile/pr93927-1.c   2020-02-25 
> 11:46:43.004382966 +0100
> @@ -0,0 +1,9 @@
> +/* PR tree-optimization/93927 */
> +
> +__SIZE_TYPE__ strstr (const char *, const char *);
> +
> +char *
> +foo (char *x)
> +{
> +  return !!strstr (x, "0") ? "0" : "1";
> +}
> --- gcc/testsuite/gcc.c-torture/compile/pr93927-2.c.jj        2020-02-25 
> 11:47:13.930928081 +0100
> +++ gcc/testsuite/gcc.c-torture/compile/pr93927-2.c   2020-02-25 
> 11:46:57.304172632 +0100
> @@ -0,0 +1,9 @@
> +/* PR tree-optimization/93927 */
> +
> +__SIZE_TYPE__ strchr (const char *, int);
> +
> +char *
> +foo (char *x)
> +{
> +  return !!strchr (x, 0) ? "0" : "1";
> +}
> 
>       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