c++: Fix handling of internal fn calls in statement expressions [PR94385]

Message ID 20200329104259.GX2156@tucnak
State New
Headers show
Series
  • c++: Fix handling of internal fn calls in statement expressions [PR94385]
Related show

Commit Message

Iain Buclaw via Gcc-patches March 29, 2020, 10:42 a.m.
Hi!

The following testcase ICEs, because the FE when processing the statement
expression changes the .VEC_CONVERT internal fn CALL_EXPR into .PHI call.
That is because the internal fn call is recorded in the base.u.ifn
field, which overlaps base.u.bits.lang_flag_1 which is used for
STMT_IS_FULL_EXPR_P, so this essentially does ifn |= 2 on little-endian.
STMT_IS_FULL_EXPR_P bit is used in:
cp-gimplify.c-  if (STATEMENT_CODE_P (code))
cp-gimplify.c-    {
cp-gimplify.c-      saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();
cp-gimplify.c-      current_stmt_tree ()->stmts_are_full_exprs_p
cp-gimplify.c:        = STMT_IS_FULL_EXPR_P (*expr_p);
cp-gimplify.c-    }
and
pt.c-  if (STATEMENT_CODE_P (TREE_CODE (t)))
pt.c:    current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t);
so besides being wrong on some other codes, it actually isn't beneficial at
all to set it on anything else, so the following patch restricts it to
trees with STATEMENT_CODE_P TREE_CODE.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

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

	PR c++/94385
	* semantics.c (add_stmt): Only set STMT_IS_FULL_EXPR_P on trees with
	STATEMENT_CODE_P code.


	Jakub

Comments

Iain Buclaw via Gcc-patches March 30, 2020, 8:44 p.m. | #1
On 3/29/20 6:42 AM, Jakub Jelinek wrote:
> Hi!

> 

> The following testcase ICEs, because the FE when processing the statement

> expression changes the .VEC_CONVERT internal fn CALL_EXPR into .PHI call.

> That is because the internal fn call is recorded in the base.u.ifn

> field, which overlaps base.u.bits.lang_flag_1 which is used for

> STMT_IS_FULL_EXPR_P, so this essentially does ifn |= 2 on little-endian.

> STMT_IS_FULL_EXPR_P bit is used in:

> cp-gimplify.c-  if (STATEMENT_CODE_P (code))

> cp-gimplify.c-    {

> cp-gimplify.c-      saved_stmts_are_full_exprs_p = stmts_are_full_exprs_p ();

> cp-gimplify.c-      current_stmt_tree ()->stmts_are_full_exprs_p

> cp-gimplify.c:        = STMT_IS_FULL_EXPR_P (*expr_p);

> cp-gimplify.c-    }

> and

> pt.c-  if (STATEMENT_CODE_P (TREE_CODE (t)))

> pt.c:    current_stmt_tree ()->stmts_are_full_exprs_p = STMT_IS_FULL_EXPR_P (t);

> so besides being wrong on some other codes, it actually isn't beneficial at

> all to set it on anything else, so the following patch restricts it to

> trees with STATEMENT_CODE_P TREE_CODE.

> 

> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?


OK.

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

> 

> 	PR c++/94385

> 	* semantics.c (add_stmt): Only set STMT_IS_FULL_EXPR_P on trees with

> 	STATEMENT_CODE_P code.

> 

> --- gcc/cp/semantics.c.jj	2020-03-28 10:19:14.898349472 +0100

> +++ gcc/cp/semantics.c	2020-03-29 00:02:40.648258781 +0100

> @@ -380,7 +380,8 @@ add_stmt (tree t)

>   

>         /* When we expand a statement-tree, we must know whether or not the

>   	 statements are full-expressions.  We record that fact here.  */

> -      STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();

> +      if (STATEMENT_CODE_P (TREE_CODE (t)))

> +	STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();

>       }

>   

>     if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)

> --- gcc/testsuite/c-c++-common/pr94385.c.jj	2020-03-29 00:05:23.402823607 +0100

> +++ gcc/testsuite/c-c++-common/pr94385.c	2020-03-29 00:05:08.149051828 +0100

> @@ -0,0 +1,12 @@

> +/* PR c++/94385 */

> +/* { dg-do compile } */

> +/* { dg-options "" } */

> +

> +typedef int V __attribute__((__vector_size__(16)));

> +typedef float W __attribute__((__vector_size__(16)));

> +

> +void

> +foo (W *x, V *y)

> +{

> +  *y = (({ __builtin_convertvector (*x, V); }));

> +}

> 

> 	Jakub

>

Patch

--- gcc/cp/semantics.c.jj	2020-03-28 10:19:14.898349472 +0100
+++ gcc/cp/semantics.c	2020-03-29 00:02:40.648258781 +0100
@@ -380,7 +380,8 @@  add_stmt (tree t)
 
       /* When we expand a statement-tree, we must know whether or not the
 	 statements are full-expressions.  We record that fact here.  */
-      STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
+      if (STATEMENT_CODE_P (TREE_CODE (t)))
+	STMT_IS_FULL_EXPR_P (t) = stmts_are_full_exprs_p ();
     }
 
   if (code == LABEL_EXPR || code == CASE_LABEL_EXPR)
--- gcc/testsuite/c-c++-common/pr94385.c.jj	2020-03-29 00:05:23.402823607 +0100
+++ gcc/testsuite/c-c++-common/pr94385.c	2020-03-29 00:05:08.149051828 +0100
@@ -0,0 +1,12 @@ 
+/* PR c++/94385 */
+/* { dg-do compile } */
+/* { dg-options "" } */
+
+typedef int V __attribute__((__vector_size__(16)));
+typedef float W __attribute__((__vector_size__(16)));
+
+void
+foo (W *x, V *y)
+{
+  *y = (({ __builtin_convertvector (*x, V); }));
+}