[PATCH] FIx up ANNOTATE_EXPR gimplification (PR middle-end/59706)

Richard Biener rguenther@suse.de
Fri Jan 17 20:28:00 GMT 2014


Jakub Jelinek <jakub@redhat.com> wrote:
>Hi!
>
>When gimplifying ANNOTATE_EXPR, gimplify_expr used create_tmp_var_raw,
>which unfortunately (among tons of other desirable things) doesn't set
>DECL_CONTEXT on the temporary var and tree-nested.c then ICEs on it
>because of that.  The following patch fixes that.  Unfortunately,
>on the second (invalid) testcase this started to ICE during error
>recovery,
>so the patch emits the IFN_ANNOTATE internal call only if the cond
>doesn't
>have obviously bogus type.
>
>Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?

Ok.

Thanks,
Richard.

>2014-01-17  Jakub Jelinek  <jakub@redhat.com>
>
>	PR middle-end/59706
>	* gimplify.c (gimplify_expr): Use create_tmp_var
>	instead of create_tmp_var_raw.  If cond doesn't have
>	integral type, don't add the IFN_ANNOTATE builtin at all.
>
>	* gfortran.dg/pr59706.f90: New test.
>	* g++.dg/ext/pr59706.C: New test.
>
>--- gcc/gimplify.c.jj	2014-01-08 10:23:24.000000000 +0100
>+++ gcc/gimplify.c	2014-01-17 16:51:12.324526084 +0100
>@@ -7491,7 +7491,14 @@ gimplify_expr (tree *expr_p, gimple_seq
> 	  {
> 	    tree cond = TREE_OPERAND (*expr_p, 0);
> 	    tree id = TREE_OPERAND (*expr_p, 1);
>-	    tree tmp = create_tmp_var_raw (TREE_TYPE(cond), NULL);
>+	    tree type = TREE_TYPE (cond);
>+	    if (!INTEGRAL_TYPE_P (type))
>+	      {
>+		*expr_p = cond;
>+		ret = GS_OK;
>+		break;
>+	      }
>+	    tree tmp = create_tmp_var (type, NULL);
> 	    gimplify_arg (&cond, pre_p, EXPR_LOCATION (*expr_p));
> 	    gimple call = gimple_build_call_internal (IFN_ANNOTATE, 2,
> 						      cond, id);
>--- gcc/testsuite/gfortran.dg/pr59706.f90.jj	2014-01-17
>17:19:23.665900803 +0100
>+++ gcc/testsuite/gfortran.dg/pr59706.f90	2014-01-17 17:17:48.000000000
>+0100
>@@ -0,0 +1,10 @@
>+! PR middle-end/59706
>+! { dg-do compile }
>+
>+  integer i
>+  do concurrent (i=1:2)
>+  end do
>+contains
>+  subroutine foo
>+  end 
>+end
>--- gcc/testsuite/g++.dg/ext/pr59706.C.jj	2014-01-17 17:23:46.999556115
>+0100
>+++ gcc/testsuite/g++.dg/ext/pr59706.C	2014-01-17 17:20:53.000000000
>+0100
>@@ -0,0 +1,21 @@
>+// PR middle-end/59706
>+// { dg-do compile }
>+
>+extern struct S s;
>+struct T { T (); ~T (); int t; } t;
>+
>+void
>+foo ()
>+{
>+  #pragma GCC ivdep
>+  while (s)	// { dg-error "could not convert" }
>+    ;
>+}
>+
>+void
>+bar ()
>+{
>+  #pragma GCC ivdep
>+  while (t)	// { dg-error "could not convert" }
>+    ;
>+}
>
>	Jakub




More information about the Gcc-patches mailing list