config/i386/i386: Use rtx_insn

gcc/
	* config/i386/i386-protos.h (ix86_avoid_lea_for_add): Strengthen
	param 1 "insn" from rtx to rtx_insn *.
	(ix86_use_lea_for_mov): Likewise.
	(ix86_avoid_lea_for_addr): Likewise.
	(ix86_split_lea_for_addr): Likewise.
	(ix86_lea_for_add_ok): Likewise.
	(ix86_output_call_insn): Likewise.

	* config/i386/i386.c (ix86_va_start): Likewise for local "seq".
	(ix86_get_drap_rtx): Likewise for locals "seq", "insn".
	(ix86_output_function_epilogue): Likewise for locals "insn",
	"deleted_debug_label".
	(legitimize_tls_address): Likewise for local "insn".
	(get_some_local_dynamic_name): Likewise.
	(increase_distance): Likewise for params "prev", "next".
	(distance_non_agu_define_in_bb): Likewise for params "insn",
	"start" and locals "prev", "next".
	(distance_non_agu_define): Likewise for param "insn".
	(distance_agu_use_in_bb): Likewise for params "insn", "start" and
	locals "next", "prev".
	(distance_agu_use): Likewise for param "insn".
	(ix86_lea_outperforms): Likewise.
	(ix86_ok_to_clobber_flags): Likewise.
	(ix86_avoid_lea_for_add): Likewise.
	(ix86_use_lea_for_mov): Likewise.
	(ix86_avoid_lea_for_addr): Likewise.
	(find_nearest_reg_def): Likewise, also for locals "prev", "start".
	(ix86_split_lea_for_addr): Likewise for param "insn".
	(ix86_lea_for_add_ok): Likewise for param "insn".
	(ix86_expand_carry_flag_compare): Likewise for local
	"compare_seq".
	(ix86_expand_int_movcc): Likewise.
	(ix86_output_call_insn): Likewise for param "insn".
	(ix86_output_call_insn): Likewise for local "i".
	(x86_output_mi_thunk): Introduce local "insn", using it in place
	of "tmp" when dealing with insns.
	(ix86_avoid_jump_mispredicts): Likewise for locals "insn",
	"start".
	(ix86_pad_returns): Likewise for locals "ret", "prev".
	(ix86_count_insn_bb): Likewise for local "insn".
	(ix86_pad_short_function): Likewise for locals "ret", "insn".
	(ix86_seh_fixup_eh_fallthru): Likewise for locals "insn", "next".
	(ix86_vector_duplicate_value): Likewise for local "insn", "seq".
	(expand_vec_perm_interleave2): Likewise for local "seq".
	(expand_vec_perm_vperm2f128_vblend): Likewise.
	(ix86_loop_unroll_adjust): Likewise for local "insn".  Convert
	call to for_each_rtx with for_each_rtx_in_insn.

From-SVN: r214444
This commit is contained in:
David Malcolm 2014-08-25 17:34:45 +00:00 committed by David Malcolm
parent aefef06abc
commit 612b40cfab
3 changed files with 111 additions and 54 deletions

View File

@ -1,3 +1,53 @@
2014-08-25 David Malcolm <dmalcolm@redhat.com>
* config/i386/i386-protos.h (ix86_avoid_lea_for_add): Strengthen
param 1 "insn" from rtx to rtx_insn *.
(ix86_use_lea_for_mov): Likewise.
(ix86_avoid_lea_for_addr): Likewise.
(ix86_split_lea_for_addr): Likewise.
(ix86_lea_for_add_ok): Likewise.
(ix86_output_call_insn): Likewise.
* config/i386/i386.c (ix86_va_start): Likewise for local "seq".
(ix86_get_drap_rtx): Likewise for locals "seq", "insn".
(ix86_output_function_epilogue): Likewise for locals "insn",
"deleted_debug_label".
(legitimize_tls_address): Likewise for local "insn".
(get_some_local_dynamic_name): Likewise.
(increase_distance): Likewise for params "prev", "next".
(distance_non_agu_define_in_bb): Likewise for params "insn",
"start" and locals "prev", "next".
(distance_non_agu_define): Likewise for param "insn".
(distance_agu_use_in_bb): Likewise for params "insn", "start" and
locals "next", "prev".
(distance_agu_use): Likewise for param "insn".
(ix86_lea_outperforms): Likewise.
(ix86_ok_to_clobber_flags): Likewise.
(ix86_avoid_lea_for_add): Likewise.
(ix86_use_lea_for_mov): Likewise.
(ix86_avoid_lea_for_addr): Likewise.
(find_nearest_reg_def): Likewise, also for locals "prev", "start".
(ix86_split_lea_for_addr): Likewise for param "insn".
(ix86_lea_for_add_ok): Likewise for param "insn".
(ix86_expand_carry_flag_compare): Likewise for local
"compare_seq".
(ix86_expand_int_movcc): Likewise.
(ix86_output_call_insn): Likewise for param "insn".
(ix86_output_call_insn): Likewise for local "i".
(x86_output_mi_thunk): Introduce local "insn", using it in place
of "tmp" when dealing with insns.
(ix86_avoid_jump_mispredicts): Likewise for locals "insn",
"start".
(ix86_pad_returns): Likewise for locals "ret", "prev".
(ix86_count_insn_bb): Likewise for local "insn".
(ix86_pad_short_function): Likewise for locals "ret", "insn".
(ix86_seh_fixup_eh_fallthru): Likewise for locals "insn", "next".
(ix86_vector_duplicate_value): Likewise for local "insn", "seq".
(expand_vec_perm_interleave2): Likewise for local "seq".
(expand_vec_perm_vperm2f128_vblend): Likewise.
(ix86_loop_unroll_adjust): Likewise for local "insn". Convert
call to for_each_rtx with for_each_rtx_in_insn.
2014-08-25 David Malcolm <dmalcolm@redhat.com>
* config/i386/i386.c (setup_incoming_varargs_64): Strengthen local

View File

@ -93,11 +93,11 @@ extern void ix86_expand_binary_operator (enum rtx_code,
extern void ix86_expand_vector_logical_operator (enum rtx_code,
enum machine_mode, rtx[]);
extern bool ix86_binary_operator_ok (enum rtx_code, enum machine_mode, rtx[]);
extern bool ix86_avoid_lea_for_add (rtx, rtx[]);
extern bool ix86_use_lea_for_mov (rtx, rtx[]);
extern bool ix86_avoid_lea_for_addr (rtx, rtx[]);
extern void ix86_split_lea_for_addr (rtx, rtx[], enum machine_mode);
extern bool ix86_lea_for_add_ok (rtx, rtx[]);
extern bool ix86_avoid_lea_for_add (rtx_insn *, rtx[]);
extern bool ix86_use_lea_for_mov (rtx_insn *, rtx[]);
extern bool ix86_avoid_lea_for_addr (rtx_insn *, rtx[]);
extern void ix86_split_lea_for_addr (rtx_insn *, rtx[], enum machine_mode);
extern bool ix86_lea_for_add_ok (rtx_insn *, rtx[]);
extern bool ix86_vec_interleave_v2df_operator_ok (rtx operands[3], bool high);
extern bool ix86_dep_by_shift_count (const_rtx set_insn, const_rtx use_insn);
extern bool ix86_agi_dependent (rtx set_insn, rtx use_insn);
@ -302,7 +302,7 @@ extern int asm_preferred_eh_data_format (int, int);
extern enum attr_cpu ix86_schedule;
#endif
extern const char * ix86_output_call_insn (rtx insn, rtx call_op);
extern const char * ix86_output_call_insn (rtx_insn *insn, rtx call_op);
#ifdef RTX_CODE
/* Target data for multipass lookahead scheduling.

View File

@ -8401,7 +8401,8 @@ ix86_va_start (tree valist, rtx nextarg)
scratch_regno = split_stack_prologue_scratch_regno ();
if (scratch_regno != INVALID_REGNUM)
{
rtx reg, seq;
rtx reg;
rtx_insn *seq;
reg = gen_reg_rtx (Pmode);
cfun->machine->split_stack_varargs_pointer = reg;
@ -10212,7 +10213,7 @@ ix86_get_drap_rtx (void)
unsigned int regno = find_drap_reg ();
rtx drap_vreg;
rtx arg_ptr;
rtx seq, insn;
rtx_insn *seq, *insn;
arg_ptr = gen_rtx_REG (Pmode, regno);
crtl->drap_reg = arg_ptr;
@ -11797,8 +11798,8 @@ ix86_output_function_epilogue (FILE *file ATTRIBUTE_UNUSED, HOST_WIDE_INT)
/* Mach-O doesn't support labels at the end of objects, so if
it looks like we might want one, insert a NOP. */
{
rtx insn = get_last_insn ();
rtx deleted_debug_label = NULL_RTX;
rtx_insn *insn = get_last_insn ();
rtx_insn *deleted_debug_label = NULL;
while (insn
&& NOTE_P (insn)
&& NOTE_KIND (insn) != NOTE_INSN_DELETED_LABEL)
@ -13494,7 +13495,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
if (TARGET_64BIT)
{
rtx rax = gen_rtx_REG (Pmode, AX_REG);
rtx insns;
rtx_insn *insns;
start_sequence ();
emit_call_insn
@ -13547,7 +13548,8 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
if (TARGET_64BIT)
{
rtx rax = gen_rtx_REG (Pmode, AX_REG);
rtx insns, eqv;
rtx_insn *insns;
rtx eqv;
start_sequence ();
emit_call_insn
@ -14776,7 +14778,7 @@ get_some_local_dynamic_name_1 (rtx *px, void *)
static const char *
get_some_local_dynamic_name (void)
{
rtx insn;
rtx_insn *insn;
if (cfun->machine->some_ld_name)
return cfun->machine->some_ld_name;
@ -17782,7 +17784,7 @@ ix86_emit_cfi ()
go to next cycle if there is some dependecy. */
static unsigned int
increase_distance (rtx prev, rtx next, unsigned int distance)
increase_distance (rtx_insn *prev, rtx_insn *next, unsigned int distance)
{
df_ref def, use;
@ -17847,12 +17849,12 @@ insn_uses_reg_mem (unsigned int regno, rtx insn)
static int
distance_non_agu_define_in_bb (unsigned int regno1, unsigned int regno2,
rtx insn, int distance,
rtx start, bool *found)
rtx_insn *insn, int distance,
rtx_insn *start, bool *found)
{
basic_block bb = start ? BLOCK_FOR_INSN (start) : NULL;
rtx prev = start;
rtx next = NULL;
rtx_insn *prev = start;
rtx_insn *next = NULL;
*found = false;
@ -17894,7 +17896,7 @@ distance_non_agu_define_in_bb (unsigned int regno1, unsigned int regno2,
static int
distance_non_agu_define (unsigned int regno1, unsigned int regno2,
rtx insn)
rtx_insn *insn)
{
basic_block bb = BLOCK_FOR_INSN (insn);
int distance = 0;
@ -17971,12 +17973,12 @@ distance_non_agu_define (unsigned int regno1, unsigned int regno2,
static int
distance_agu_use_in_bb (unsigned int regno,
rtx insn, int distance, rtx start,
rtx_insn *insn, int distance, rtx_insn *start,
bool *found, bool *redefined)
{
basic_block bb = NULL;
rtx next = start;
rtx prev = NULL;
rtx_insn *next = start;
rtx_insn *prev = NULL;
*found = false;
*redefined = false;
@ -18030,7 +18032,7 @@ distance_agu_use_in_bb (unsigned int regno,
a use is found within LEA_SEARCH_THRESHOLD or REGNO0 is set. */
static int
distance_agu_use (unsigned int regno0, rtx insn)
distance_agu_use (unsigned int regno0, rtx_insn *insn)
{
basic_block bb = BLOCK_FOR_INSN (insn);
int distance = 0;
@ -18104,7 +18106,7 @@ distance_agu_use (unsigned int regno0, rtx insn)
SPLIT_COST cycles higher latency than lea latency. */
static bool
ix86_lea_outperforms (rtx insn, unsigned int regno0, unsigned int regno1,
ix86_lea_outperforms (rtx_insn *insn, unsigned int regno0, unsigned int regno1,
unsigned int regno2, int split_cost, bool has_scale)
{
int dist_define, dist_use;
@ -18158,7 +18160,7 @@ ix86_lea_outperforms (rtx insn, unsigned int regno0, unsigned int regno1,
false otherwise. */
static bool
ix86_ok_to_clobber_flags (rtx insn)
ix86_ok_to_clobber_flags (rtx_insn *insn)
{
basic_block bb = BLOCK_FOR_INSN (insn);
df_ref use;
@ -18190,7 +18192,7 @@ ix86_ok_to_clobber_flags (rtx insn)
move and add to avoid AGU stalls. */
bool
ix86_avoid_lea_for_add (rtx insn, rtx operands[])
ix86_avoid_lea_for_add (rtx_insn *insn, rtx operands[])
{
unsigned int regno0, regno1, regno2;
@ -18218,7 +18220,7 @@ ix86_avoid_lea_for_add (rtx insn, rtx operands[])
instruction. */
bool
ix86_use_lea_for_mov (rtx insn, rtx operands[])
ix86_use_lea_for_mov (rtx_insn *insn, rtx operands[])
{
unsigned int regno0, regno1;
@ -18240,7 +18242,7 @@ ix86_use_lea_for_mov (rtx insn, rtx operands[])
instructions to avoid AGU stalls. */
bool
ix86_avoid_lea_for_addr (rtx insn, rtx operands[])
ix86_avoid_lea_for_addr (rtx_insn *insn, rtx operands[])
{
unsigned int regno0, regno1, regno2;
int split_cost;
@ -18344,10 +18346,10 @@ ix86_emit_binop (enum rtx_code code, enum machine_mode mode,
/* Return true if regno1 def is nearest to the insn. */
static bool
find_nearest_reg_def (rtx insn, int regno1, int regno2)
find_nearest_reg_def (rtx_insn *insn, int regno1, int regno2)
{
rtx prev = insn;
rtx start = BB_HEAD (BLOCK_FOR_INSN (insn));
rtx_insn *prev = insn;
rtx_insn *start = BB_HEAD (BLOCK_FOR_INSN (insn));
if (insn == start)
return false;
@ -18375,7 +18377,7 @@ find_nearest_reg_def (rtx insn, int regno1, int regno2)
at lea position. */
void
ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode)
ix86_split_lea_for_addr (rtx_insn *insn, rtx operands[], enum machine_mode mode)
{
unsigned int regno0, regno1, regno2;
struct ix86_address parts;
@ -18495,7 +18497,7 @@ ix86_split_lea_for_addr (rtx insn, rtx operands[], enum machine_mode mode)
used soon, LEA is better and otherwise ADD is better. */
bool
ix86_lea_for_add_ok (rtx insn, rtx operands[])
ix86_lea_for_add_ok (rtx_insn *insn, rtx operands[])
{
unsigned int regno0 = true_regnum (operands[0]);
unsigned int regno1 = true_regnum (operands[1]);
@ -20102,7 +20104,8 @@ ix86_expand_carry_flag_compare (enum rtx_code code, rtx op0, rtx op1, rtx *pop)
if (SCALAR_FLOAT_MODE_P (mode))
{
rtx compare_op, compare_seq;
rtx compare_op;
rtx_insn *compare_seq;
gcc_assert (!DECIMAL_FLOAT_MODE_P (mode));
@ -20220,7 +20223,8 @@ bool
ix86_expand_int_movcc (rtx operands[])
{
enum rtx_code code = GET_CODE (operands[1]), compare_code;
rtx compare_seq, compare_op;
rtx_insn *compare_seq;
rtx compare_op;
enum machine_mode mode = GET_MODE (operands[0]);
bool sign_bit_compare_p = false;
rtx op0 = XEXP (operands[1], 0);
@ -24987,7 +24991,7 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx callarg1,
/* Output the assembly for a call instruction. */
const char *
ix86_output_call_insn (rtx insn, rtx call_op)
ix86_output_call_insn (rtx_insn *insn, rtx call_op)
{
bool direct_p = constant_call_address_operand (call_op, VOIDmode);
bool seh_nop_p = false;
@ -25012,7 +25016,7 @@ ix86_output_call_insn (rtx insn, rtx call_op)
circumstances. Determine if we have one of those. */
if (TARGET_SEH)
{
rtx i;
rtx_insn *i;
for (i = NEXT_INSN (insn); i ; i = NEXT_INSN (i))
{
@ -38837,6 +38841,7 @@ x86_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta,
rtx this_param = x86_this_parameter (function);
rtx this_reg, tmp, fnaddr;
unsigned int tmp_regno;
rtx_insn *insn;
if (TARGET_64BIT)
tmp_regno = R10_REG;
@ -38996,10 +39001,10 @@ x86_output_mi_thunk (FILE *file, tree, HOST_WIDE_INT delta,
/* Emit just enough of rest_of_compilation to get the insns emitted.
Note that use_thunk calls assemble_start_function et al. */
tmp = get_insns ();
shorten_branches (tmp);
final_start_function (tmp, file, 1);
final (tmp, file, 1);
insn = get_insns ();
shorten_branches (insn);
final_start_function (insn, file, 1);
final (insn, file, 1);
final_end_function ();
}
@ -39140,7 +39145,7 @@ min_insn_size (rtx insn)
static void
ix86_avoid_jump_mispredicts (void)
{
rtx insn, start = get_insns ();
rtx_insn *insn, *start = get_insns ();
int nbytes = 0, njumps = 0;
int isjump = 0;
@ -39246,8 +39251,8 @@ ix86_pad_returns (void)
FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
{
basic_block bb = e->src;
rtx ret = BB_END (bb);
rtx prev;
rtx_insn *ret = BB_END (bb);
rtx_insn *prev;
bool replace = false;
if (!JUMP_P (ret) || !ANY_RETURN_P (PATTERN (ret))
@ -39295,7 +39300,7 @@ ix86_pad_returns (void)
static int
ix86_count_insn_bb (basic_block bb)
{
rtx insn;
rtx_insn *insn;
int insn_count = 0;
/* Count number of instructions in this block. Return 4 if the number
@ -39376,7 +39381,7 @@ ix86_pad_short_function (void)
FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
{
rtx ret = BB_END (e->src);
rtx_insn *ret = BB_END (e->src);
if (JUMP_P (ret) && ANY_RETURN_P (PATTERN (ret)))
{
int insn_count = ix86_count_insn (e->src);
@ -39384,7 +39389,7 @@ ix86_pad_short_function (void)
/* Pad short function. */
if (insn_count < 4)
{
rtx insn = ret;
rtx_insn *insn = ret;
/* Find epilogue. */
while (insn
@ -39416,7 +39421,7 @@ ix86_seh_fixup_eh_fallthru (void)
FOR_EACH_EDGE (e, ei, EXIT_BLOCK_PTR_FOR_FN (cfun)->preds)
{
rtx insn, next;
rtx_insn *insn, *next;
/* Find the beginning of the epilogue. */
for (insn = BB_END (e->src); insn != NULL; insn = PREV_INSN (insn))
@ -39629,14 +39634,15 @@ static bool
ix86_vector_duplicate_value (enum machine_mode mode, rtx target, rtx val)
{
bool ok;
rtx insn, dup;
rtx_insn *insn;
rtx dup;
/* First attempt to recognize VAL as-is. */
dup = gen_rtx_VEC_DUPLICATE (mode, val);
insn = emit_insn (gen_rtx_SET (VOIDmode, target, dup));
if (recog_memoized (insn) < 0)
{
rtx seq;
rtx_insn *seq;
/* If that fails, force VAL into a register. */
start_sequence ();
@ -43355,7 +43361,7 @@ expand_vec_perm_interleave2 (struct expand_vec_perm_d *d)
unsigned i, nelt = d->nelt, nelt2 = nelt / 2;
unsigned HOST_WIDE_INT contents;
unsigned char remap[2 * MAX_VECT_LEN];
rtx seq;
rtx_insn *seq;
bool ok, same_halves = false;
if (GET_MODE_SIZE (d->vmode) == 16)
@ -43904,7 +43910,7 @@ expand_vec_perm_vperm2f128_vblend (struct expand_vec_perm_d *d)
{
struct expand_vec_perm_d dfirst, dsecond;
unsigned i, j, msk, nelt = d->nelt, nelt2 = nelt / 2;
rtx seq;
rtx_insn *seq;
bool ok;
rtx (*blend) (rtx, rtx, rtx, rtx) = NULL;
@ -46901,7 +46907,7 @@ static unsigned
ix86_loop_unroll_adjust (unsigned nunroll, struct loop *loop)
{
basic_block *bbs;
rtx insn;
rtx_insn *insn;
unsigned i;
unsigned mem_count = 0;
@ -46914,7 +46920,8 @@ ix86_loop_unroll_adjust (unsigned nunroll, struct loop *loop)
{
for (insn = BB_HEAD (bbs[i]); insn != BB_END (bbs[i]); insn = NEXT_INSN (insn))
if (NONDEBUG_INSN_P (insn))
for_each_rtx (&insn, (rtx_function) ix86_loop_memcount, &mem_count);
for_each_rtx_in_insn (&insn, (rtx_function) ix86_loop_memcount,
&mem_count);
}
free (bbs);