Commit 5fd8383e by Richard Kenner

*** empty log message ***

From-SVN: r1482
parent 95393dfd
/* Move constant computations out of loops. /* Move constant computations out of loops.
Copyright (C) 1987, 1988, 1989, 1991 Free Software Foundation, Inc. Copyright (C) 1987, 1988, 1989, 1991, 1992 Free Software Foundation, Inc.
This file is part of GNU CC. This file is part of GNU CC.
...@@ -97,12 +97,12 @@ static char *loop_invalid; ...@@ -97,12 +97,12 @@ static char *loop_invalid;
rtx *loop_number_exit_labels; rtx *loop_number_exit_labels;
/* Holds the number of loop iterations. It is zero if the number could not be /* Holds the number of loop iterations. It is zero if the number could not be
calculated. Must be unsigned long since the number of iterations can calculated. Must be unsigned since the number of iterations can
be as high as 2^31-1. For loops with a DImode iterator, this number will be as high as 2^wordsize-1. For loops with a wider iterator, this number
will be zero if the number of loop iterations is too large for an will will be zero if the number of loop iterations is too large for an
unsigned long to hold. */ unsigned integer to hold. */
unsigned long loop_n_iterations; unsigned HOST_WIDE_INT loop_n_iterations;
/* Nonzero if there is a subroutine call in the current loop. /* Nonzero if there is a subroutine call in the current loop.
(unknown_address_altered is also nonzero in this case.) */ (unknown_address_altered is also nonzero in this case.) */
...@@ -298,7 +298,7 @@ init_loop () ...@@ -298,7 +298,7 @@ init_loop ()
{ {
char *free_point = (char *) oballoc (1); char *free_point = (char *) oballoc (1);
rtx reg = gen_rtx (REG, SImode, 0); rtx reg = gen_rtx (REG, SImode, 0);
rtx pow2 = gen_rtx (CONST_INT, VOIDmode, 32); rtx pow2 = GEN_INT (32);
rtx lea; rtx lea;
int i; int i;
...@@ -307,11 +307,8 @@ init_loop () ...@@ -307,11 +307,8 @@ init_loop ()
/* We multiply by 2 to reconcile the difference in scale between /* We multiply by 2 to reconcile the difference in scale between
these two ways of computing costs. Otherwise the cost of a copy these two ways of computing costs. Otherwise the cost of a copy
will be far less than the cost of an add. */ will be far less than the cost of an add. */
#ifdef REGISTER_MOVE_COST
copy_cost = REGISTER_MOVE_COST (GENERAL_REGS, GENERAL_REGS) * 2;
#else
copy_cost = 2 * 2; copy_cost = 2 * 2;
#endif
/* Free the objects we just allocated. */ /* Free the objects we just allocated. */
obfree (free_point); obfree (free_point);
...@@ -637,10 +634,10 @@ scan_loop (loop_start, end, nregs) ...@@ -637,10 +634,10 @@ scan_loop (loop_start, end, nregs)
} }
if (GET_RTX_CLASS (GET_CODE (p)) == 'i' if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
&& find_reg_note (p, REG_LIBCALL, 0)) && find_reg_note (p, REG_LIBCALL, NULL_RTX))
in_libcall = 1; in_libcall = 1;
else if (GET_RTX_CLASS (GET_CODE (p)) == 'i' else if (GET_RTX_CLASS (GET_CODE (p)) == 'i'
&& find_reg_note (p, REG_RETVAL, 0)) && find_reg_note (p, REG_RETVAL, NULL_RTX))
in_libcall = 0; in_libcall = 0;
if (GET_CODE (p) == INSN if (GET_CODE (p) == INSN
...@@ -662,15 +659,15 @@ scan_loop (loop_start, end, nregs) ...@@ -662,15 +659,15 @@ scan_loop (loop_start, end, nregs)
Otherwise, only use the REG_EQUAL contents if a REG_RETVAL note Otherwise, only use the REG_EQUAL contents if a REG_RETVAL note
is present. */ is present. */
temp = find_reg_note (p, REG_EQUIV, 0); temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
if (temp) if (temp)
src = XEXP (temp, 0), move_insn = 1; src = XEXP (temp, 0), move_insn = 1;
else else
{ {
temp = find_reg_note (p, REG_EQUAL, 0); temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
if (temp && CONSTANT_P (XEXP (temp, 0))) if (temp && CONSTANT_P (XEXP (temp, 0)))
src = XEXP (temp, 0), move_insn = 1; src = XEXP (temp, 0), move_insn = 1;
if (temp && find_reg_note (p, REG_RETVAL, 0)) if (temp && find_reg_note (p, REG_RETVAL, NULL_RTX))
{ {
src = XEXP (temp, 0); src = XEXP (temp, 0);
/* A libcall block can use regs that don't appear in /* A libcall block can use regs that don't appear in
...@@ -736,7 +733,7 @@ scan_loop (loop_start, end, nregs) ...@@ -736,7 +733,7 @@ scan_loop (loop_start, end, nregs)
== INSN_UID (reg_single_usage[regno])) == INSN_UID (reg_single_usage[regno]))
&& n_times_set[REGNO (SET_DEST (set))] == 1 && n_times_set[REGNO (SET_DEST (set))] == 1
&& ! side_effects_p (SET_SRC (set)) && ! side_effects_p (SET_SRC (set))
&& ! find_reg_note (p, REG_RETVAL, 0) && ! find_reg_note (p, REG_RETVAL, NULL_RTX)
#ifdef SMALL_REGISTER_CLASSES #ifdef SMALL_REGISTER_CLASSES
&& ! (GET_CODE (SET_SRC (set)) == REG && ! (GET_CODE (SET_SRC (set)) == REG
&& REGNO (SET_SRC (set)) < FIRST_PSEUDO_REGISTER) && REGNO (SET_SRC (set)) < FIRST_PSEUDO_REGISTER)
...@@ -773,7 +770,7 @@ scan_loop (loop_start, end, nregs) ...@@ -773,7 +770,7 @@ scan_loop (loop_start, end, nregs)
m->forces = 0; m->forces = 0;
m->partial = 0; m->partial = 0;
m->move_insn = move_insn; m->move_insn = move_insn;
m->is_equiv = (find_reg_note (p, REG_EQUIV, 0) != 0); m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
m->savemode = VOIDmode; m->savemode = VOIDmode;
m->regno = regno; m->regno = regno;
/* Set M->cond if either invariant_p or consec_sets_invariant_p /* Set M->cond if either invariant_p or consec_sets_invariant_p
...@@ -785,7 +782,7 @@ scan_loop (loop_start, end, nregs) ...@@ -785,7 +782,7 @@ scan_loop (loop_start, end, nregs)
m->lifetime = (uid_luid[regno_last_uid[regno]] m->lifetime = (uid_luid[regno_last_uid[regno]]
- uid_luid[regno_first_uid[regno]]); - uid_luid[regno_first_uid[regno]]);
m->savings = n_times_used[regno]; m->savings = n_times_used[regno];
if (find_reg_note (p, REG_RETVAL, 0)) if (find_reg_note (p, REG_RETVAL, NULL_RTX))
m->savings += libcall_benefit (p); m->savings += libcall_benefit (p);
n_times_set[regno] = move_insn ? -2 : -1; n_times_set[regno] = move_insn ? -2 : -1;
/* Add M to the end of the chain MOVABLES. */ /* Add M to the end of the chain MOVABLES. */
...@@ -807,19 +804,19 @@ scan_loop (loop_start, end, nregs) ...@@ -807,19 +804,19 @@ scan_loop (loop_start, end, nregs)
/* We must now reset m->move_insn, m->is_equiv, and possibly /* We must now reset m->move_insn, m->is_equiv, and possibly
m->set_src to correspond to the effects of all the m->set_src to correspond to the effects of all the
insns. */ insns. */
temp = find_reg_note (p, REG_EQUIV, 0); temp = find_reg_note (p, REG_EQUIV, NULL_RTX);
if (temp) if (temp)
m->set_src = XEXP (temp, 0), m->move_insn = 1; m->set_src = XEXP (temp, 0), m->move_insn = 1;
else else
{ {
temp = find_reg_note (p, REG_EQUAL, 0); temp = find_reg_note (p, REG_EQUAL, NULL_RTX);
if (temp && CONSTANT_P (XEXP (temp, 0))) if (temp && CONSTANT_P (XEXP (temp, 0)))
m->set_src = XEXP (temp, 0), m->move_insn = 1; m->set_src = XEXP (temp, 0), m->move_insn = 1;
else else
m->move_insn = 0; m->move_insn = 0;
} }
m->is_equiv = (find_reg_note (p, REG_EQUIV, 0) != 0); m->is_equiv = (find_reg_note (p, REG_EQUIV, NULL_RTX) != 0);
} }
} }
/* If this register is always set within a STRICT_LOW_PART /* If this register is always set within a STRICT_LOW_PART
...@@ -1025,7 +1022,7 @@ static rtx ...@@ -1025,7 +1022,7 @@ static rtx
libcall_other_reg (insn, equiv) libcall_other_reg (insn, equiv)
rtx insn, equiv; rtx insn, equiv;
{ {
rtx note = find_reg_note (insn, REG_RETVAL, 0); rtx note = find_reg_note (insn, REG_RETVAL, NULL_RTX);
rtx p = XEXP (note, 0); rtx p = XEXP (note, 0);
rtx output = 0; rtx output = 0;
...@@ -1100,7 +1097,7 @@ libcall_benefit (last) ...@@ -1100,7 +1097,7 @@ libcall_benefit (last)
rtx insn; rtx insn;
int benefit = 0; int benefit = 0;
for (insn = XEXP (find_reg_note (last, REG_RETVAL, 0), 0); for (insn = XEXP (find_reg_note (last, REG_RETVAL, NULL_RTX), 0);
insn != last; insn = NEXT_INSN (insn)) insn != last; insn = NEXT_INSN (insn))
{ {
if (GET_CODE (insn) == CALL_INSN) if (GET_CODE (insn) == CALL_INSN)
...@@ -1130,7 +1127,7 @@ skip_consec_insns (insn, count) ...@@ -1130,7 +1127,7 @@ skip_consec_insns (insn, count)
/* Do this at start of loop, since INSN is guaranteed to /* Do this at start of loop, since INSN is guaranteed to
be an insn here. */ be an insn here. */
if (GET_CODE (insn) != NOTE if (GET_CODE (insn) != NOTE
&& (temp = find_reg_note (insn, REG_LIBCALL, 0))) && (temp = find_reg_note (insn, REG_LIBCALL, NULL_RTX)))
insn = XEXP (temp, 0); insn = XEXP (temp, 0);
do insn = NEXT_INSN (insn); do insn = NEXT_INSN (insn);
...@@ -1154,7 +1151,7 @@ ignore_some_movables (movables) ...@@ -1154,7 +1151,7 @@ ignore_some_movables (movables)
for (m = movables; m; m = m->next) for (m = movables; m; m = m->next)
{ {
/* Is this a movable for the value of a libcall? */ /* Is this a movable for the value of a libcall? */
rtx note = find_reg_note (m->insn, REG_RETVAL, 0); rtx note = find_reg_note (m->insn, REG_RETVAL, NULL_RTX);
if (note) if (note)
{ {
rtx insn; rtx insn;
...@@ -1418,6 +1415,11 @@ rtx_equal_for_loop_p (x, y, movables) ...@@ -1418,6 +1415,11 @@ rtx_equal_for_loop_p (x, y, movables)
{ {
switch (fmt[i]) switch (fmt[i])
{ {
case 'w':
if (XWINT (x, i) != XWINT (y, i))
return 0;
break;
case 'i': case 'i':
if (XINT (x, i) != XINT (y, i)) if (XINT (x, i) != XINT (y, i))
return 0; return 0;
...@@ -1652,14 +1654,14 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) ...@@ -1652,14 +1654,14 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
/* If this is the first insn of a library call sequence, /* If this is the first insn of a library call sequence,
skip to the end. */ skip to the end. */
if (GET_CODE (p) != NOTE if (GET_CODE (p) != NOTE
&& (temp = find_reg_note (p, REG_LIBCALL, 0))) && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
p = XEXP (temp, 0); p = XEXP (temp, 0);
/* If this is the last insn of a libcall sequence, then /* If this is the last insn of a libcall sequence, then
delete every insn in the sequence except the last. delete every insn in the sequence except the last.
The last insn is handled in the normal manner. */ The last insn is handled in the normal manner. */
if (GET_CODE (p) != NOTE if (GET_CODE (p) != NOTE
&& (temp = find_reg_note (p, REG_RETVAL, 0))) && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
{ {
temp = XEXP (temp, 0); temp = XEXP (temp, 0);
while (temp != p) while (temp != p)
...@@ -1677,7 +1679,7 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) ...@@ -1677,7 +1679,7 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
add_label_notes (m->set_src, temp); add_label_notes (m->set_src, temp);
i1 = emit_insns_before (temp, loop_start); i1 = emit_insns_before (temp, loop_start);
if (! find_reg_note (i1, REG_EQUAL, 0)) if (! find_reg_note (i1, REG_EQUAL, NULL_RTX))
REG_NOTES (i1) REG_NOTES (i1)
= gen_rtx (EXPR_LIST, = gen_rtx (EXPR_LIST,
m->is_equiv ? REG_EQUIV : REG_EQUAL, m->is_equiv ? REG_EQUIV : REG_EQUAL,
...@@ -1699,14 +1701,14 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) ...@@ -1699,14 +1701,14 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
/* Do this at start of loop, since p is guaranteed to /* Do this at start of loop, since p is guaranteed to
be an insn here. */ be an insn here. */
if (GET_CODE (p) != NOTE if (GET_CODE (p) != NOTE
&& (temp = find_reg_note (p, REG_LIBCALL, 0))) && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
p = XEXP (temp, 0); p = XEXP (temp, 0);
/* If last insn of libcall sequence, move all /* If last insn of libcall sequence, move all
insns except the last before the loop. The last insns except the last before the loop. The last
insn is handled in the normal manner. */ insn is handled in the normal manner. */
if (GET_CODE (p) != NOTE if (GET_CODE (p) != NOTE
&& (temp = find_reg_note (p, REG_RETVAL, 0))) && (temp = find_reg_note (p, REG_RETVAL, NULL_RTX)))
{ {
rtx fn_address = 0; rtx fn_address = 0;
rtx fn_reg = 0; rtx fn_reg = 0;
...@@ -1748,7 +1750,8 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) ...@@ -1748,7 +1750,8 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
if (GET_CODE (next) == CALL_INSN if (GET_CODE (next) == CALL_INSN
&& GET_CODE (body) == SET && GET_CODE (body) == SET
&& GET_CODE (SET_DEST (body)) == REG && GET_CODE (SET_DEST (body)) == REG
&& (n = find_reg_note (temp, REG_EQUAL, 0))) && (n = find_reg_note (temp, REG_EQUAL,
NULL_RTX)))
{ {
fn_reg = SET_SRC (body); fn_reg = SET_SRC (body);
if (GET_CODE (fn_reg) != REG) if (GET_CODE (fn_reg) != REG)
...@@ -1790,8 +1793,8 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) ...@@ -1790,8 +1793,8 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
start_sequence (); start_sequence ();
tem = expand_binop tem = expand_binop
(GET_MODE (reg), and_optab, reg, (GET_MODE (reg), and_optab, reg,
gen_rtx (CONST_INT, VOIDmode, GEN_INT ((((HOST_WIDE_INT) 1
((1 << GET_MODE_BITSIZE (m->savemode))) << GET_MODE_BITSIZE (m->savemode)))
- 1), - 1),
reg, 1, OPTAB_LIB_WIDEN); reg, 1, OPTAB_LIB_WIDEN);
if (tem == 0) if (tem == 0)
...@@ -1832,10 +1835,10 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) ...@@ -1832,10 +1835,10 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
/* If library call, now fix the REG_NOTES that contain /* If library call, now fix the REG_NOTES that contain
insn pointers, namely REG_LIBCALL on FIRST insn pointers, namely REG_LIBCALL on FIRST
and REG_RETVAL on I1. */ and REG_RETVAL on I1. */
if (temp = find_reg_note (i1, REG_RETVAL, 0)) if (temp = find_reg_note (i1, REG_RETVAL, NULL_RTX))
{ {
XEXP (temp, 0) = first; XEXP (temp, 0) = first;
temp = find_reg_note (first, REG_LIBCALL, 0); temp = find_reg_note (first, REG_LIBCALL, NULL_RTX);
XEXP (temp, 0) = i1; XEXP (temp, 0) = i1;
} }
...@@ -1898,7 +1901,8 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs) ...@@ -1898,7 +1901,8 @@ move_movables (movables, threshold, insn_count, loop_start, end, nregs)
/* if library call, delete all insn except last, which /* if library call, delete all insn except last, which
is deleted below */ is deleted below */
if (temp = find_reg_note (m1->insn, REG_RETVAL, 0)) if (temp = find_reg_note (m1->insn, REG_RETVAL,
NULL_RTX))
{ {
for (temp = XEXP (temp, 0); temp != m1->insn; for (temp = XEXP (temp, 0); temp != m1->insn;
temp = NEXT_INSN (temp)) temp = NEXT_INSN (temp))
...@@ -2662,9 +2666,9 @@ int ...@@ -2662,9 +2666,9 @@ int
addr_overlap_p (other, base, size) addr_overlap_p (other, base, size)
rtx other; rtx other;
rtx base; rtx base;
int size; HOST_WIDE_INT size;
{ {
int start = 0, end; HOST_WIDE_INT start = 0, end;
if (GET_CODE (base) == CONST) if (GET_CODE (base) == CONST)
base = XEXP (base, 0); base = XEXP (base, 0);
...@@ -2718,7 +2722,7 @@ consec_sets_invariant_p (reg, n_sets, insn) ...@@ -2718,7 +2722,7 @@ consec_sets_invariant_p (reg, n_sets, insn)
code = GET_CODE (p); code = GET_CODE (p);
/* If library call, skip to end of of it. */ /* If library call, skip to end of of it. */
if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, 0))) if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
p = XEXP (temp, 0); p = XEXP (temp, 0);
this = 0; this = 0;
...@@ -2730,7 +2734,7 @@ consec_sets_invariant_p (reg, n_sets, insn) ...@@ -2730,7 +2734,7 @@ consec_sets_invariant_p (reg, n_sets, insn)
this = invariant_p (SET_SRC (set)); this = invariant_p (SET_SRC (set));
if (this != 0) if (this != 0)
value |= this; value |= this;
else if (temp = find_reg_note (p, REG_EQUAL, 0)) else if (temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
{ {
this = invariant_p (XEXP (temp, 0)); this = invariant_p (XEXP (temp, 0));
if (this != 0) if (this != 0)
...@@ -3416,7 +3420,7 @@ strength_reduce (scan_start, end, loop_top, insn_count, ...@@ -3416,7 +3420,7 @@ strength_reduce (scan_start, end, loop_top, insn_count,
&src_reg, &add_val, &src_reg, &add_val,
&mult_val)) &mult_val))
/* Equivalent expression is a giv. */ /* Equivalent expression is a giv. */
|| ((regnote = find_reg_note (p, REG_EQUAL, 0)) || ((regnote = find_reg_note (p, REG_EQUAL, NULL_RTX))
&& (benefit = general_induction_var (XEXP (regnote, 0), && (benefit = general_induction_var (XEXP (regnote, 0),
&src_reg, &src_reg,
&add_val, &mult_val)))) &add_val, &mult_val))))
...@@ -3438,7 +3442,7 @@ strength_reduce (scan_start, end, loop_top, insn_count, ...@@ -3438,7 +3442,7 @@ strength_reduce (scan_start, end, loop_top, insn_count,
rtx temp; rtx temp;
/* If this is a library call, increase benefit. */ /* If this is a library call, increase benefit. */
if (find_reg_note (p, REG_RETVAL, 0)) if (find_reg_note (p, REG_RETVAL, NULL_RTX))
benefit += libcall_benefit (p); benefit += libcall_benefit (p);
/* Skip the consecutive insns, if there are any. */ /* Skip the consecutive insns, if there are any. */
...@@ -3449,7 +3453,7 @@ strength_reduce (scan_start, end, loop_top, insn_count, ...@@ -3449,7 +3453,7 @@ strength_reduce (scan_start, end, loop_top, insn_count,
Do this at start of loop, since INSN is guaranteed to Do this at start of loop, since INSN is guaranteed to
be an insn here. */ be an insn here. */
if (GET_CODE (p) != NOTE if (GET_CODE (p) != NOTE
&& (temp = find_reg_note (p, REG_LIBCALL, 0))) && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
p = XEXP (temp, 0); p = XEXP (temp, 0);
do p = NEXT_INSN (p); do p = NEXT_INSN (p);
...@@ -3457,7 +3461,7 @@ strength_reduce (scan_start, end, loop_top, insn_count, ...@@ -3457,7 +3461,7 @@ strength_reduce (scan_start, end, loop_top, insn_count,
} }
record_giv (v, p, src_reg, dest_reg, mult_val, add_val, benefit, record_giv (v, p, src_reg, dest_reg, mult_val, add_val, benefit,
DEST_REG, not_every_iteration, 0, loop_start, DEST_REG, not_every_iteration, NULL_PTR, loop_start,
loop_end); loop_end);
} }
...@@ -4681,8 +4685,7 @@ basic_induction_var (x, dest_reg, inc_val, mult_val) ...@@ -4681,8 +4685,7 @@ basic_induction_var (x, dest_reg, inc_val, mult_val)
case MINUS: case MINUS:
if (XEXP (x, 0) == dest_reg if (XEXP (x, 0) == dest_reg
&& GET_CODE (XEXP (x, 1)) == CONST_INT) && GET_CODE (XEXP (x, 1)) == CONST_INT)
*inc_val = gen_rtx (CONST_INT, VOIDmode, *inc_val = GEN_INT (- INTVAL (XEXP (x, 1)));
- INTVAL (XEXP (x, 1)));
else else
return 0; return 0;
...@@ -4847,7 +4850,7 @@ simplify_giv_expr (x, benefit) ...@@ -4847,7 +4850,7 @@ simplify_giv_expr (x, benefit)
mode, this can't be a giv. */ mode, this can't be a giv. */
if (mode != VOIDmode if (mode != VOIDmode
&& (GET_MODE_CLASS (mode) != MODE_INT && (GET_MODE_CLASS (mode) != MODE_INT
|| GET_MODE_BITSIZE (mode) > HOST_BITS_PER_INT)) || GET_MODE_BITSIZE (mode) > HOST_BITS_PER_WIDE_INT))
return 0; return 0;
switch (GET_CODE (x)) switch (GET_CODE (x))
...@@ -4943,9 +4946,7 @@ simplify_giv_expr (x, benefit) ...@@ -4943,9 +4946,7 @@ simplify_giv_expr (x, benefit)
return simplify_giv_expr (gen_rtx (PLUS, mode, return simplify_giv_expr (gen_rtx (PLUS, mode,
XEXP (x, 0), XEXP (x, 0),
gen_rtx (MULT, mode, gen_rtx (MULT, mode,
XEXP (x, 1), XEXP (x, 1), constm1_rtx)),
gen_rtx (CONST_INT,
VOIDmode, -1))),
benefit); benefit);
case MULT: case MULT:
...@@ -4978,7 +4979,7 @@ simplify_giv_expr (x, benefit) ...@@ -4978,7 +4979,7 @@ simplify_giv_expr (x, benefit)
case CONST_INT: case CONST_INT:
/* Product of two constants. */ /* Product of two constants. */
return gen_rtx (CONST_INT, mode, INTVAL (arg0) * INTVAL (arg1)); return GEN_INT (INTVAL (arg0) * INTVAL (arg1));
case USE: case USE:
/* invar * invar. Not giv. */ /* invar * invar. Not giv. */
...@@ -5013,15 +5014,13 @@ simplify_giv_expr (x, benefit) ...@@ -5013,15 +5014,13 @@ simplify_giv_expr (x, benefit)
return simplify_giv_expr (gen_rtx (MULT, mode, return simplify_giv_expr (gen_rtx (MULT, mode,
XEXP (x, 0), XEXP (x, 0),
gen_rtx (CONST_INT, VOIDmode, GEN_INT ((HOST_WIDE_INT) 1
1 << INTVAL (XEXP (x, 1)))), << INTVAL (XEXP (x, 1)))),
benefit); benefit);
case NEG: case NEG:
/* "-a" is "a * (-1)" */ /* "-a" is "a * (-1)" */
return simplify_giv_expr (gen_rtx (MULT, mode, return simplify_giv_expr (gen_rtx (MULT, mode, XEXP (x, 0), constm1_rtx),
XEXP (x, 0),
gen_rtx (CONST_INT, VOIDmode, -1)),
benefit); benefit);
case NOT: case NOT:
...@@ -5145,7 +5144,7 @@ consec_sets_giv (first_benefit, p, src_reg, dest_reg, ...@@ -5145,7 +5144,7 @@ consec_sets_giv (first_benefit, p, src_reg, dest_reg,
code = GET_CODE (p); code = GET_CODE (p);
/* If libcall, skip to end of call sequence. */ /* If libcall, skip to end of call sequence. */
if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, 0))) if (code == INSN && (temp = find_reg_note (p, REG_LIBCALL, NULL_RTX)))
p = XEXP (temp, 0); p = XEXP (temp, 0);
if (code == INSN if (code == INSN
...@@ -5155,12 +5154,12 @@ consec_sets_giv (first_benefit, p, src_reg, dest_reg, ...@@ -5155,12 +5154,12 @@ consec_sets_giv (first_benefit, p, src_reg, dest_reg,
&& ((benefit = general_induction_var (SET_SRC (set), &src_reg, && ((benefit = general_induction_var (SET_SRC (set), &src_reg,
add_val, mult_val)) add_val, mult_val))
/* Giv created by equivalent expression. */ /* Giv created by equivalent expression. */
|| ((temp = find_reg_note (p, REG_EQUAL, 0)) || ((temp = find_reg_note (p, REG_EQUAL, NULL_RTX))
&& (benefit = general_induction_var (XEXP (temp, 0), &src_reg, && (benefit = general_induction_var (XEXP (temp, 0), &src_reg,
add_val, mult_val)))) add_val, mult_val))))
&& src_reg == v->src_reg) && src_reg == v->src_reg)
{ {
if (find_reg_note (p, REG_RETVAL, 0)) if (find_reg_note (p, REG_RETVAL, NULL_RTX))
benefit += libcall_benefit (p); benefit += libcall_benefit (p);
count--; count--;
...@@ -5215,8 +5214,7 @@ express_from (g1, g2) ...@@ -5215,8 +5214,7 @@ express_from (g1, g2)
|| INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0) || INTVAL (g2->mult_val) % INTVAL (g1->mult_val) != 0)
return 0; return 0;
mult = gen_rtx (CONST_INT, VOIDmode, mult = GEN_INT (INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
INTVAL (g2->mult_val) / INTVAL (g1->mult_val));
add = plus_constant (g2->add_val, - INTVAL (g1->add_val) * INTVAL (mult)); add = plus_constant (g2->add_val, - INTVAL (g1->add_val) * INTVAL (mult));
/* Form simplified final result. */ /* Form simplified final result. */
...@@ -5378,7 +5376,7 @@ product_cheap_p (a, b) ...@@ -5378,7 +5376,7 @@ product_cheap_p (a, b)
rtl_obstack = &temp_obstack; rtl_obstack = &temp_obstack;
start_sequence (); start_sequence ();
expand_mult (GET_MODE (a), a, b, 0, 0); expand_mult (GET_MODE (a), a, b, NULL_RTX, 0);
tmp = gen_sequence (); tmp = gen_sequence ();
end_sequence (); end_sequence ();
...@@ -5500,7 +5498,7 @@ check_dbra_loop (loop_end, insn_count, loop_start) ...@@ -5500,7 +5498,7 @@ check_dbra_loop (loop_end, insn_count, loop_start)
{ {
/* register always nonnegative, add REG_NOTE to branch */ /* register always nonnegative, add REG_NOTE to branch */
REG_NOTES (PREV_INSN (loop_end)) REG_NOTES (PREV_INSN (loop_end))
= gen_rtx (EXPR_LIST, REG_NONNEG, 0, = gen_rtx (EXPR_LIST, REG_NONNEG, NULL_RTX,
REG_NOTES (PREV_INSN (loop_end))); REG_NOTES (PREV_INSN (loop_end)));
bl->nonneg = 1; bl->nonneg = 1;
...@@ -5525,7 +5523,7 @@ check_dbra_loop (loop_end, insn_count, loop_start) ...@@ -5525,7 +5523,7 @@ check_dbra_loop (loop_end, insn_count, loop_start)
&& INTVAL (bl->biv->add_val) == -1) && INTVAL (bl->biv->add_val) == -1)
{ {
REG_NOTES (PREV_INSN (loop_end)) REG_NOTES (PREV_INSN (loop_end))
= gen_rtx (EXPR_LIST, REG_NONNEG, 0, = gen_rtx (EXPR_LIST, REG_NONNEG, NULL_RTX,
REG_NOTES (PREV_INSN (loop_end))); REG_NOTES (PREV_INSN (loop_end)));
bl->nonneg = 1; bl->nonneg = 1;
...@@ -5623,13 +5621,11 @@ check_dbra_loop (loop_end, insn_count, loop_start) ...@@ -5623,13 +5621,11 @@ check_dbra_loop (loop_end, insn_count, loop_start)
/* Save some info needed to produce the new insns. */ /* Save some info needed to produce the new insns. */
reg = bl->biv->dest_reg; reg = bl->biv->dest_reg;
jump_label = XEXP (SET_SRC (PATTERN (PREV_INSN (loop_end))), 1); jump_label = XEXP (SET_SRC (PATTERN (PREV_INSN (loop_end))), 1);
new_add_val = gen_rtx (CONST_INT, VOIDmode, new_add_val = GEN_INT (- INTVAL (bl->biv->add_val));
- INTVAL (bl->biv->add_val));
final_value = XEXP (comparison, 1); final_value = XEXP (comparison, 1);
start_value = gen_rtx (CONST_INT, VOIDmode, start_value = GEN_INT (INTVAL (XEXP (comparison, 1))
(INTVAL (XEXP (comparison, 1)) - INTVAL (bl->biv->add_val));
- INTVAL (bl->biv->add_val)));
/* Initialize biv to start_value before loop start. /* Initialize biv to start_value before loop start.
The old initializing insn will be deleted as a The old initializing insn will be deleted as a
...@@ -5666,7 +5662,8 @@ check_dbra_loop (loop_end, insn_count, loop_start) ...@@ -5666,7 +5662,8 @@ check_dbra_loop (loop_end, insn_count, loop_start)
/* Add new compare/branch insn at end of loop. */ /* Add new compare/branch insn at end of loop. */
start_sequence (); start_sequence ();
emit_cmp_insn (reg, const0_rtx, GE, 0, GET_MODE (reg), 0, 0); emit_cmp_insn (reg, const0_rtx, GE, NULL_RTX,
GET_MODE (reg), 0, 0);
emit_jump_insn (gen_bge (XEXP (jump_label, 0))); emit_jump_insn (gen_bge (XEXP (jump_label, 0)));
tem = gen_sequence (); tem = gen_sequence ();
end_sequence (); end_sequence ();
...@@ -5682,7 +5679,7 @@ check_dbra_loop (loop_end, insn_count, loop_start) ...@@ -5682,7 +5679,7 @@ check_dbra_loop (loop_end, insn_count, loop_start)
/* Increment of LABEL_NUSES done above. */ /* Increment of LABEL_NUSES done above. */
/* Register is now always nonnegative, /* Register is now always nonnegative,
so add REG_NONNEG note to the branch. */ so add REG_NONNEG note to the branch. */
REG_NOTES (tem) = gen_rtx (EXPR_LIST, REG_NONNEG, 0, REG_NOTES (tem) = gen_rtx (EXPR_LIST, REG_NONNEG, NULL_RTX,
REG_NOTES (tem)); REG_NOTES (tem));
} }
...@@ -5913,10 +5910,9 @@ maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where) ...@@ -5913,10 +5910,9 @@ maybe_eliminate_biv_1 (x, insn, bl, eliminate_p, where)
&& GET_CODE (v->mult_val) == CONST_INT && GET_CODE (v->mult_val) == CONST_INT
&& GET_CODE (v->add_val) == CONST_INT && GET_CODE (v->add_val) == CONST_INT
&& validate_change (insn, &XEXP (x, arg_operand), && validate_change (insn, &XEXP (x, arg_operand),
gen_rtx (CONST_INT, VOIDmode, GEN_INT (INTVAL (arg)
(INTVAL (arg) * INTVAL (v->mult_val)
* INTVAL (v->mult_val) + INTVAL (v->add_val)), 0))
+ INTVAL (v->add_val))), 0))
return 1; return 1;
/* Otherwise, load it into a register. */ /* Otherwise, load it into a register. */
...@@ -6255,9 +6251,11 @@ get_condition (jump, earliest) ...@@ -6255,9 +6251,11 @@ get_condition (jump, earliest)
|| (((code == NE || (((code == NE
|| (code == LT || (code == LT
&& GET_MODE_CLASS (inner_mode) == MODE_INT && GET_MODE_CLASS (inner_mode) == MODE_INT
&& GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT && (GET_MODE_BITSIZE (inner_mode)
<= HOST_BITS_PER_WIDE_INT)
&& (STORE_FLAG_VALUE && (STORE_FLAG_VALUE
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1)))) & ((HOST_WIDE_INT) 1
<< (GET_MODE_BITSIZE (inner_mode) - 1))))
#ifdef FLOAT_STORE_FLAG_VALUE #ifdef FLOAT_STORE_FLAG_VALUE
|| (code == LT || (code == LT
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
...@@ -6268,10 +6266,12 @@ get_condition (jump, earliest) ...@@ -6268,10 +6266,12 @@ get_condition (jump, earliest)
x = SET_SRC (set); x = SET_SRC (set);
else if (((code == EQ else if (((code == EQ
|| (code == GE || (code == GE
&& GET_MODE_BITSIZE (inner_mode) <= HOST_BITS_PER_INT && (GET_MODE_BITSIZE (inner_mode)
<= HOST_BITS_PER_WIDE_INT)
&& GET_MODE_CLASS (inner_mode) == MODE_INT && GET_MODE_CLASS (inner_mode) == MODE_INT
&& (STORE_FLAG_VALUE && (STORE_FLAG_VALUE
& (1 << (GET_MODE_BITSIZE (inner_mode) - 1)))) & ((HOST_WIDE_INT) 1
<< (GET_MODE_BITSIZE (inner_mode) - 1))))
#ifdef FLOAT_STORE_FLAG_VALUE #ifdef FLOAT_STORE_FLAG_VALUE
|| (code == GE || (code == GE
&& GET_MODE_CLASS (inner_mode) == MODE_FLOAT && GET_MODE_CLASS (inner_mode) == MODE_FLOAT
...@@ -6322,29 +6322,29 @@ get_condition (jump, earliest) ...@@ -6322,29 +6322,29 @@ get_condition (jump, earliest)
/* Canonicalize any ordered comparison with integers involving equality. */ /* Canonicalize any ordered comparison with integers involving equality. */
if (GET_CODE (op1) == CONST_INT) if (GET_CODE (op1) == CONST_INT)
{ {
int const_val = INTVAL (op1); HOST_WIDE_INT const_val = INTVAL (op1);
unsigned uconst_val = (unsigned) const_val; unsigned HOST_WIDE_INT uconst_val = const_val;
switch (code) switch (code)
{ {
case LE: case LE:
code = LT; code = LT;
op1 = gen_rtx (CONST_INT, VOIDmode, const_val + 1); op1 = GEN_INT (const_val + 1);
break; break;
case GE: case GE:
code = GT; code = GT;
op1 = gen_rtx (CONST_INT, VOIDmode, const_val - 1); op1 = GEN_INT (const_val - 1);
break; break;
case LEU: case LEU:
code = LTU; code = LTU;
op1 = gen_rtx (CONST_INT, VOIDmode, uconst_val + 1); op1 = GEN_INT (uconst_val + 1);
break; break;
case GEU: case GEU:
code = GTU; code = GTU;
op1 = gen_rtx (CONST_INT, VOIDmode, uconst_val - 1); op1 = GEN_INT (uconst_val - 1);
break; break;
} }
} }
...@@ -6372,7 +6372,7 @@ rtx ...@@ -6372,7 +6372,7 @@ rtx
get_condition_for_loop (x) get_condition_for_loop (x)
rtx x; rtx x;
{ {
rtx comparison = get_condition (x, 0); rtx comparison = get_condition (x, NULL_PTR);
if (comparison == 0 if (comparison == 0
|| ! invariant_p (XEXP (comparison, 0)) || ! invariant_p (XEXP (comparison, 0))
......
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