From b29387eec60251cbfed25475892d5645c9c59caf Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Fri, 1 Apr 2011 08:16:47 +0000 Subject: [PATCH] recog.h (insn_data_d): Add n_generator_args. gcc/ * recog.h (insn_data_d): Add n_generator_args. * genoutput.c (data): Likewise. (output_insn_data): Print it. (max_opno, num_dups): Delete. (scan_operands): Just fill in "d->operand[...]". (gen_insn, gen_peephole, gen_expand, gen_split): Use get_pattern_stats. From-SVN: r171822 --- gcc/ChangeLog | 9 ++++++++ gcc/genoutput.c | 59 ++++++++++++++++++++----------------------------- gcc/recog.h | 1 + 3 files changed, 34 insertions(+), 35 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index d048013b658..32ad1daad55 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2011-04-01 Richard Sandiford + + * recog.h (insn_data_d): Add n_generator_args. + * genoutput.c (data): Likewise. + (output_insn_data): Print it. + (max_opno, num_dups): Delete. + (scan_operands): Just fill in "d->operand[...]". + (gen_insn, gen_peephole, gen_expand, gen_split): Use get_pattern_stats. + 2011-04-01 Richard Sandiford * gensupport.h (pattern_stats): New structure. diff --git a/gcc/genoutput.c b/gcc/genoutput.c index d03222f4b21..3e89cfd6df1 100644 --- a/gcc/genoutput.c +++ b/gcc/genoutput.c @@ -160,6 +160,7 @@ struct data int index_number; const char *filename; int lineno; + int n_generator_args; /* Number of arguments passed to generator */ int n_operands; /* Number of operands this insn recognizes */ int n_dups; /* Number times match_dup appears in pattern */ int n_alternatives; /* Number of alternatives in each constraint */ @@ -393,6 +394,7 @@ output_insn_data (void) printf (" 0,\n"); printf (" &operand_data[%d],\n", d->operand_number); + printf (" %d,\n", d->n_generator_args); printf (" %d,\n", d->n_operands); printf (" %d,\n", d->n_dups); printf (" %d,\n", d->n_alternatives); @@ -417,16 +419,11 @@ output_get_insn_name (void) } -/* Stores in max_opno the largest operand number present in `part', if - that is larger than the previous value of max_opno, and the rest of - the operand data into `d->operand[i]'. +/* Stores the operand data into `d->operand[i]'. THIS_ADDRESS_P is nonzero if the containing rtx was an ADDRESS. THIS_STRICT_LOW is nonzero if the containing rtx was a STRICT_LOW_PART. */ -static int max_opno; -static int num_dups; - static void scan_operands (struct data *d, rtx part, int this_address_p, int this_strict_low) @@ -442,9 +439,7 @@ scan_operands (struct data *d, rtx part, int this_address_p, { case MATCH_OPERAND: opno = XINT (part, 0); - if (opno > max_opno) - max_opno = opno; - if (max_opno >= MAX_MAX_OPERANDS) + if (opno >= MAX_MAX_OPERANDS) { error_with_line (d->lineno, "maximum number of operands exceeded"); return; @@ -465,9 +460,7 @@ scan_operands (struct data *d, rtx part, int this_address_p, case MATCH_SCRATCH: opno = XINT (part, 0); - if (opno > max_opno) - max_opno = opno; - if (max_opno >= MAX_MAX_OPERANDS) + if (opno >= MAX_MAX_OPERANDS) { error_with_line (d->lineno, "maximum number of operands exceeded"); return; @@ -489,9 +482,7 @@ scan_operands (struct data *d, rtx part, int this_address_p, case MATCH_OPERATOR: case MATCH_PARALLEL: opno = XINT (part, 0); - if (opno > max_opno) - max_opno = opno; - if (max_opno >= MAX_MAX_OPERANDS) + if (opno >= MAX_MAX_OPERANDS) { error_with_line (d->lineno, "maximum number of operands exceeded"); return; @@ -510,12 +501,6 @@ scan_operands (struct data *d, rtx part, int this_address_p, scan_operands (d, XVECEXP (part, 2, i), 0, 0); return; - case MATCH_DUP: - case MATCH_OP_DUP: - case MATCH_PAR_DUP: - ++num_dups; - break; - case ADDRESS: scan_operands (d, XEXP (part, 0), 1, 0); return; @@ -830,6 +815,7 @@ validate_optab_operands (struct data *d) static void gen_insn (rtx insn, int lineno) { + struct pattern_stats stats; struct data *d = XNEW (struct data); int i; @@ -848,15 +834,15 @@ gen_insn (rtx insn, int lineno) *idata_end = d; idata_end = &d->next; - max_opno = -1; - num_dups = 0; memset (d->operand, 0, sizeof (d->operand)); for (i = 0; i < XVECLEN (insn, 1); i++) scan_operands (d, XVECEXP (insn, 1, i), 0, 0); - d->n_operands = max_opno + 1; - d->n_dups = num_dups; + get_pattern_stats (&stats, XVEC (insn, 1)); + d->n_generator_args = stats.num_generator_args; + d->n_operands = stats.num_insn_operands; + d->n_dups = stats.num_dups; #ifndef USE_MD_CONSTRAINTS check_constraint_len (); @@ -875,6 +861,7 @@ gen_insn (rtx insn, int lineno) static void gen_peephole (rtx peep, int lineno) { + struct pattern_stats stats; struct data *d = XNEW (struct data); int i; @@ -890,8 +877,6 @@ gen_peephole (rtx peep, int lineno) *idata_end = d; idata_end = &d->next; - max_opno = -1; - num_dups = 0; memset (d->operand, 0, sizeof (d->operand)); /* Get the number of operands by scanning all the patterns of the @@ -900,7 +885,9 @@ gen_peephole (rtx peep, int lineno) for (i = 0; i < XVECLEN (peep, 0); i++) scan_operands (d, XVECEXP (peep, 0, i), 0, 0); - d->n_operands = max_opno + 1; + get_pattern_stats (&stats, XVEC (peep, 0)); + d->n_generator_args = 0; + d->n_operands = stats.num_insn_operands; d->n_dups = 0; validate_insn_alternatives (d); @@ -914,6 +901,7 @@ gen_peephole (rtx peep, int lineno) static void gen_expand (rtx insn, int lineno) { + struct pattern_stats stats; struct data *d = XNEW (struct data); int i; @@ -932,8 +920,6 @@ gen_expand (rtx insn, int lineno) *idata_end = d; idata_end = &d->next; - max_opno = -1; - num_dups = 0; memset (d->operand, 0, sizeof (d->operand)); /* Scan the operands to get the specified predicates and modes, @@ -943,8 +929,10 @@ gen_expand (rtx insn, int lineno) for (i = 0; i < XVECLEN (insn, 1); i++) scan_operands (d, XVECEXP (insn, 1, i), 0, 0); - d->n_operands = max_opno + 1; - d->n_dups = num_dups; + get_pattern_stats (&stats, XVEC (insn, 1)); + d->n_generator_args = stats.num_generator_args; + d->n_operands = stats.num_insn_operands; + d->n_dups = stats.num_dups; d->template_code = 0; d->output_format = INSN_OUTPUT_FORMAT_NONE; @@ -959,6 +947,7 @@ gen_expand (rtx insn, int lineno) static void gen_split (rtx split, int lineno) { + struct pattern_stats stats; struct data *d = XNEW (struct data); int i; @@ -974,8 +963,6 @@ gen_split (rtx split, int lineno) *idata_end = d; idata_end = &d->next; - max_opno = -1; - num_dups = 0; memset (d->operand, 0, sizeof (d->operand)); /* Get the number of operands by scanning all the patterns of the @@ -984,7 +971,9 @@ gen_split (rtx split, int lineno) for (i = 0; i < XVECLEN (split, 0); i++) scan_operands (d, XVECEXP (split, 0, i), 0, 0); - d->n_operands = max_opno + 1; + get_pattern_stats (&stats, XVEC (split, 0)); + d->n_generator_args = 0; + d->n_operands = stats.num_insn_operands; d->n_dups = 0; d->n_alternatives = 0; d->template_code = 0; diff --git a/gcc/recog.h b/gcc/recog.h index 534d2c99b18..0261bc6072d 100644 --- a/gcc/recog.h +++ b/gcc/recog.h @@ -300,6 +300,7 @@ struct insn_data_d const insn_gen_fn genfun; const struct insn_operand_data *const operand; + const char n_generator_args; const char n_operands; const char n_dups; const char n_alternatives; -- 2.30.2