diff options
author | Jakub Jelinek <jakub@redhat.com> | 2005-09-03 20:49:51 +0200 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2005-09-03 20:49:51 +0200 |
commit | 7a6b7528533ea6d23a5b1a5624b4f68faf079a38 (patch) | |
tree | 8cd0ea8189b4ec5d94a1f55e0af06a8e152bdc41 | |
parent | f7e4e4847c4b252bb232191d28c05439e7c85612 (diff) | |
download | gcc-7a6b7528533ea6d23a5b1a5624b4f68faf079a38.zip gcc-7a6b7528533ea6d23a5b1a5624b4f68faf079a38.tar.gz gcc-7a6b7528533ea6d23a5b1a5624b4f68faf079a38.tar.bz2 |
re PR rtl-optimization/23454 (ICE in invert_exp_1, at jump.c:1719)
PR rtl-optimization/23454
* reorg.c (relax_delay_slots): Only call invert_jump if any_condjump_p
is true.
* g++.dg/opt/pr23454.C: New test.
From-SVN: r103810
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/reorg.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/opt/pr23454.C | 41 |
4 files changed, 56 insertions, 3 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4b488fa..8bbb5ba 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2005-09-03 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/23454 + * reorg.c (relax_delay_slots): Only call invert_jump if any_condjump_p + is true. + 2005-09-03 Richard Henderson <rth@redhat.com> John David Anglin <dave.anglin@nrc-cnrc.gc.ca> diff --git a/gcc/reorg.c b/gcc/reorg.c index cda7168..8b9d7ef 100644 --- a/gcc/reorg.c +++ b/gcc/reorg.c @@ -3123,10 +3123,11 @@ relax_delay_slots (rtx first) if (target_label && target_label != JUMP_LABEL (insn)) reorg_redirect_jump (insn, target_label); - /* See if this jump branches around an unconditional jump. - If so, invert this jump and point it to the target of the + /* See if this jump conditionally branches around an unconditional + jump. If so, invert this jump and point it to the target of the second jump. */ if (next && JUMP_P (next) + && any_condjump_p (insn) && (simplejump_p (next) || GET_CODE (PATTERN (next)) == RETURN) && target_label && next_active_insn (target_label) == next_active_insn (next) @@ -3172,7 +3173,7 @@ relax_delay_slots (rtx first) if (JUMP_P (insn) && (simplejump_p (insn) || GET_CODE (PATTERN (insn)) == RETURN) && (other = prev_active_insn (insn)) != 0 - && (condjump_p (other) || condjump_in_parallel_p (other)) + && any_condjump_p (other) && no_labels_between_p (other, insn) && 0 > mostly_true_jump (other, get_branch_condition (other, diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 0abc44f..496ecc3 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2005-09-03 Jakub Jelinek <jakub@redhat.com> + + PR rtl-optimization/23454 + * g++.dg/opt/pr23454.C: New test. + 2005-09-03 Mark Mitchell <mark@codesourcery.com> PR c++/23699 diff --git a/gcc/testsuite/g++.dg/opt/pr23454.C b/gcc/testsuite/g++.dg/opt/pr23454.C new file mode 100644 index 0000000..ab82b1f --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr23454.C @@ -0,0 +1,41 @@ +/* PR rtl-optimization/23454 */ +/* { dg-do compile } */ +/* { dg-options "-O2" } */ + +void foo (); +int a, b; +char c; +long long d, e; + +static inline int +bar (const long long s, const long long t) +{ + return ((s < t) ? -1 : s > t ? 1 : 0); +} + +int fn (); +int f; + +void +baz (int x) +{ + long long g = fn (); + if (f) + { + b++; + return; + } + if (g == 0) + a++; + if (x) + foo (); + if (!c) + c = 1; + else if (g != 0) + { + if (bar (g, d) < 0) + d = g; + if (bar (g, e) > 0) + e = g; + } +} |