recog.c (verify_changes, [...]): New functions, broken out of apply_change_group.

* recog.c (verify_changes, confirm_change_group): New functions,
	broken out of apply_change_group.
	(apply_change_group): Use them.
	* recog.h (verify_change, confirm_change_group): Declare.
	* rtl.h (redirect_jump_2): Declare.
	* jump.c (redirect_exp, invert_exp): Delete.
	(invert_exp_1): Take second parameter.  Return value.  Changed caller.
	(redirect_jump_2): New function, broken out of redirect_jump.
	(redirect_jump): Use redirect_jump_1 and redirect_jump_2.
	(invert_jump): Use invert_jump_1 and redirect_jump_2.
	* ifcvt.c (dead_or_predicable): Use redirect_jump_2.

From-SVN: r95813
This commit is contained in:
J"orn Rennecke 2005-03-02 22:02:32 +00:00 committed by Joern Rennecke
parent 7df74013f1
commit 0a63483247
6 changed files with 95 additions and 115 deletions

View File

@ -1,3 +1,17 @@
2005-03-02 J"orn Rennecke <joern.rennecke@st.com>
* recog.c (verify_changes, confirm_change_group): New functions,
broken out of apply_change_group.
(apply_change_group): Use them.
* recog.h (verify_change, confirm_change_group): Declare.
* rtl.h (redirect_jump_2): Declare.
* jump.c (redirect_exp, invert_exp): Delete.
(invert_exp_1): Take second parameter. Return value. Changed caller.
(redirect_jump_2): New function, broken out of redirect_jump.
(redirect_jump): Use redirect_jump_1 and redirect_jump_2.
(invert_jump): Use invert_jump_1 and redirect_jump_2.
* ifcvt.c (dead_or_predicable): Use redirect_jump_2.
2005-03-02 Geoffrey Keating <geoffk@apple.com>
* varasm.c (named_section): Use xstrdup rather than doing it by

View File

@ -3258,13 +3258,7 @@ dead_or_predicable (basic_block test_bb, basic_block merge_bb,
if (other_bb != new_dest)
{
if (old_dest)
LABEL_NUSES (old_dest) -= 1;
if (new_label)
LABEL_NUSES (new_label) += 1;
JUMP_LABEL (jump) = new_label;
if (reversep)
invert_br_probabilities (jump);
redirect_jump_2 (jump, old_dest, new_label, -1, reversep);
redirect_edge_succ (BRANCH_EDGE (test_bb), new_dest);
if (reversep)

View File

@ -67,9 +67,7 @@ static void init_label_info (rtx);
static void mark_all_labels (rtx);
static void delete_computation (rtx);
static void redirect_exp_1 (rtx *, rtx, rtx, rtx);
static int redirect_exp (rtx, rtx, rtx);
static void invert_exp_1 (rtx);
static int invert_exp (rtx);
static int invert_exp_1 (rtx, rtx);
static int returnjump_p_1 (rtx *, void *);
static void delete_prior_computation (rtx, rtx);
@ -1570,25 +1568,6 @@ redirect_exp_1 (rtx *loc, rtx olabel, rtx nlabel, rtx insn)
}
}
/* Similar, but apply the change group and report success or failure. */
static int
redirect_exp (rtx olabel, rtx 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;
return apply_change_group ();
}
/* Make JUMP go to NLABEL instead of where it jumps now. Accrue
the modifications into the change group. Return false if we did
not see how to do that. */
@ -1622,14 +1601,28 @@ int
redirect_jump (rtx jump, rtx nlabel, int delete_unused)
{
rtx olabel = JUMP_LABEL (jump);
rtx note;
if (nlabel == olabel)
return 1;
if (! redirect_exp (olabel, nlabel, jump))
if (! redirect_jump_1 (jump, nlabel) || ! apply_change_group ())
return 0;
redirect_jump_2 (jump, olabel, nlabel, delete_unused, 0);
return 1;
}
/* Fix up JUMP_LABEL and label ref counts after OLABEL has been replaced with
NLABEL in JUMP. If DELETE_UNUSED is non-negative, copy a
NOTE_INSN_FUNCTION_END found after OLABEL to the place after NLABEL.
If DELETE_UNUSED is positive, delete related insn to OLABEL if its ref
count has dropped to zero. */
void
redirect_jump_2 (rtx jump, rtx olabel, rtx nlabel, int delete_unused,
int invert)
{
rtx note;
JUMP_LABEL (jump) = nlabel;
if (nlabel)
++LABEL_NUSES (nlabel);
@ -1637,24 +1630,13 @@ redirect_jump (rtx jump, rtx nlabel, int delete_unused)
/* Update labels in any REG_EQUAL note. */
if ((note = find_reg_note (jump, REG_EQUAL, NULL_RTX)) != NULL_RTX)
{
if (nlabel && olabel)
{
rtx dest = XEXP (note, 0);
if (GET_CODE (dest) == IF_THEN_ELSE)
{
if (GET_CODE (XEXP (dest, 1)) == LABEL_REF
&& XEXP (XEXP (dest, 1), 0) == olabel)
XEXP (XEXP (dest, 1), 0) = nlabel;
if (GET_CODE (XEXP (dest, 2)) == LABEL_REF
&& XEXP (XEXP (dest, 2), 0) == olabel)
XEXP (XEXP (dest, 2), 0) = nlabel;
}
else
remove_note (jump, note);
}
if (!nlabel || (invert && !invert_exp_1 (XEXP (note, 0), jump)))
remove_note (jump, note);
else
remove_note (jump, note);
{
redirect_exp_1 (&XEXP (note, 0), olabel, nlabel, jump);
confirm_change_group ();
}
}
/* If we're eliding the jump over exception cleanups at the end of a
@ -1662,31 +1644,24 @@ redirect_jump (rtx jump, rtx nlabel, int delete_unused)
if (olabel && nlabel
&& NEXT_INSN (olabel)
&& NOTE_P (NEXT_INSN (olabel))
&& NOTE_LINE_NUMBER (NEXT_INSN (olabel)) == NOTE_INSN_FUNCTION_END)
&& NOTE_LINE_NUMBER (NEXT_INSN (olabel)) == NOTE_INSN_FUNCTION_END
&& delete_unused >= 0)
emit_note_after (NOTE_INSN_FUNCTION_END, nlabel);
if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused
if (olabel && --LABEL_NUSES (olabel) == 0 && delete_unused > 0
/* Undefined labels will remain outside the insn stream. */
&& INSN_UID (olabel))
delete_related_insns (olabel);
return 1;
if (invert)
invert_br_probabilities (jump);
}
/* Invert the jump condition of rtx X contained in jump insn, INSN.
Accrue the modifications into the change group. */
static void
invert_exp_1 (rtx insn)
/* Invert the jump condition X contained in jump insn INSN. Accrue the
modifications into the change group. Return nonzero for success. */
static int
invert_exp_1 (rtx x, rtx insn)
{
RTX_CODE code;
rtx x = pc_set (insn);
if (!x)
abort ();
x = SET_SRC (x);
code = GET_CODE (x);
RTX_CODE code = GET_CODE (x);
if (code == IF_THEN_ELSE)
{
@ -1708,30 +1683,16 @@ invert_exp_1 (rtx insn)
GET_MODE (comp), XEXP (comp, 0),
XEXP (comp, 1)),
1);
return;
return 1;
}
tem = XEXP (x, 1);
validate_change (insn, &XEXP (x, 1), XEXP (x, 2), 1);
validate_change (insn, &XEXP (x, 2), tem, 1);
return 1;
}
else
abort ();
}
/* 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. */
static int
invert_exp (rtx insn)
{
invert_exp_1 (insn);
if (num_validated_changes () == 0)
return 0;
return apply_change_group ();
}
/* Invert the condition of the jump JUMP, and make it jump to label
@ -1742,10 +1703,12 @@ invert_exp (rtx insn)
int
invert_jump_1 (rtx jump, rtx nlabel)
{
rtx x = pc_set (jump);
int ochanges;
ochanges = num_validated_changes ();
invert_exp_1 (jump);
if (!x || !invert_exp_1 (SET_SRC (x), jump))
abort ();
if (num_validated_changes () == ochanges)
return 0;
@ -1758,30 +1721,14 @@ invert_jump_1 (rtx jump, rtx nlabel)
int
invert_jump (rtx jump, rtx nlabel, int delete_unused)
{
/* We have to either invert the condition and change the label or
do neither. Either operation could fail. We first try to invert
the jump. If that succeeds, we try changing the label. If that fails,
we invert the jump back to what it was. */
rtx olabel = JUMP_LABEL (jump);
if (! invert_exp (jump))
return 0;
if (redirect_jump (jump, nlabel, delete_unused))
if (invert_jump_1 (jump, nlabel) && apply_change_group ())
{
/* Remove REG_EQUAL note if we have one. */
rtx note = find_reg_note (jump, REG_EQUAL, NULL_RTX);
if (note)
remove_note (jump, note);
invert_br_probabilities (jump);
redirect_jump_2 (jump, olabel, nlabel, delete_unused, 1);
return 1;
}
if (! invert_exp (jump))
/* This should just be putting it back the way it was. */
abort ();
cancel_changes (0);
return 0;
}

View File

@ -294,11 +294,11 @@ num_changes_pending (void)
return num_changes;
}
/* Apply a group of changes previously issued with `validate_change'.
/* Tentatively apply the changes numbered NUM and up.
Return 1 if all changes are valid, zero otherwise. */
int
apply_change_group (void)
verify_changes (int num)
{
int i;
rtx last_validated = NULL_RTX;
@ -312,7 +312,7 @@ apply_change_group (void)
we also require that the operands meet the constraints for
the insn. */
for (i = 0; i < num_changes; i++)
for (i = num; i < num_changes; i++)
{
rtx object = changes[i].object;
@ -376,17 +376,38 @@ apply_change_group (void)
last_validated = object;
}
if (i == num_changes)
return (i == num_changes);
}
/* A group of changes has previously been issued with validate_change and
verified with verify_changes. Update the BB_DIRTY flags of the affected
blocks, and clear num_changes. */
void
confirm_change_group (void)
{
int i;
basic_block bb;
for (i = 0; i < num_changes; i++)
if (changes[i].object
&& INSN_P (changes[i].object)
&& (bb = BLOCK_FOR_INSN (changes[i].object)))
bb->flags |= BB_DIRTY;
num_changes = 0;
}
/* Apply a group of changes previously issued with `validate_change'.
If all changes are valid, call confirm_change_group and return 1,
otherwise, call cancel_changes and return 0. */
int
apply_change_group (void)
{
if (verify_changes (0))
{
basic_block bb;
for (i = 0; i < num_changes; i++)
if (changes[i].object
&& INSN_P (changes[i].object)
&& (bb = BLOCK_FOR_INSN (changes[i].object)))
bb->flags |= BB_DIRTY;
num_changes = 0;
confirm_change_group ();
return 1;
}
else
@ -396,6 +417,7 @@ apply_change_group (void)
}
}
/* Return the number of changes so far in the current group. */
int

View File

@ -75,6 +75,8 @@ extern int check_asm_operands (rtx);
extern int asm_operand_ok (rtx, const char *);
extern int validate_change (rtx, rtx *, rtx, int);
extern int insn_invalid_p (rtx);
extern int verify_changes (int);
extern void confirm_change_group (void);
extern int apply_change_group (void);
extern int num_validated_changes (void);
extern void cancel_changes (int);

View File

@ -1912,6 +1912,7 @@ extern int rtx_renumbered_equal_p (rtx, rtx);
extern int true_regnum (rtx);
extern unsigned int reg_or_subregno (rtx);
extern int redirect_jump_1 (rtx, rtx);
extern void redirect_jump_2 (rtx, rtx, rtx, int, int);
extern int redirect_jump (rtx, rtx, int);
extern void rebuild_jump_labels (rtx);
extern enum rtx_code reversed_comparison_code (rtx, rtx);