diff options
author | Jakub Jelinek <jakub@redhat.com> | 2007-11-01 09:48:05 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2007-11-01 09:48:05 +0100 |
commit | d0a55efc8463a68632498a84cffa7b84fe3d6e26 (patch) | |
tree | 45f7a53520410f93df610fbb1e6060c29abf1bae /gcc | |
parent | 895a8136438717d4770e58be58ffa8bb71df4c28 (diff) | |
download | gcc-d0a55efc8463a68632498a84cffa7b84fe3d6e26.zip gcc-d0a55efc8463a68632498a84cffa7b84fe3d6e26.tar.gz gcc-d0a55efc8463a68632498a84cffa7b84fe3d6e26.tar.bz2 |
re PR rtl-optimization/33673 (ICE in verify_flow_info, missing barrier, when multiple tree opts disabled)
PR rtl-optimization/33673
* gcse.c (cprop_jump): If a conditional jump has been optimized
into unconditional jump, make the remaining normal edge fallthru
and delete the jump insn.
* gcc.dg/pr33673.c: New test.
From-SVN: r129819
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/gcse.c | 18 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr33673.c | 43 |
4 files changed, 73 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61d1e38..0aa3b00 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-11-01 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/33673 + * gcse.c (cprop_jump): If a conditional jump has been optimized + into unconditional jump, make the remaining normal edge fallthru + and delete the jump insn. + 2007-11-01 Ben Elliston <bje@au.ibm.com> * emit-rtl.c (set_reg_attrs_from_mem): Clarify function comment. @@ -2875,6 +2875,24 @@ cprop_jump (basic_block bb, rtx setcc, rtx jump, rtx from, rtx src) } purge_dead_edges (bb); + /* If a conditional jump has been changed into unconditional jump, remove + the jump and make the edge fallthru - this is always called in + cfglayout mode. */ + if (new != pc_rtx && simplejump_p (jump)) + { + edge e; + edge_iterator ei; + + for (ei = ei_start (bb->succs); (e = ei_safe_edge (ei)); ei_next (&ei)) + if (e->dest != EXIT_BLOCK_PTR + && BB_HEAD (e->dest) == JUMP_LABEL (jump)) + { + e->flags |= EDGE_FALLTHRU; + break; + } + delete_insn (jump); + } + return 1; } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 8332c43..fd1f046 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-01 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/33673 + * gcc.dg/pr33673.c: New test. + 2007-11-01 Michael Matz <matz@suse.de> PR tree-optimization/33961 diff --git a/gcc/testsuite/gcc.dg/pr33673.c b/gcc/testsuite/gcc.dg/pr33673.c new file mode 100644 index 0000000..d238d11 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr33673.c @@ -0,0 +1,43 @@ +/* PR rtl-optimization/33673 */ +/* { dg-do compile } */ +/* { dg-options "-Os -fno-forward-propagate -fno-guess-branch-probability -fno-move-loop-invariants -fno-tree-dominator-opts -fno-tree-loop-optimize" } */ + +extern int f1 (int); +extern int f2 (int); + +extern int *a; + +static void +find_reg (int n) +{ + int i, pass; + unsigned int used[2], used1[2]; + + int c = n ? f1 (a[1]) : f2 (a[1]); + + for (i = 64, pass = 0; pass <= 1 && i >= 64; pass++) + { + if (pass == 1) + { + unsigned int *scan_tp_ = used; + unsigned int *scan_fp_ = used1; + int j; + for (j = 0; j < 2; j++) + *scan_tp_++ = *scan_fp_++; + } + for (i = 0; i < 64; i++) + { + int regno = i; + if (n == 0) + if (i == regno) + break; + } + } +} + +void +global_alloc () +{ + find_reg (0); + find_reg (1); +} |