aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2016-05-25 22:25:35 +0000
committerJeff Law <law@redhat.com>2016-05-25 22:25:35 +0000
commit1a2fbaffad632b26b4899387b13c800bba0cc54b (patch)
treeac833108d5e1e510a99e9d9fdce8a634ecf5b6d4
parentca27795d9df6d94f434759ec4aee016b281052c9 (diff)
PR tree-optimization/71272
* tree-ssa-threadbackward.c (convert_and_register_jump_thread_path): Update comments. Add test for empty path. PR tree-optimization/71272 * gcc.c-torture/compile/pr71272.c: new test. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@236755 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr71272.c33
-rw-r--r--gcc/tree-ssa-threadbackward.c20
4 files changed, 64 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 27eeee4189e..a3c4d902bec 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-05-25 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/71272
+ * tree-ssa-threadbackward.c (convert_and_register_jump_thread_path):
+ Update comments. Add test for empty path.
+
2016-05-25 Bill Seurer <seurer@linux.vnet.ibm.com>
* config/rs6000/altivec.h (vec_cmpne): Add #define for vec_cmpne.
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 30b5d2576b4..61c064f9867 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-05-25 Jeff Law <law@redhat.com>
+
+ PR tree-optimization/71272
+ * gcc.c-torture/compile/pr71272.c: new test.
+
2016-05-25 Bill Seurer <seurer@linux.vnet.ibm.com>
* gcc.target/powerpc/vec-cmpne.c: New test.
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr71272.c b/gcc/testsuite/gcc.c-torture/compile/pr71272.c
new file mode 100644
index 00000000000..22f14981afb
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr71272.c
@@ -0,0 +1,33 @@
+int a, b, c, d;
+
+int
+f1 (int p1, int p2)
+{
+ return p1 - p2;
+}
+
+void
+f2 (short p1, short p2)
+{
+ for (;;)
+ {
+ if (5 < (1 ^ p2))
+ for (; a;)
+ for (;;)
+ {
+ b = 0xE7BC92A3EDA01CD8 < (d = p2) || (0, 0);
+ break;
+ }
+ if (p1)
+ break;
+ p2 = 5;
+ }
+}
+
+void
+f3 (int x)
+{
+ int tmp = -2L;
+ c = f1 (90, x != 10);
+ f2 (c, tmp);
+}
diff --git a/gcc/tree-ssa-threadbackward.c b/gcc/tree-ssa-threadbackward.c
index 4d0fd9cac57..636b67da42d 100644
--- a/gcc/tree-ssa-threadbackward.c
+++ b/gcc/tree-ssa-threadbackward.c
@@ -373,6 +373,10 @@ convert_and_register_jump_thread_path (vec<basic_block, va_gc> *&path,
{
basic_block bb1 = (*path)[path->length () - j - 1];
basic_block bb2 = (*path)[path->length () - j - 2];
+
+ /* This can happen when we have an SSA_NAME as a PHI argument and
+ its initialization block is the head of the PHI argument's
+ edge. */
if (bb1 == bb2)
continue;
@@ -382,6 +386,22 @@ convert_and_register_jump_thread_path (vec<basic_block, va_gc> *&path,
jump_thread_path->safe_push (x);
}
+ /* As a consequence of the test for duplicate blocks in the path
+ above, we can get a path with no blocks. This happens if a
+ conditional can be fully evaluated at compile time using just
+ defining statements in the same block as the test.
+
+ When we no longer push the block associated with a PHI argument
+ onto the stack, then this as well as the test in the loop above
+ can be removed. */
+ if (jump_thread_path->length () == 0)
+ {
+ jump_thread_path->release ();
+ delete jump_thread_path;
+ path->pop ();
+ return;
+ }
+
/* Add the edge taken when the control variable has value ARG. */
jump_thread_edge *x
= new jump_thread_edge (taken_edge, EDGE_NO_COPY_SRC_BLOCK);