diff options
author | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-04-18 17:31:30 +0000 |
---|---|---|
committer | law <law@138bc75d-0d04-0410-961f-82ee72b054a4> | 2017-04-18 17:31:30 +0000 |
commit | 804569465688c6f4c9acdccfb070f39e0105560f (patch) | |
tree | 797765178bd00aac43a514272bbfddb063251d55 /gcc | |
parent | 4ec1a73857bfc8adad5104bb9970209d99be4dc3 (diff) | |
download | gcc-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/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/cfgcleanup.c | 5 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.c-torture/compile/pr80422.c | 26 |
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; +} |