gimple-fold: Verify builtin prototype before folding [PR93927]

Message ID 20200226101345.GU2155@tucnak
State New
Headers show
Series
  • gimple-fold: Verify builtin prototype before folding [PR93927]
Related show

Commit Message

Jakub Jelinek Feb. 26, 2020, 10:13 a.m.
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?

2020-02-26  Jakub Jelinek  <jakub@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.


	Jakub

Comments

Richard Biener Feb. 26, 2020, 10:29 a.m. | #1
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  <jakub@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 <rguenther@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)
Jakub Jelinek March 3, 2020, 6:59 a.m. | #2
On Wed, Feb 26, 2020 at 11:29:18AM +0100, Richard Biener wrote:
> > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?


This got fixed with Martin's C FE change, so I've just committed
the testcases as obvious to trunk.

2020-03-03  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/93927
	* gcc.c-torture/compile/pr93927-1.c: New test.
	* gcc.c-torture/compile/pr93927-2.c: New test.

--- 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

Patch

--- 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";
+}