summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2017-04-18 17:31:30 +0000
committerlaw <law@138bc75d-0d04-0410-961f-82ee72b054a4>2017-04-18 17:31:30 +0000
commit804569465688c6f4c9acdccfb070f39e0105560f (patch)
tree797765178bd00aac43a514272bbfddb063251d55 /gcc
parent4ec1a73857bfc8adad5104bb9970209d99be4dc3 (diff)
downloadgcc-804569465688c6f4c9acdccfb070f39e0105560f.tar.gz
PR middle-end/80422
* cfgcleanup.c (try_crossjump_to_edge): Verify SRC1 and SRC2 have predecessors after walking up the insn chain. PR middle-end/80422 * gcc.c-torture/compile/pr80422.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@246975 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/cfgcleanup.c5
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/compile/pr80422.c26
4 files changed, 42 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 38c0d301765..67751810e4a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2017-04-18 Jeff Law <law@redhat.com>
+
+ PR middle-end/80422
+ * cfgcleanup.c (try_crossjump_to_edge): Verify SRC1 and SRC2 have
+ predecessors after walking up the insn chain.
+
2017-04-18 Jakub Jelinek <jakub@redhat.com>
PR debug/80263
diff --git a/gcc/cfgcleanup.c b/gcc/cfgcleanup.c
index d55b0ceb832..f68a964e31e 100644
--- a/gcc/cfgcleanup.c
+++ b/gcc/cfgcleanup.c
@@ -2017,6 +2017,11 @@ try_crossjump_to_edge (int mode, edge e1, edge e2,
if (newpos2 != NULL_RTX)
src2 = BLOCK_FOR_INSN (newpos2);
+ /* Check that SRC1 and SRC2 have preds again. They may have changed
+ above due to the call to flow_find_cross_jump. */
+ if (EDGE_COUNT (src1->preds) == 0 || EDGE_COUNT (src2->preds) == 0)
+ return false;
+
if (dir == dir_backward)
{
#define SWAP(T, X, Y) do { T tmp = (X); (X) = (Y); (Y) = tmp; } while (0)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 4157094c399..cf5d0be6da3 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2017-04-18 Jeff Law <law@redhat.com>
+
+ PR middle-end/80422
+ * gcc.c-torture/compile/pr80422.c: New test.
+
2017-04-18 Jakub Jelinek <jakub@redhat.com>
PR debug/80263
diff --git a/gcc/testsuite/gcc.c-torture/compile/pr80422.c b/gcc/testsuite/gcc.c-torture/compile/pr80422.c
new file mode 100644
index 00000000000..2cece6775dd
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/compile/pr80422.c
@@ -0,0 +1,26 @@
+
+int a, c, f;
+short b, d, e;
+
+int fn1 (int h)
+{
+ return a > 2 || h > a ? h : h << a;
+}
+
+void fn2 ()
+{
+ int j, k;
+ while (1)
+ {
+ k = c && b;
+ f &= e > (fn1 (k) && j);
+ if (!d)
+ break;
+ }
+}
+
+int main ()
+{
+ fn2 ();
+ return 0;
+}