re PR tree-optimization/71104 (ICE: verify_ssa failed (with vfork / error: definitio...
authorRichard Biener <rguenther@suse.de>
Wed, 13 Jul 2016 08:03:04 +0000 (08:03 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 13 Jul 2016 08:03:04 +0000 (08:03 +0000)
2016-07-13  Richard Biener  <rguenther@suse.de>

PR middle-end/71104
* gimplify.c (gimplify_modify_expr): Gimplify the RHS before
gimplifying the LHS.  Make sure to gimplify a returning twice
call LHS without using SSA names.

* gcc.dg/pr71104-1.c: New testcase.
* gcc.dg/pr71104-2.c: Likewise.

From-SVN: r238287

gcc/ChangeLog
gcc/gimplify.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr71104-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr71104-2.c [new file with mode: 0644]

index db920bd90a4109385864059c2bae9f66f5c8b6e8..e42e288653f48924f953049c40dd0363804cd54c 100644 (file)
@@ -1,3 +1,10 @@
+2016-07-13  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/71104
+       * gimplify.c (gimplify_modify_expr): Gimplify the RHS before
+       gimplifying the LHS.  Make sure to gimplify a returning twice
+       call LHS without using SSA names.
+
 2016-07-12  Trevor Saunders  <tbsaunde+gcc@tbsaunde.org>
 
        * tree-data-ref.c (find_data_references_in_stmt): Remove
index 2ea1e571bdd39f8594dde17d487f5d89000fa690..fb27dd0e75a458ea71a1dc0d760ed4db314178a3 100644 (file)
@@ -4810,7 +4810,19 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p,
     return ret;
 
   /* Then gimplify the LHS.  */
+  /* If we gimplified the RHS to a CALL_EXPR and that call may return
+     twice we have to make sure to gimplify into non-SSA as otherwise
+     the abnormal edge added later will make those defs not dominate
+     their uses.
+     ???  Technically this applies only to the registers used in the
+     resulting non-register *TO_P.  */
+  bool saved_into_ssa = gimplify_ctxp->into_ssa;
+  if (saved_into_ssa
+      && TREE_CODE (*from_p) == CALL_EXPR
+      && call_expr_flags (*from_p) & ECF_RETURNS_TWICE)
+    gimplify_ctxp->into_ssa = false;
   ret = gimplify_expr (to_p, pre_p, post_p, is_gimple_lvalue, fb_lvalue);
+  gimplify_ctxp->into_ssa = saved_into_ssa;
   if (ret == GS_ERROR)
     return ret;
 
index cb2c9e0afc2585949ef11d5d59984275eb78ddd1..d4e0fcabdc038d4113cae00e4d0e1d71521291ff 100644 (file)
@@ -1,3 +1,9 @@
+2016-07-13  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/71104
+       * gcc.dg/pr71104-1.c: New testcase.
+       * gcc.dg/pr71104-2.c: Likewise.
+
 2016-07-12  Michael Meissner  <meissner@linux.vnet.ibm.com>
 
        PR target/71805
diff --git a/gcc/testsuite/gcc.dg/pr71104-1.c b/gcc/testsuite/gcc.dg/pr71104-1.c
new file mode 100644 (file)
index 0000000..20c055a
--- /dev/null
@@ -0,0 +1,11 @@
+/* { dg-do compile } */
+
+void foo(void);
+int vfork(void);
+int *p;
+
+void bar(void)
+{
+  foo();
+  *p = vfork();
+}
diff --git a/gcc/testsuite/gcc.dg/pr71104-2.c b/gcc/testsuite/gcc.dg/pr71104-2.c
new file mode 100644 (file)
index 0000000..03c52a3
--- /dev/null
@@ -0,0 +1,12 @@
+/* { dg-do compile } */
+
+struct Foo { char c[1024]; };
+void foo(void);
+struct Foo baz(void) __attribute__((returns_twice));
+struct Foo *p;
+
+void bar(void)
+{
+  foo();
+  *p = baz();
+}