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
This commit is contained in:
Jakub Jelinek 2005-09-03 20:49:51 +02:00 committed by Jakub Jelinek
parent f7e4e4847c
commit 7a6b752853
4 changed files with 56 additions and 3 deletions

View File

@ -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>

View File

@ -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,

View File

@ -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

View File

@ -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;
}
}