On Fri, 25 Oct 2019 at 13:19, Richard Biener <richard.guent...@gmail.com> wrote:
>
> On Wed, Oct 23, 2019 at 11:45 PM Prathamesh Kulkarni
> <prathamesh.kulka...@linaro.org> wrote:
> >
> > Hi,
> > The attached patch tries to fix PR92163 by calling
> > gimple_purge_dead_eh_edges from ifcvt_local_dce if we need eh cleanup.
> > Does it look OK ?
>
> Hmm.  I think it shows an issue with the return value of 
> remove_stmt_form_eh_lp
> which is true if the LP index is -1 (externally throwing).  We don't
> need to purge
> any edges in that case.  That is, if-conversion should never need to
> do EH purging
> since that would be wrong-code.
>
> As of the segfault can you please instead either pass down need_eh_cleanup
> as function parameter (and NULL from ifcvt) or use the return value in DSE
> to set the bit in the caller.
Hi Richard,
Thanks for the suggestions, does the attached patch look OK ?
Bootstrap+test in progress on x86_64-unknown-linux-gnu.

Thanks,
Prathamesh
>
> Thanks,
> Richard.
>
> > Thanks,
> > Prathamesh
2019-10-25  Prathamesh Kulkarni  <prathamesh.kulka...@linaro.org>

        PR tree-optimization/92163
        * tree-ssa-dse.c (delete_dead_or_redundant_assignment): New param
        need_eh_cleanup with default value NULL. Gate on need_eh_cleanup
        before calling bitmap_set_bit.
        (dse_optimize_redundant_stores): Pass global need_eh_cleanup to
        delete_dead_or_redundant_assignment.
        (dse_dom_walker::dse_optimize_stmt): Likewise.
        * tree-ssa-dse.h (delete_dead_or_redundant_assignment): Adjust 
prototype.

testsuite/
        * gcc.dg/tree-ssa/pr92163.c: New test.

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr92163.c 
b/gcc/testsuite/gcc.dg/tree-ssa/pr92163.c
new file mode 100644
index 00000000000..58f548fe76b
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/tree-ssa/pr92163.c
@@ -0,0 +1,16 @@
+/* { dg-do "compile" } */
+/* { dg-options "-O2 -fexceptions -fnon-call-exceptions -fopenacc" } */
+
+void
+xr (int *k7)
+{
+  int qa;
+
+#pragma acc parallel
+#pragma acc loop vector
+  for (qa = 0; qa < 3; ++qa)
+    if (qa % 2 != 0)
+      k7[qa] = 0;
+    else
+      k7[qa] = 1;
+}
diff --git a/gcc/tree-ssa-dse.c b/gcc/tree-ssa-dse.c
index 25cd4709b31..21a15eef690 100644
--- a/gcc/tree-ssa-dse.c
+++ b/gcc/tree-ssa-dse.c
@@ -77,7 +77,6 @@ along with GCC; see the file COPYING3.  If not see
    fact, they are the same transformation applied to different views of
    the CFG.  */
 
-void delete_dead_or_redundant_assignment (gimple_stmt_iterator *, const char 
*);
 static void delete_dead_or_redundant_call (gimple_stmt_iterator *, const char 
*);
 
 /* Bitmap of blocks that have had EH statements cleaned.  We should
@@ -639,7 +638,8 @@ dse_optimize_redundant_stores (gimple *stmt)
            {
              gimple_stmt_iterator gsi = gsi_for_stmt (use_stmt);
              if (is_gimple_assign (use_stmt))
-               delete_dead_or_redundant_assignment (&gsi, "redundant");
+               delete_dead_or_redundant_assignment (&gsi, "redundant",
+                                                    need_eh_cleanup);
              else if (is_gimple_call (use_stmt))
                delete_dead_or_redundant_call (&gsi, "redundant");
              else
@@ -900,7 +900,8 @@ delete_dead_or_redundant_call (gimple_stmt_iterator *gsi, 
const char *type)
 /* Delete a dead store at GSI, which is a gimple assignment. */
 
 void
-delete_dead_or_redundant_assignment (gimple_stmt_iterator *gsi, const char 
*type)
+delete_dead_or_redundant_assignment (gimple_stmt_iterator *gsi, const char 
*type,
+                                    bitmap need_eh_cleanup)
 {
   gimple *stmt = gsi_stmt (*gsi);
   if (dump_file && (dump_flags & TDF_DETAILS))
@@ -915,7 +916,7 @@ delete_dead_or_redundant_assignment (gimple_stmt_iterator 
*gsi, const char *type
 
   /* Remove the dead store.  */
   basic_block bb = gimple_bb (stmt);
-  if (gsi_remove (gsi, true))
+  if (gsi_remove (gsi, true) && need_eh_cleanup)
     bitmap_set_bit (need_eh_cleanup, bb->index);
 
   /* And release any SSA_NAMEs set in this statement back to the
@@ -1059,7 +1060,7 @@ dse_dom_walker::dse_optimize_stmt (gimple_stmt_iterator 
*gsi)
          && !by_clobber_p)
        return;
 
-      delete_dead_or_redundant_assignment (gsi, "dead");
+      delete_dead_or_redundant_assignment (gsi, "dead", need_eh_cleanup);
     }
 }
 
diff --git a/gcc/tree-ssa-dse.h b/gcc/tree-ssa-dse.h
index a5eccbd746d..2658f92b1bb 100644
--- a/gcc/tree-ssa-dse.h
+++ b/gcc/tree-ssa-dse.h
@@ -31,6 +31,7 @@ enum dse_store_status
 dse_store_status dse_classify_store (ao_ref *, gimple *, bool, sbitmap,
                                     bool * = NULL, tree = NULL);
 
-void delete_dead_or_redundant_assignment (gimple_stmt_iterator *, const char 
*);
+void delete_dead_or_redundant_assignment (gimple_stmt_iterator *, const char *,
+                                         bitmap = NULL);
 
 #endif   /* GCC_TREE_SSA_DSE_H  */

Reply via email to