From 1486c2a780bee75dc5afecdc8b03f28906b2ef04 Mon Sep 17 00:00:00 2001 From: Jeff Law Date: Tue, 21 Feb 2017 10:58:00 -0700 Subject: [PATCH] re PR tree-optimization/79621 (Missed path isolation opportunity) PR tree-optimization/79621 * gimple-ssa-isolate-paths.c (find_implicit_erroneous_behavior): Ignore blocks with edges to themselves. PR tree-optimization/79621 * gcc.c-torture/compile/pr79621.c: New test. From-SVN: r245637 --- gcc/ChangeLog | 6 ++++++ gcc/gimple-ssa-isolate-paths.c | 11 +++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.c-torture/compile/pr79621.c | 18 ++++++++++++++++++ 4 files changed, 40 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr79621.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index e265311109d..c0f554fed11 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2017-02-21 Jeff Law + + PR tree-optimization/79621 + * gimple-ssa-isolate-paths.c (find_implicit_erroneous_behavior): Ignore + blocks with edges to themselves. + 2017-02-21 Jakub Jelinek PR target/79633 diff --git a/gcc/gimple-ssa-isolate-paths.c b/gcc/gimple-ssa-isolate-paths.c index 25e8c8aad4c..7babe092362 100644 --- a/gcc/gimple-ssa-isolate-paths.c +++ b/gcc/gimple-ssa-isolate-paths.c @@ -35,6 +35,7 @@ along with GCC; see the file COPYING3. If not see #include "tree-ssa.h" #include "cfgloop.h" #include "tree-cfg.h" +#include "cfganal.h" #include "intl.h" @@ -352,6 +353,16 @@ find_implicit_erroneous_behavior (void) if (has_abnormal_or_eh_outgoing_edge_p (bb)) continue; + + /* If BB has an edge to itself, then duplication of BB below + could result in reallocation of BB's PHI nodes. If that happens + then the loop below over the PHIs would use the old PHI and + thus invalid information. We don't have a good way to know + if a PHI has been reallocated, so just avoid isolation in + this case. */ + if (find_edge (bb, bb)) + continue; + /* First look for a PHI which sets a pointer to NULL and which is then dereferenced within BB. This is somewhat overly conservative, but probably catches most of the interesting diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9877624be83..9f278bb8b83 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2017-02-21 Jeff Law + + PR tree-optimization/79621 + * gcc.c-torture/compile/pr79621.c: New test. + 2017-02-21 Jakub Jelinek PR c++/79655 diff --git a/gcc/testsuite/gcc.c-torture/compile/pr79621.c b/gcc/testsuite/gcc.c-torture/compile/pr79621.c new file mode 100644 index 00000000000..f115c07a2a4 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr79621.c @@ -0,0 +1,18 @@ +int b5; + +void +h6 (int zb, int e7) +{ + while (b5 > 0) + { + int gv; + + for (gv = 1; gv < 4; ++gv) + { + ((zb != 0) ? b5 : gv) && (b5 /= e7); + zb = 0; + } + e7 = 0; + } +} +