re PR tree-optimization/79432 (ICE: verify_ssa failed)
authorRichard Biener <rguenther@suse.de>
Tue, 14 Feb 2017 07:58:12 +0000 (07:58 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Tue, 14 Feb 2017 07:58:12 +0000 (07:58 +0000)
2017-02-14  Richard Biener  <rguenther@suse.de>

PR middle-end/79432
* tree-into-ssa.c (insert_phi_nodes): When the function can
have abnormal edges rewrite SSA names with broken use-def
dominance out of SSA and register them for PHI insertion.

* gcc.dg/torture/pr79432.c: New testcase.

From-SVN: r245417

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/torture/pr79432.c [new file with mode: 0644]
gcc/tree-into-ssa.c

index 2561d535a2a12dcd5e956d5f0567aba527f4cc80..03c28084add7efe37972ae75814c7550c0db84a0 100644 (file)
@@ -1,3 +1,10 @@
+2017-02-14  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/79432
+       * tree-into-ssa.c (insert_phi_nodes): When the function can
+       have abnormal edges rewrite SSA names with broken use-def
+       dominance out of SSA and register them for PHI insertion.
+
 2017-02-13  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/79496
index a3f66e70ff5799ecf90f2d72e41ad30117d54cab..7881615f6b1520f47b292d62b97f5e01efaa0a0b 100644 (file)
@@ -1,3 +1,8 @@
+2017-02-14  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/79432
+       * gcc.dg/torture/pr79432.c: New testcase.
+
 2017-02-13  Martin Sebor  <msebor@redhat.com>
 
        PR middle-end/79496
diff --git a/gcc/testsuite/gcc.dg/torture/pr79432.c b/gcc/testsuite/gcc.dg/torture/pr79432.c
new file mode 100644 (file)
index 0000000..47fef0d
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+int fn1 (void);
+int __attribute__((returns_twice)) vfork (void);
+
+void fn2 ()
+{
+  int a;
+  a = fn1() + 2 + (vfork() + 1 + vfork());
+}
+void fn3 ()
+{
+  int a;
+  a = fn1() + 1 + vfork();
+}
+void fn4 ()
+{
+  int a;
+  a = fn1() + vfork();
+}
index 22261c15dc2af7d30bc977964d9aee34d11365f6..eebb8047442cc2aea92c83b03ecff484b2ac3abd 100644 (file)
@@ -1066,6 +1066,59 @@ insert_phi_nodes (bitmap_head *dfs)
 
   timevar_push (TV_TREE_INSERT_PHI_NODES);
 
+  /* When the gimplifier introduces SSA names it cannot easily avoid
+     situations where abnormal edges added by CFG construction break
+     the use-def dominance requirement.  For this case rewrite SSA
+     names with broken use-def dominance out-of-SSA and register them
+     for PHI insertion.  We only need to do this if abnormal edges
+     can appear in the function.  */
+  tree name;
+  if (cfun->calls_setjmp
+      || cfun->has_nonlocal_label)
+    FOR_EACH_SSA_NAME (i, name, cfun)
+      {
+       gimple *def_stmt = SSA_NAME_DEF_STMT (name);
+       if (SSA_NAME_IS_DEFAULT_DEF (name))
+         continue;
+
+       basic_block def_bb = gimple_bb (def_stmt);
+       imm_use_iterator it;
+       gimple *use_stmt;
+       bool need_phis = false;
+       FOR_EACH_IMM_USE_STMT (use_stmt, it, name)
+         {
+           basic_block use_bb = gimple_bb (use_stmt);
+           if (use_bb != def_bb
+               && ! dominated_by_p (CDI_DOMINATORS, use_bb, def_bb))
+             need_phis = true;
+         }
+       if (need_phis)
+         {
+           tree var = create_tmp_reg (TREE_TYPE (name));
+           use_operand_p use_p;
+           FOR_EACH_IMM_USE_STMT (use_stmt, it, name)
+             {
+               basic_block use_bb = gimple_bb (use_stmt);
+               FOR_EACH_IMM_USE_ON_STMT (use_p, it)
+                   SET_USE (use_p, var);
+               update_stmt (use_stmt);
+               set_livein_block (var, use_bb);
+               set_rewrite_uses (use_stmt, true);
+               bitmap_set_bit (interesting_blocks, use_bb->index);
+             }
+           def_operand_p def_p;
+           ssa_op_iter dit;
+           FOR_EACH_SSA_DEF_OPERAND (def_p, def_stmt, dit, SSA_OP_DEF)
+             if (DEF_FROM_PTR (def_p) == name)
+               SET_DEF (def_p, var);
+           update_stmt (def_stmt);
+           set_def_block (var, def_bb, false);
+           set_register_defs (def_stmt, true);
+           bitmap_set_bit (interesting_blocks, def_bb->index);
+           release_ssa_name (name);
+         }
+      }
+
   auto_vec<var_info *> vars (var_infos->elements ());
   FOR_EACH_HASH_TABLE_ELEMENT (*var_infos, info, var_info_p, hi)
     if (info->info.need_phi_state != NEED_PHI_STATE_NO)