diff options
author | Jakub Jelinek <jakub@redhat.com> | 2018-11-16 17:43:49 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2018-11-16 17:43:49 +0100 |
commit | a09ad34709696a3d02ae588e7a595fd379b885b0 (patch) | |
tree | 6dc7bca638b39ef4d7674face7c249f65785cde0 /gcc | |
parent | b41835733bc337580a0de6b8ba5de4b00d391fc6 (diff) | |
download | gcc-a09ad34709696a3d02ae588e7a595fd379b885b0.zip gcc-a09ad34709696a3d02ae588e7a595fd379b885b0.tar.gz gcc-a09ad34709696a3d02ae588e7a595fd379b885b0.tar.bz2 |
re PR rtl-optimization/87475 (ICE in patch_jump_insn, at cfgrtl.c:1275)
PR rtl-optimization/87475
* cfgrtl.c (patch_jump_insn): Allow redirection failure for
CROSSING_JUMP_P insns.
(cfg_layout_redirect_edge_and_branch): Don't ICE if ret is NULL.
* g++.dg/opt/pr87475.C: New test.
From-SVN: r266219
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/cfgrtl.c | 9 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr87475.C | 7 |
4 files changed, 26 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 2362e70..984826d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2018-11-16 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/87475 + * cfgrtl.c (patch_jump_insn): Allow redirection failure for + CROSSING_JUMP_P insns. + (cfg_layout_redirect_edge_and_branch): Don't ICE if ret is NULL. + 2018-11-16 Uros Bizjak <ubizjak@gmail.com> PR target/88051 diff --git a/gcc/cfgrtl.c b/gcc/cfgrtl.c index 3d4a114..411a024 100644 --- a/gcc/cfgrtl.c +++ b/gcc/cfgrtl.c @@ -1268,11 +1268,13 @@ patch_jump_insn (rtx_insn *insn, rtx_insn *old_label, basic_block new_bb) /* If the substitution doesn't succeed, die. This can happen if the back end emitted unrecognizable instructions or if - target is exit block on some arches. */ + target is exit block on some arches. Or for crossing + jumps. */ if (!redirect_jump (as_a <rtx_jump_insn *> (insn), block_label (new_bb), 0)) { - gcc_assert (new_bb == EXIT_BLOCK_PTR_FOR_FN (cfun)); + gcc_assert (new_bb == EXIT_BLOCK_PTR_FOR_FN (cfun) + || CROSSING_JUMP_P (insn)); return false; } } @@ -4460,6 +4462,9 @@ cfg_layout_redirect_edge_and_branch (edge e, basic_block dest) else ret = redirect_branch_edge (e, dest); + if (!ret) + return NULL; + fixup_partition_crossing (ret); /* We don't want simplejumps in the insn stream during cfglayout. */ gcc_assert (!simplejump_p (BB_END (src)) || CROSSING_JUMP_P (BB_END (src))); diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a00506d..e3856f4 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2018-11-16 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/87475 + * g++.dg/opt/pr87475.C: New test. + 2018-11-16 Matthew Malcomson <matthew.malcomson@arm.com> * gcc.c-torture/execute/printf-2.c: Skip on wrapped boards. diff --git a/gcc/testsuite/g++.dg/opt/pr87475.C b/gcc/testsuite/g++.dg/opt/pr87475.C new file mode 100644 index 0000000..5ed25b4 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr87475.C @@ -0,0 +1,7 @@ +// PR rtl-optimization/87475 +// { dg-do compile { target freorder } } +// { dg-options "-O2 -freorder-blocks-and-partition -fmodulo-sched" } + +struct A { A (); ~A (); }; +int foo (A, A); +void bar (bool x) { x ? foo (A (), A ()) : 0; } |