Commit bce204e5 by Maxim Kuvyrkov Committed by Maxim Kuvyrkov

combine.c (subst, [...]): Add new argument, use it to track processing of conditionals.

	* combine.c (subst, combine_simlify_rtx): Add new argument, use it
	to track processing of conditionals.  Update all callers.
	(try_combine, simplify_if_then_else): Update.

From-SVN: r172486
parent f11b3b32
2011-04-15 Maxim Kuvyrkov <maxim@codesourcery.com> 2011-04-15 Maxim Kuvyrkov <maxim@codesourcery.com>
* combine.c (subst, combine_simlify_rtx): Add new argument, use it
to track processing of conditionals. Update all callers.
(try_combine, simplify_if_then_else): Update.
2011-04-15 Maxim Kuvyrkov <maxim@codesourcery.com>
* config/m68k/m68k.c (m68k_sched_variable_issue): Handle * config/m68k/m68k.c (m68k_sched_variable_issue): Handle
-fsched-pressure. -fsched-pressure.
......
...@@ -417,8 +417,8 @@ static rtx try_combine (rtx, rtx, rtx, rtx, int *, rtx); ...@@ -417,8 +417,8 @@ static rtx try_combine (rtx, rtx, rtx, rtx, int *, rtx);
static void undo_all (void); static void undo_all (void);
static void undo_commit (void); static void undo_commit (void);
static rtx *find_split_point (rtx *, rtx, bool); static rtx *find_split_point (rtx *, rtx, bool);
static rtx subst (rtx, rtx, rtx, int, int); static rtx subst (rtx, rtx, rtx, int, int, int);
static rtx combine_simplify_rtx (rtx, enum machine_mode, int); static rtx combine_simplify_rtx (rtx, enum machine_mode, int, int);
static rtx simplify_if_then_else (rtx); static rtx simplify_if_then_else (rtx);
static rtx simplify_set (rtx); static rtx simplify_set (rtx);
static rtx simplify_logical (rtx); static rtx simplify_logical (rtx);
...@@ -3125,11 +3125,11 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, ...@@ -3125,11 +3125,11 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
if (i1) if (i1)
{ {
subst_low_luid = DF_INSN_LUID (i1); subst_low_luid = DF_INSN_LUID (i1);
i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0); i1src = subst (i1src, pc_rtx, pc_rtx, 0, 0, 0);
} }
subst_low_luid = DF_INSN_LUID (i2); subst_low_luid = DF_INSN_LUID (i2);
i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0); i2src = subst (i2src, pc_rtx, pc_rtx, 0, 0, 0);
} }
n_occurrences = 0; /* `subst' counts here */ n_occurrences = 0; /* `subst' counts here */
...@@ -3140,7 +3140,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, ...@@ -3140,7 +3140,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
self-referential RTL when we will be substituting I1SRC for I1DEST self-referential RTL when we will be substituting I1SRC for I1DEST
later. Likewise if I0 feeds into I2, either directly or indirectly later. Likewise if I0 feeds into I2, either directly or indirectly
through I1, and I0DEST is in I0SRC. */ through I1, and I0DEST is in I0SRC. */
newpat = subst (PATTERN (i3), i2dest, i2src, 0, newpat = subst (PATTERN (i3), i2dest, i2src, 0, 0,
(i1_feeds_i2_n && i1dest_in_i1src) (i1_feeds_i2_n && i1dest_in_i1src)
|| ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n)) || ((i0_feeds_i2_n || (i0_feeds_i1_n && i1_feeds_i2_n))
&& i0dest_in_i0src)); && i0dest_in_i0src));
...@@ -3179,7 +3179,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, ...@@ -3179,7 +3179,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
copy of I1SRC each time we substitute it, in order to avoid creating copy of I1SRC each time we substitute it, in order to avoid creating
self-referential RTL when we will be substituting I0SRC for I0DEST self-referential RTL when we will be substituting I0SRC for I0DEST
later. */ later. */
newpat = subst (newpat, i1dest, i1src, 0, newpat = subst (newpat, i1dest, i1src, 0, 0,
i0_feeds_i1_n && i0dest_in_i0src); i0_feeds_i1_n && i0dest_in_i0src);
substed_i1 = 1; substed_i1 = 1;
...@@ -3209,7 +3209,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, ...@@ -3209,7 +3209,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
n_occurrences = 0; n_occurrences = 0;
subst_low_luid = DF_INSN_LUID (i0); subst_low_luid = DF_INSN_LUID (i0);
newpat = subst (newpat, i0dest, i0src, 0, 0); newpat = subst (newpat, i0dest, i0src, 0, 0, 0);
substed_i0 = 1; substed_i0 = 1;
} }
...@@ -3271,7 +3271,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, ...@@ -3271,7 +3271,7 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
{ {
rtx t = i1pat; rtx t = i1pat;
if (i0_feeds_i1_n) if (i0_feeds_i1_n)
t = subst (t, i0dest, i0src, 0, 0); t = subst (t, i0dest, i0src, 0, 0, 0);
XVECEXP (newpat, 0, --total_sets) = t; XVECEXP (newpat, 0, --total_sets) = t;
} }
...@@ -3279,10 +3279,10 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p, ...@@ -3279,10 +3279,10 @@ try_combine (rtx i3, rtx i2, rtx i1, rtx i0, int *new_direct_jump_p,
{ {
rtx t = i2pat; rtx t = i2pat;
if (i1_feeds_i2_n) if (i1_feeds_i2_n)
t = subst (t, i1dest, i1src_copy ? i1src_copy : i1src, 0, t = subst (t, i1dest, i1src_copy ? i1src_copy : i1src, 0, 0,
i0_feeds_i1_n && i0dest_in_i0src); i0_feeds_i1_n && i0dest_in_i0src);
if ((i0_feeds_i1_n && i1_feeds_i2_n) || i0_feeds_i2_n) if ((i0_feeds_i1_n && i1_feeds_i2_n) || i0_feeds_i2_n)
t = subst (t, i0dest, i0src, 0, 0); t = subst (t, i0dest, i0src, 0, 0, 0);
XVECEXP (newpat, 0, --total_sets) = t; XVECEXP (newpat, 0, --total_sets) = t;
} }
...@@ -4948,11 +4948,13 @@ find_split_point (rtx *loc, rtx insn, bool set_src) ...@@ -4948,11 +4948,13 @@ find_split_point (rtx *loc, rtx insn, bool set_src)
IN_DEST is nonzero if we are processing the SET_DEST of a SET. IN_DEST is nonzero if we are processing the SET_DEST of a SET.
IN_COND is nonzero if we are at the top level of a condition.
UNIQUE_COPY is nonzero if each substitution must be unique. We do this UNIQUE_COPY is nonzero if each substitution must be unique. We do this
by copying if `n_occurrences' is nonzero. */ by copying if `n_occurrences' is nonzero. */
static rtx static rtx
subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy) subst (rtx x, rtx from, rtx to, int in_dest, int in_cond, int unique_copy)
{ {
enum rtx_code code = GET_CODE (x); enum rtx_code code = GET_CODE (x);
enum machine_mode op0_mode = VOIDmode; enum machine_mode op0_mode = VOIDmode;
...@@ -5013,7 +5015,7 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy) ...@@ -5013,7 +5015,7 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
&& GET_CODE (XVECEXP (x, 0, 0)) == SET && GET_CODE (XVECEXP (x, 0, 0)) == SET
&& GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS) && GET_CODE (SET_SRC (XVECEXP (x, 0, 0))) == ASM_OPERANDS)
{ {
new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, unique_copy); new_rtx = subst (XVECEXP (x, 0, 0), from, to, 0, 0, unique_copy);
/* If this substitution failed, this whole thing fails. */ /* If this substitution failed, this whole thing fails. */
if (GET_CODE (new_rtx) == CLOBBER if (GET_CODE (new_rtx) == CLOBBER
...@@ -5030,7 +5032,7 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy) ...@@ -5030,7 +5032,7 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
&& GET_CODE (dest) != CC0 && GET_CODE (dest) != CC0
&& GET_CODE (dest) != PC) && GET_CODE (dest) != PC)
{ {
new_rtx = subst (dest, from, to, 0, unique_copy); new_rtx = subst (dest, from, to, 0, 0, unique_copy);
/* If this substitution failed, this whole thing fails. */ /* If this substitution failed, this whole thing fails. */
if (GET_CODE (new_rtx) == CLOBBER if (GET_CODE (new_rtx) == CLOBBER
...@@ -5076,8 +5078,8 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy) ...@@ -5076,8 +5078,8 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
} }
else else
{ {
new_rtx = subst (XVECEXP (x, i, j), from, to, 0, new_rtx = subst (XVECEXP (x, i, j), from, to, 0, 0,
unique_copy); unique_copy);
/* If this substitution failed, this whole thing /* If this substitution failed, this whole thing
fails. */ fails. */
...@@ -5154,7 +5156,9 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy) ...@@ -5154,7 +5156,9 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
&& (code == SUBREG || code == STRICT_LOW_PART && (code == SUBREG || code == STRICT_LOW_PART
|| code == ZERO_EXTRACT)) || code == ZERO_EXTRACT))
|| code == SET) || code == SET)
&& i == 0), unique_copy); && i == 0),
code == IF_THEN_ELSE && i == 0,
unique_copy);
/* If we found that we will have to reject this combination, /* If we found that we will have to reject this combination,
indicate that by returning the CLOBBER ourselves, rather than indicate that by returning the CLOBBER ourselves, rather than
...@@ -5211,7 +5215,7 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy) ...@@ -5211,7 +5215,7 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
/* If X is sufficiently simple, don't bother trying to do anything /* If X is sufficiently simple, don't bother trying to do anything
with it. */ with it. */
if (code != CONST_INT && code != REG && code != CLOBBER) if (code != CONST_INT && code != REG && code != CLOBBER)
x = combine_simplify_rtx (x, op0_mode, in_dest); x = combine_simplify_rtx (x, op0_mode, in_dest, in_cond);
if (GET_CODE (x) == code) if (GET_CODE (x) == code)
break; break;
...@@ -5231,10 +5235,12 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy) ...@@ -5231,10 +5235,12 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
expression. expression.
OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero OP0_MODE is the original mode of XEXP (x, 0). IN_DEST is nonzero
if we are inside a SET_DEST. */ if we are inside a SET_DEST. IN_COND is nonzero if we are at the top level
of a condition. */
static rtx static rtx
combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest) combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest,
int in_cond)
{ {
enum rtx_code code = GET_CODE (x); enum rtx_code code = GET_CODE (x);
enum machine_mode mode = GET_MODE (x); enum machine_mode mode = GET_MODE (x);
...@@ -5289,8 +5295,8 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest) ...@@ -5289,8 +5295,8 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
false arms to store-flag values. Be careful to use copy_rtx false arms to store-flag values. Be careful to use copy_rtx
here since true_rtx or false_rtx might share RTL with x as a here since true_rtx or false_rtx might share RTL with x as a
result of the if_then_else_cond call above. */ result of the if_then_else_cond call above. */
true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0); true_rtx = subst (copy_rtx (true_rtx), pc_rtx, pc_rtx, 0, 0, 0);
false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0); false_rtx = subst (copy_rtx (false_rtx), pc_rtx, pc_rtx, 0, 0, 0);
/* If true_rtx and false_rtx are not general_operands, an if_then_else /* If true_rtx and false_rtx are not general_operands, an if_then_else
is unlikely to be simpler. */ is unlikely to be simpler. */
...@@ -5634,7 +5640,7 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest) ...@@ -5634,7 +5640,7 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
{ {
/* Try to simplify the expression further. */ /* Try to simplify the expression further. */
rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1)); rtx tor = simplify_gen_binary (IOR, mode, XEXP (x, 0), XEXP (x, 1));
temp = combine_simplify_rtx (tor, mode, in_dest); temp = combine_simplify_rtx (tor, mode, in_dest, 0);
/* If we could, great. If not, do not go ahead with the IOR /* If we could, great. If not, do not go ahead with the IOR
replacement, since PLUS appears in many special purpose replacement, since PLUS appears in many special purpose
...@@ -5725,9 +5731,17 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest) ...@@ -5725,9 +5731,17 @@ combine_simplify_rtx (rtx x, enum machine_mode op0_mode, int in_dest)
Remove any ZERO_EXTRACT we made when thinking this was a Remove any ZERO_EXTRACT we made when thinking this was a
comparison. It may now be simpler to use, e.g., an AND. If a comparison. It may now be simpler to use, e.g., an AND. If a
ZERO_EXTRACT is indeed appropriate, it will be placed back by ZERO_EXTRACT is indeed appropriate, it will be placed back by
the call to make_compound_operation in the SET case. */ the call to make_compound_operation in the SET case.
Don't apply these optimizations if the caller would
prefer a comparison rather than a value.
E.g., for the condition in an IF_THEN_ELSE most targets need
an explicit comparison. */
if (STORE_FLAG_VALUE == 1 if (in_cond)
;
else if (STORE_FLAG_VALUE == 1
&& new_code == NE && GET_MODE_CLASS (mode) == MODE_INT && new_code == NE && GET_MODE_CLASS (mode) == MODE_INT
&& op1 == const0_rtx && op1 == const0_rtx
&& mode == GET_MODE (op0) && mode == GET_MODE (op0)
...@@ -5971,11 +5985,11 @@ simplify_if_then_else (rtx x) ...@@ -5971,11 +5985,11 @@ simplify_if_then_else (rtx x)
if (reg_mentioned_p (from, true_rtx)) if (reg_mentioned_p (from, true_rtx))
true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code, true_rtx = subst (known_cond (copy_rtx (true_rtx), true_code,
from, true_val), from, true_val),
pc_rtx, pc_rtx, 0, 0); pc_rtx, pc_rtx, 0, 0, 0);
if (reg_mentioned_p (from, false_rtx)) if (reg_mentioned_p (from, false_rtx))
false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code, false_rtx = subst (known_cond (copy_rtx (false_rtx), false_code,
from, false_val), from, false_val),
pc_rtx, pc_rtx, 0, 0); pc_rtx, pc_rtx, 0, 0, 0);
SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx); SUBST (XEXP (x, 1), swapped ? false_rtx : true_rtx);
SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx); SUBST (XEXP (x, 2), swapped ? true_rtx : false_rtx);
...@@ -6192,11 +6206,11 @@ simplify_if_then_else (rtx x) ...@@ -6192,11 +6206,11 @@ simplify_if_then_else (rtx x)
{ {
temp = subst (simplify_gen_relational (true_code, m, VOIDmode, temp = subst (simplify_gen_relational (true_code, m, VOIDmode,
cond_op0, cond_op1), cond_op0, cond_op1),
pc_rtx, pc_rtx, 0, 0); pc_rtx, pc_rtx, 0, 0, 0);
temp = simplify_gen_binary (MULT, m, temp, temp = simplify_gen_binary (MULT, m, temp,
simplify_gen_binary (MULT, m, c1, simplify_gen_binary (MULT, m, c1,
const_true_rtx)); const_true_rtx));
temp = subst (temp, pc_rtx, pc_rtx, 0, 0); temp = subst (temp, pc_rtx, pc_rtx, 0, 0, 0);
temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp); temp = simplify_gen_binary (op, m, gen_lowpart (m, z), temp);
if (extend_op != UNKNOWN) if (extend_op != UNKNOWN)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment