diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3b6af9ed485..738f0c3fbb5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2018-09-17 Richard Biener + + PR tree-optimization/87301 + * tree-ssa-sccvn.c (eliminate_dom_walker::eliminate_cleanup): Properly + clean EH info from leftover copy assignments. + 2018-09-17 Martin Liska PR gcov-profile/85871 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c40fc5f692c..bcb851a22c5 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-09-17 Richard Biener + + PR tree-optimization/87301 + * gcc.dg/torture/pr87301.c: New testcase. + 2018-09-17 Paul Thomas PR fortran/85954 diff --git a/gcc/testsuite/gcc.dg/torture/pr87301.c b/gcc/testsuite/gcc.dg/torture/pr87301.c new file mode 100644 index 00000000000..67d914f023c --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr87301.c @@ -0,0 +1,34 @@ +/* { dg-do compile } */ +/* { dg-additional-options "-Wno-div-by-zero" } */ + +void +bl (int *be) +{ + int lo; + { + int **ny; + + if (*be == 0) + { + int ***k8 = &ny; + int uj = (__INTPTR_TYPE__)&lo; + + for (;;) + if (***k8 == 0) + { + uj = !!(1 / 0) ? !(lo = 0) : 0; + (void) uj; + + if (*ny == 0) + for (;;) + if (***k8 == 0) + { + } + + for (lo = 0; lo < 2; ++lo) + { + } + } + } + } +} diff --git a/gcc/tree-ssa-sccvn.c b/gcc/tree-ssa-sccvn.c index 1c95306fd82..a9e4d34e31f 100644 --- a/gcc/tree-ssa-sccvn.c +++ b/gcc/tree-ssa-sccvn.c @@ -5461,7 +5461,10 @@ eliminate_dom_walker::eliminate_cleanup (bool region_p) if (is_gimple_assign (stmt)) { gimple_assign_set_rhs_from_tree (&gsi, sprime); - update_stmt (gsi_stmt (gsi)); + stmt = gsi_stmt (gsi); + update_stmt (stmt); + if (maybe_clean_or_replace_eh_stmt (stmt, stmt)) + bitmap_set_bit (need_eh_cleanup, gimple_bb (stmt)->index); continue; } else