aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2017-02-21 10:58:00 -0700
committerJeff Law <law@gcc.gnu.org>2017-02-21 10:58:00 -0700
commit1486c2a780bee75dc5afecdc8b03f28906b2ef04 (patch)
treee20843060c099ad84815b9aebcf3148a87cd4912 /gcc
parent3bb4311904171b4938f6682566a24180f318b196 (diff)
downloadgcc-1486c2a780bee75dc5afecdc8b03f28906b2ef04.zip
gcc-1486c2a780bee75dc5afecdc8b03f28906b2ef04.tar.gz
gcc-1486c2a780bee75dc5afecdc8b03f28906b2ef04.tar.bz2
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
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/gimple-ssa-isolate-paths.c11
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr79621.c18
4 files changed, 40 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index e265311..c0f554f 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-02-21 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/79621
+ * gimple-ssa-isolate-paths.c (find_implicit_erroneous_behavior): Ignore
+ blocks with edges to themselves.
+
2017-02-21 Jakub Jelinek <jakub@redhat.com>
PR target/79633
diff --git a/gcc/gimple-ssa-isolate-paths.c b/gcc/gimple-ssa-isolate-paths.c
index 25e8c8a..7babe09 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 9877624..9f278bb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-02-21 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/79621
+ * gcc.c-torture/compile/pr79621.c: New test.
+
2017-02-21 Jakub Jelinek <jakub@redhat.com>
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 0000000..f115c07
--- /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;
+ }
+}
+