From: Jakub Jelinek Date: Thu, 1 Nov 2007 08:48:05 +0000 (+0100) Subject: re PR rtl-optimization/33673 (ICE in verify_flow_info, missing barrier, when multiple... X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=d0a55efc8463a68632498a84cffa7b84fe3d6e26;p=gcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 61d1e38d219..0aa3b00c8b6 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2007-11-01 Jakub Jelinek + + 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 * emit-rtl.c (set_reg_attrs_from_mem): Clarify function comment. diff --git a/gcc/gcse.c b/gcc/gcse.c index 79aa8afd31d..a519acbf054 100644 --- a/gcc/gcse.c +++ b/gcc/gcse.c @@ -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 8332c432beb..fd1f046ac21 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-11-01 Jakub Jelinek + + PR rtl-optimization/33673 + * gcc.dg/pr33673.c: New test. + 2007-11-01 Michael Matz 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 00000000000..d238d112cfa --- /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); +}