Jan Hubicka <jh@suse.cz>
* jump.c (invert_exp_1): Remove first argument, use pc_set to get the expression. (redirect_exp): Make static; redirect only the pc_set expression, remove first argument. (invert_exp): Remove first argument, make static. (jump_optimize): Use any_condjump_p, any_uncondjump_p and any_onlyjump at most places where we originaly did condjump_p and simplejump_p. (jump_back_p, follow_jumps, thread_jumps): Likewise. (delete_barrier_succesors): Use pc_set. (invert_jump_1, invert_jump, redirect_jump_1, redirect_jump): Update calls of invert_exp and redirect_exp. * rtl.h (redirect_exp, invert_exp): Remove. * unroll.c (copy_loop_body): Use invert_jump and redirect_jump. From-SVN: r34171
This commit is contained in:
parent
d1ee23e5c3
commit
742dff1596
4 changed files with 125 additions and 102 deletions
|
@ -1,9 +1,26 @@
|
|||
2000-05-25 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* jump.c (invert_exp_1): Remove first argument, use pc_set
|
||||
to get the expression.
|
||||
(redirect_exp): Make static; redirect only the pc_set expression,
|
||||
remove first argument.
|
||||
(invert_exp): Remove first argument, make static.
|
||||
(jump_optimize): Use any_condjump_p, any_uncondjump_p and
|
||||
any_onlyjump at most places where we originaly did condjump_p
|
||||
and simplejump_p.
|
||||
(jump_back_p, follow_jumps, thread_jumps): Likewise.
|
||||
(delete_barrier_succesors): Use pc_set.
|
||||
(invert_jump_1, invert_jump, redirect_jump_1, redirect_jump): Update
|
||||
calls of invert_exp and redirect_exp.
|
||||
* rtl.h (redirect_exp, invert_exp): Remove.
|
||||
* unroll.c (copy_loop_body): Use invert_jump and redirect_jump.
|
||||
|
||||
2000-05-25 Richard Henderson <rth@cygnus.com>
|
||||
|
||||
* stmt.c (expand_end_bindings): Fix thinko last change.
|
||||
|
||||
2000-05-25 Andrew MacLeod <amacleod@cygnus.com>
|
||||
Andrew Haley <aph@cygnus.com>
|
||||
Andrew Haley <aph@cygnus.com>
|
||||
|
||||
* except.c (func_eh_entry): Add emitted field.
|
||||
(new_eh_region_entry): Set emitted field to 0;
|
||||
|
@ -143,12 +160,12 @@ Thu May 25 02:19:27 2000 J"orn Rennecke <amylaar@cygnus.co.uk>
|
|||
|
||||
* Back out this patch:
|
||||
Tue Dec 7 19:22:06 1999 Richard Henderson <rth@cygnus.com>
|
||||
* loop.h (struct induction): Add multi_insn_incr.
|
||||
* loop.c (basic_induction_var): New multi_insn_incr argument.
|
||||
Set it if we search back through previous insns for the biv.
|
||||
(record_biv): New multi_insn_incr argument; fill in struct induction.
|
||||
(strength_reduce): Discard an iv with multiple bivs, any of
|
||||
which require multiple insns to increment.
|
||||
* loop.h (struct induction): Add multi_insn_incr.
|
||||
* loop.c (basic_induction_var): New multi_insn_incr argument.
|
||||
Set it if we search back through previous insns for the biv.
|
||||
(record_biv): New multi_insn_incr argument; fill in struct induction.
|
||||
(strength_reduce): Discard an iv with multiple bivs, any of
|
||||
which require multiple insns to increment.
|
||||
|
||||
* loop.c (check_insn_for_bivs): Remove bits copied from above patch.
|
||||
|
||||
|
|
171
gcc/jump.c
171
gcc/jump.c
|
@ -122,7 +122,9 @@ static int tension_vector_labels PARAMS ((rtx, int));
|
|||
static void mark_jump_label PARAMS ((rtx, rtx, int, int));
|
||||
static void delete_computation PARAMS ((rtx));
|
||||
static void redirect_exp_1 PARAMS ((rtx *, rtx, rtx, rtx));
|
||||
static void invert_exp_1 PARAMS ((rtx, rtx));
|
||||
static int redirect_exp PARAMS ((rtx, rtx, rtx));
|
||||
static void invert_exp_1 PARAMS ((rtx));
|
||||
static int invert_exp PARAMS ((rtx));
|
||||
static void delete_from_jump_chain PARAMS ((rtx));
|
||||
static int delete_labelref_insn PARAMS ((rtx, rtx, int));
|
||||
static void mark_modified_reg PARAMS ((rtx, rtx, void *));
|
||||
|
@ -303,8 +305,9 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
rtx temp, temp1, temp2 = NULL_RTX;
|
||||
rtx temp4 ATTRIBUTE_UNUSED;
|
||||
rtx nlabel;
|
||||
int this_is_simplejump, this_is_condjump;
|
||||
int this_is_condjump_in_parallel;
|
||||
int this_is_any_uncondjump;
|
||||
int this_is_any_condjump;
|
||||
int this_is_onlyjump;
|
||||
|
||||
next = NEXT_INSN (insn);
|
||||
|
||||
|
@ -315,7 +318,8 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
if (after_regscan && GET_CODE (insn) == NOTE
|
||||
&& NOTE_LINE_NUMBER (insn) == NOTE_INSN_LOOP_BEG
|
||||
&& (temp1 = next_nonnote_insn (insn)) != 0
|
||||
&& simplejump_p (temp1))
|
||||
&& any_uncondjump_p (temp1)
|
||||
&& onlyjump_p (temp1))
|
||||
{
|
||||
temp = PREV_INSN (insn);
|
||||
if (duplicate_loop_exit_test (insn))
|
||||
|
@ -329,9 +333,9 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
if (GET_CODE (insn) != JUMP_INSN)
|
||||
continue;
|
||||
|
||||
this_is_simplejump = simplejump_p (insn);
|
||||
this_is_condjump = condjump_p (insn);
|
||||
this_is_condjump_in_parallel = condjump_in_parallel_p (insn);
|
||||
this_is_any_condjump = any_condjump_p (insn);
|
||||
this_is_any_uncondjump = any_uncondjump_p (insn);
|
||||
this_is_onlyjump = onlyjump_p (insn);
|
||||
|
||||
/* Tension the labels in dispatch tables. */
|
||||
|
||||
|
@ -387,7 +391,9 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
reallabelprev = prev_active_insn (JUMP_LABEL (insn));
|
||||
|
||||
/* Detect jump to following insn. */
|
||||
if (reallabelprev == insn && this_is_condjump)
|
||||
if (reallabelprev == insn
|
||||
&& (this_is_any_condjump || this_is_any_uncondjump)
|
||||
&& this_is_onlyjump)
|
||||
{
|
||||
next = next_real_insn (JUMP_LABEL (insn));
|
||||
delete_jump (insn);
|
||||
|
@ -404,7 +410,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
|
||||
/* Detect a conditional jump going to the same place
|
||||
as an immediately following unconditional jump. */
|
||||
else if (this_is_condjump
|
||||
else if (this_is_any_condjump && this_is_onlyjump
|
||||
&& (temp = next_active_insn (insn)) != 0
|
||||
&& simplejump_p (temp)
|
||||
&& (next_active_insn (JUMP_LABEL (insn))
|
||||
|
@ -427,13 +433,13 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
|
||||
/* Detect a conditional jump jumping over an unconditional jump. */
|
||||
|
||||
else if ((this_is_condjump || this_is_condjump_in_parallel)
|
||||
&& ! this_is_simplejump
|
||||
else if (this_is_any_condjump
|
||||
&& reallabelprev != 0
|
||||
&& GET_CODE (reallabelprev) == JUMP_INSN
|
||||
&& prev_active_insn (reallabelprev) == insn
|
||||
&& no_labels_between_p (insn, reallabelprev)
|
||||
&& simplejump_p (reallabelprev))
|
||||
&& any_uncondjump_p (reallabelprev)
|
||||
&& onlyjump_p (reallabelprev))
|
||||
{
|
||||
/* When we invert the unconditional jump, we will be
|
||||
decrementing the usage count of its old label.
|
||||
|
@ -484,7 +490,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
being branch to already has the identical USE or if code
|
||||
never falls through to that label. */
|
||||
|
||||
else if (this_is_simplejump
|
||||
else if (this_is_any_uncondjump
|
||||
&& (temp = prev_nonnote_insn (insn)) != 0
|
||||
&& GET_CODE (temp) == INSN
|
||||
&& GET_CODE (PATTERN (temp)) == USE
|
||||
|
@ -517,7 +523,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
#ifdef HAVE_trap
|
||||
/* Detect a conditional jump jumping over an unconditional trap. */
|
||||
if (HAVE_trap
|
||||
&& this_is_condjump && ! this_is_simplejump
|
||||
&& this_is_any_condjump && this_is_onlyjump
|
||||
&& reallabelprev != 0
|
||||
&& GET_CODE (reallabelprev) == INSN
|
||||
&& GET_CODE (PATTERN (reallabelprev)) == TRAP_IF
|
||||
|
@ -541,21 +547,22 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
}
|
||||
}
|
||||
/* Detect a jump jumping to an unconditional trap. */
|
||||
else if (HAVE_trap && this_is_condjump
|
||||
else if (HAVE_trap && this_is_onlyjump
|
||||
&& (temp = next_active_insn (JUMP_LABEL (insn)))
|
||||
&& GET_CODE (temp) == INSN
|
||||
&& GET_CODE (PATTERN (temp)) == TRAP_IF
|
||||
&& (this_is_simplejump
|
||||
|| (temp2 = get_condition (insn, &temp4))))
|
||||
&& (this_is_any_uncondjump
|
||||
|| (this_is_any_condjump
|
||||
&& temp2 = get_condition (insn, &temp4))))
|
||||
{
|
||||
rtx tc = TRAP_CONDITION (PATTERN (temp));
|
||||
|
||||
if (tc == const_true_rtx
|
||||
|| (! this_is_simplejump && rtx_equal_p (temp2, tc)))
|
||||
|| (! this_is_uncondjump && rtx_equal_p (temp2, tc)))
|
||||
{
|
||||
rtx new;
|
||||
/* Replace an unconditional jump to a trap with a trap. */
|
||||
if (this_is_simplejump)
|
||||
if (this_is_uncondjump)
|
||||
{
|
||||
emit_barrier_after (emit_insn_before (gen_trap (), insn));
|
||||
delete_jump (insn);
|
||||
|
@ -576,7 +583,7 @@ jump_optimize_1 (f, cross_jump, noop_moves, after_regscan,
|
|||
/* If the trap condition and jump condition are mutually
|
||||
exclusive, redirect the jump to the following insn. */
|
||||
else if (GET_RTX_CLASS (GET_CODE (tc)) == '<'
|
||||
&& ! this_is_simplejump
|
||||
&& this_is_any_condjump
|
||||
&& swap_condition (GET_CODE (temp2)) == GET_CODE (tc)
|
||||
&& rtx_equal_p (XEXP (tc, 0), XEXP (temp2, 0))
|
||||
&& rtx_equal_p (XEXP (tc, 1), XEXP (temp2, 1))
|
||||
|
@ -797,6 +804,7 @@ delete_barrier_successors (f)
|
|||
rtx f;
|
||||
{
|
||||
rtx insn;
|
||||
rtx set;
|
||||
|
||||
for (insn = f; insn;)
|
||||
{
|
||||
|
@ -821,9 +829,10 @@ delete_barrier_successors (f)
|
|||
gcse. We eliminate such insns now to avoid having them
|
||||
cause problems later. */
|
||||
else if (GET_CODE (insn) == JUMP_INSN
|
||||
&& GET_CODE (PATTERN (insn)) == SET
|
||||
&& SET_SRC (PATTERN (insn)) == pc_rtx
|
||||
&& SET_DEST (PATTERN (insn)) == pc_rtx)
|
||||
&& (set = pc_set (insn)) != NULL
|
||||
&& SET_SRC (set) == pc_rtx
|
||||
&& SET_DEST (set) == pc_rtx
|
||||
&& onlyjump_p (insn))
|
||||
insn = delete_insn (insn);
|
||||
|
||||
else
|
||||
|
@ -1707,26 +1716,29 @@ jump_back_p (insn, target)
|
|||
{
|
||||
rtx cinsn, ctarget;
|
||||
enum rtx_code codei, codet;
|
||||
rtx set, tset;
|
||||
|
||||
if (simplejump_p (insn) || ! condjump_p (insn)
|
||||
|| simplejump_p (target)
|
||||
if (! any_condjump_p (insn)
|
||||
|| any_uncondjump_p (target)
|
||||
|| target != prev_real_insn (JUMP_LABEL (insn)))
|
||||
return 0;
|
||||
set = pc_set (insn);
|
||||
tset = pc_set (target);
|
||||
|
||||
cinsn = XEXP (SET_SRC (PATTERN (insn)), 0);
|
||||
ctarget = XEXP (SET_SRC (PATTERN (target)), 0);
|
||||
cinsn = XEXP (SET_SRC (set), 0);
|
||||
ctarget = XEXP (SET_SRC (tset), 0);
|
||||
|
||||
codei = GET_CODE (cinsn);
|
||||
codet = GET_CODE (ctarget);
|
||||
|
||||
if (XEXP (SET_SRC (PATTERN (insn)), 1) == pc_rtx)
|
||||
if (XEXP (SET_SRC (set), 1) == pc_rtx)
|
||||
{
|
||||
if (! can_reverse_comparison_p (cinsn, insn))
|
||||
return 0;
|
||||
codei = reverse_condition (codei);
|
||||
}
|
||||
|
||||
if (XEXP (SET_SRC (PATTERN (target)), 2) == pc_rtx)
|
||||
if (XEXP (SET_SRC (tset), 2) == pc_rtx)
|
||||
{
|
||||
if (! can_reverse_comparison_p (ctarget, target))
|
||||
return 0;
|
||||
|
@ -2351,7 +2363,8 @@ follow_jumps (label)
|
|||
(depth < 10
|
||||
&& (insn = next_active_insn (value)) != 0
|
||||
&& GET_CODE (insn) == JUMP_INSN
|
||||
&& ((JUMP_LABEL (insn) != 0 && simplejump_p (insn))
|
||||
&& ((JUMP_LABEL (insn) != 0 && any_uncondjump_p (insn)
|
||||
&& onlyjump_p (insn))
|
||||
|| GET_CODE (PATTERN (insn)) == RETURN)
|
||||
&& (next = NEXT_INSN (insn))
|
||||
&& GET_CODE (next) == BARRIER);
|
||||
|
@ -3148,12 +3161,18 @@ redirect_exp_1 (loc, olabel, nlabel, insn)
|
|||
|
||||
/* Similar, but apply the change group and report success or failure. */
|
||||
|
||||
int
|
||||
redirect_exp (loc, olabel, nlabel, insn)
|
||||
rtx *loc;
|
||||
static int
|
||||
redirect_exp (olabel, nlabel, insn)
|
||||
rtx olabel, nlabel;
|
||||
rtx insn;
|
||||
{
|
||||
rtx *loc;
|
||||
|
||||
if (GET_CODE (PATTERN (insn)) == PARALLEL)
|
||||
loc = &XVECEXP (PATTERN (insn), 0, 0);
|
||||
else
|
||||
loc = &PATTERN (insn);
|
||||
|
||||
redirect_exp_1 (loc, olabel, nlabel, insn);
|
||||
if (num_validated_changes () == 0)
|
||||
return 0;
|
||||
|
@ -3170,7 +3189,14 @@ redirect_jump_1 (jump, nlabel)
|
|||
rtx jump, nlabel;
|
||||
{
|
||||
int ochanges = num_validated_changes ();
|
||||
redirect_exp_1 (&PATTERN (jump), JUMP_LABEL (jump), nlabel, jump);
|
||||
rtx *loc;
|
||||
|
||||
if (GET_CODE (PATTERN (jump)) == PARALLEL)
|
||||
loc = &XVECEXP (PATTERN (jump), 0, 0);
|
||||
else
|
||||
loc = &PATTERN (jump);
|
||||
|
||||
redirect_exp_1 (loc, JUMP_LABEL (jump), nlabel, jump);
|
||||
return num_validated_changes () > ochanges;
|
||||
}
|
||||
|
||||
|
@ -3194,7 +3220,7 @@ redirect_jump (jump, nlabel, delete_unused)
|
|||
if (nlabel == olabel)
|
||||
return 1;
|
||||
|
||||
if (! redirect_exp (&PATTERN (jump), olabel, nlabel, jump))
|
||||
if (! redirect_exp (olabel, nlabel, jump))
|
||||
return 0;
|
||||
|
||||
/* If this is an unconditional branch, delete it from the jump_chain of
|
||||
|
@ -3235,13 +3261,15 @@ redirect_jump (jump, nlabel, delete_unused)
|
|||
Accrue the modifications into the change group. */
|
||||
|
||||
static void
|
||||
invert_exp_1 (x, insn)
|
||||
rtx x;
|
||||
invert_exp_1 (insn)
|
||||
rtx insn;
|
||||
{
|
||||
register RTX_CODE code;
|
||||
register int i;
|
||||
register const char *fmt;
|
||||
rtx x = pc_set (insn);
|
||||
|
||||
if (!x)
|
||||
abort();
|
||||
x = SET_SRC (x);
|
||||
|
||||
code = GET_CODE (x);
|
||||
|
||||
|
@ -3268,34 +3296,21 @@ invert_exp_1 (x, insn)
|
|||
tem = XEXP (x, 1);
|
||||
validate_change (insn, &XEXP (x, 1), XEXP (x, 2), 1);
|
||||
validate_change (insn, &XEXP (x, 2), tem, 1);
|
||||
return;
|
||||
}
|
||||
|
||||
fmt = GET_RTX_FORMAT (code);
|
||||
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
|
||||
{
|
||||
if (fmt[i] == 'e')
|
||||
invert_exp_1 (XEXP (x, i), insn);
|
||||
else if (fmt[i] == 'E')
|
||||
{
|
||||
register int j;
|
||||
for (j = 0; j < XVECLEN (x, i); j++)
|
||||
invert_exp_1 (XVECEXP (x, i, j), insn);
|
||||
}
|
||||
}
|
||||
else
|
||||
abort ();
|
||||
}
|
||||
|
||||
/* Invert the jump condition of rtx X contained in jump insn, INSN.
|
||||
/* Invert the jump condition of conditional jump insn, INSN.
|
||||
|
||||
Return 1 if we can do so, 0 if we cannot find a way to do so that
|
||||
matches a pattern. */
|
||||
|
||||
int
|
||||
invert_exp (x, insn)
|
||||
rtx x;
|
||||
static int
|
||||
invert_exp (insn)
|
||||
rtx insn;
|
||||
{
|
||||
invert_exp_1 (x, insn);
|
||||
invert_exp_1 (insn);
|
||||
if (num_validated_changes () == 0)
|
||||
return 0;
|
||||
|
||||
|
@ -3314,7 +3329,7 @@ invert_jump_1 (jump, nlabel)
|
|||
int ochanges;
|
||||
|
||||
ochanges = num_validated_changes ();
|
||||
invert_exp_1 (PATTERN (jump), jump);
|
||||
invert_exp_1 (jump);
|
||||
if (num_validated_changes () == ochanges)
|
||||
return 0;
|
||||
|
||||
|
@ -3334,7 +3349,7 @@ invert_jump (jump, nlabel, delete_unused)
|
|||
the jump. If that succeeds, we try changing the label. If that fails,
|
||||
we invert the jump back to what it was. */
|
||||
|
||||
if (! invert_exp (PATTERN (jump), jump))
|
||||
if (! invert_exp (jump))
|
||||
return 0;
|
||||
|
||||
if (redirect_jump (jump, nlabel, delete_unused))
|
||||
|
@ -3350,7 +3365,7 @@ invert_jump (jump, nlabel, delete_unused)
|
|||
return 1;
|
||||
}
|
||||
|
||||
if (! invert_exp (PATTERN (jump), jump))
|
||||
if (! invert_exp (jump))
|
||||
/* This should just be putting it back the way it was. */
|
||||
abort ();
|
||||
|
||||
|
@ -3788,10 +3803,11 @@ thread_jumps (f, max_reg, flag_before_loop)
|
|||
|
||||
for (b1 = f; b1; b1 = NEXT_INSN (b1))
|
||||
{
|
||||
rtx set;
|
||||
rtx set2;
|
||||
/* Get to a candidate branch insn. */
|
||||
if (GET_CODE (b1) != JUMP_INSN
|
||||
|| ! condjump_p (b1) || simplejump_p (b1)
|
||||
|| JUMP_LABEL (b1) == 0)
|
||||
|| ! any_condjump_p (b1) || JUMP_LABEL (b1) == 0)
|
||||
continue;
|
||||
|
||||
bzero (modified_regs, max_reg * sizeof (char));
|
||||
|
@ -3815,7 +3831,8 @@ thread_jumps (f, max_reg, flag_before_loop)
|
|||
{
|
||||
/* If this is an unconditional jump and is the only use of
|
||||
its target label, we can follow it. */
|
||||
if (simplejump_p (b2)
|
||||
if (any_uncondjump_p (b2)
|
||||
&& onlyjump_p (b2)
|
||||
&& JUMP_LABEL (b2) != 0
|
||||
&& LABEL_NUSES (JUMP_LABEL (b2)) == 1)
|
||||
{
|
||||
|
@ -3849,23 +3866,25 @@ thread_jumps (f, max_reg, flag_before_loop)
|
|||
if (b2 == 0
|
||||
|| GET_CODE (b2) != JUMP_INSN
|
||||
|| b2 == b1
|
||||
|| ! condjump_p (b2)
|
||||
|| simplejump_p (b2))
|
||||
|| !any_condjump_p (b2)
|
||||
|| !onlyjump_p (b2))
|
||||
continue;
|
||||
set = pc_set (b1);
|
||||
set2 = pc_set (b2);
|
||||
|
||||
/* Get the comparison codes and operands, reversing the
|
||||
codes if appropriate. If we don't have comparison codes,
|
||||
we can't do anything. */
|
||||
b1op0 = XEXP (XEXP (SET_SRC (PATTERN (b1)), 0), 0);
|
||||
b1op1 = XEXP (XEXP (SET_SRC (PATTERN (b1)), 0), 1);
|
||||
code1 = GET_CODE (XEXP (SET_SRC (PATTERN (b1)), 0));
|
||||
if (XEXP (SET_SRC (PATTERN (b1)), 1) == pc_rtx)
|
||||
b1op0 = XEXP (XEXP (SET_SRC (set), 0), 0);
|
||||
b1op1 = XEXP (XEXP (SET_SRC (set), 0), 1);
|
||||
code1 = GET_CODE (XEXP (SET_SRC (set), 0));
|
||||
if (XEXP (SET_SRC (set), 1) == pc_rtx)
|
||||
code1 = reverse_condition (code1);
|
||||
|
||||
b2op0 = XEXP (XEXP (SET_SRC (PATTERN (b2)), 0), 0);
|
||||
b2op1 = XEXP (XEXP (SET_SRC (PATTERN (b2)), 0), 1);
|
||||
code2 = GET_CODE (XEXP (SET_SRC (PATTERN (b2)), 0));
|
||||
if (XEXP (SET_SRC (PATTERN (b2)), 1) == pc_rtx)
|
||||
b2op0 = XEXP (XEXP (SET_SRC (set2), 0), 0);
|
||||
b2op1 = XEXP (XEXP (SET_SRC (set2), 0), 1);
|
||||
code2 = GET_CODE (XEXP (SET_SRC (set2), 0));
|
||||
if (XEXP (SET_SRC (set2), 1) == pc_rtx)
|
||||
code2 = reverse_condition (code2);
|
||||
|
||||
/* If they test the same things and knowing that B1 branches
|
||||
|
@ -3874,9 +3893,7 @@ thread_jumps (f, max_reg, flag_before_loop)
|
|||
if (rtx_equal_for_thread_p (b1op0, b2op0, b2)
|
||||
&& rtx_equal_for_thread_p (b1op1, b2op1, b2)
|
||||
&& (comparison_dominates_p (code1, code2)
|
||||
|| (can_reverse_comparison_p (XEXP (SET_SRC (PATTERN (b1)),
|
||||
0),
|
||||
b1)
|
||||
|| (can_reverse_comparison_p (XEXP (SET_SRC (set), 0), b1)
|
||||
&& comparison_dominates_p (code1, reverse_condition (code2)))))
|
||||
|
||||
{
|
||||
|
|
|
@ -1532,9 +1532,7 @@ extern void jump_optimize PARAMS ((rtx, int, int, int));
|
|||
extern void jump_optimize_minimal PARAMS ((rtx));
|
||||
extern void rebuild_jump_labels PARAMS ((rtx));
|
||||
extern void thread_jumps PARAMS ((rtx, int, int));
|
||||
extern int redirect_exp PARAMS ((rtx *, rtx, rtx, rtx));
|
||||
extern int rtx_equal_for_thread_p PARAMS ((rtx, rtx, rtx));
|
||||
extern int invert_exp PARAMS ((rtx, rtx));
|
||||
extern int can_reverse_comparison_p PARAMS ((rtx, rtx));
|
||||
extern void delete_for_peephole PARAMS ((rtx, rtx));
|
||||
extern int condjump_in_parallel_p PARAMS ((rtx));
|
||||
|
|
23
gcc/unroll.c
23
gcc/unroll.c
|
@ -2037,22 +2037,17 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
|
|||
if (JUMP_LABEL (insn) == start_label && insn == copy_end
|
||||
&& ! last_iteration)
|
||||
{
|
||||
/* Update JUMP_LABEL correctly to make invert_jump working. */
|
||||
JUMP_LABEL (copy) = get_label_from_map (map,
|
||||
CODE_LABEL_NUMBER
|
||||
(JUMP_LABEL (insn)));
|
||||
/* This is a branch to the beginning of the loop; this is the
|
||||
last insn being copied; and this is not the last iteration.
|
||||
In this case, we want to change the original fall through
|
||||
case to be a branch past the end of the loop, and the
|
||||
original jump label case to fall_through. */
|
||||
|
||||
if (invert_exp (pattern, copy))
|
||||
{
|
||||
if (! redirect_exp (&pattern,
|
||||
get_label_from_map (map,
|
||||
CODE_LABEL_NUMBER
|
||||
(JUMP_LABEL (insn))),
|
||||
exit_label, copy))
|
||||
abort ();
|
||||
}
|
||||
else
|
||||
if (!invert_jump (copy, exit_label, 0))
|
||||
{
|
||||
rtx jmp;
|
||||
rtx lab = gen_label_rtx ();
|
||||
|
@ -2064,12 +2059,8 @@ copy_loop_body (copy_start, copy_end, map, exit_label, last_iteration,
|
|||
jmp = emit_barrier_after (jmp);
|
||||
emit_label_after (lab, jmp);
|
||||
LABEL_NUSES (lab) = 0;
|
||||
if (! redirect_exp (&pattern,
|
||||
get_label_from_map (map,
|
||||
CODE_LABEL_NUMBER
|
||||
(JUMP_LABEL (insn))),
|
||||
lab, copy))
|
||||
abort ();
|
||||
if (!redirect_jump (copy, lab, 0))
|
||||
abort();
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Reference in a new issue