From e663da80d4c288b804a1ae2e04544b7e668080ce Mon Sep 17 00:00:00 2001 From: Richard Sandiford Date: Thu, 8 May 2008 21:28:27 +0000 Subject: [PATCH] gensupport.h (pred_data): Add a "num_codes" field. gcc/ * gensupport.h (pred_data): Add a "num_codes" field. (add_predicate_code): Declare. * gensupport.c (add_predicate_code): New function. (std_pred_table): Add an "allows_const_p" field. (std_preds): Set this field for predicates that allow RTX_CONST_OBJs. Remove the (incomplete) list of such codes from the codes field. (init_predicate_table): Use add_predicate_code. Add all RTX_CONST_OBJs if allows_const_p is true. * genrecog.c (process_define_predicate): Use add_predicate_code. From-SVN: r135090 --- gcc/ChangeLog | 12 +++++++ gcc/genrecog.c | 23 ++---------- gcc/gensupport.c | 93 ++++++++++++++++++++++++++++-------------------- gcc/gensupport.h | 2 ++ 4 files changed, 71 insertions(+), 59 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index ae8d7a9d197..7a53d5d62b5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,15 @@ +2008-05-08 Richard Sandiford + + * gensupport.h (pred_data): Add a "num_codes" field. + (add_predicate_code): Declare. + * gensupport.c (add_predicate_code): New function. + (std_pred_table): Add an "allows_const_p" field. + (std_preds): Set this field for predicates that allow RTX_CONST_OBJs. + Remove the (incomplete) list of such codes from the codes field. + (init_predicate_table): Use add_predicate_code. Add all + RTX_CONST_OBJs if allows_const_p is true. + * genrecog.c (process_define_predicate): Use add_predicate_code. + 2008-05-08 David Daney Richard Sandiford diff --git a/gcc/genrecog.c b/gcc/genrecog.c index 8564b5cc1f1..43afa7f449c 100644 --- a/gcc/genrecog.c +++ b/gcc/genrecog.c @@ -368,7 +368,6 @@ process_define_predicate (rtx desc) { struct pred_data *pred = xcalloc (sizeof (struct pred_data), 1); char codes[NUM_RTX_CODE]; - bool seen_one = false; int i; pred->name = XSTR (desc, 0); @@ -379,26 +378,8 @@ process_define_predicate (rtx desc) for (i = 0; i < NUM_RTX_CODE; i++) if (codes[i] != N) - { - pred->codes[i] = true; - if (GET_RTX_CLASS (i) != RTX_CONST_OBJ) - pred->allows_non_const = true; - if (i != REG - && i != SUBREG - && i != MEM - && i != CONCAT - && i != PARALLEL - && i != STRICT_LOW_PART) - pred->allows_non_lvalue = true; - - if (seen_one) - pred->singleton = UNKNOWN; - else - { - pred->singleton = i; - seen_one = true; - } - } + add_predicate_code (pred, i); + add_predicate (pred); } #undef I diff --git a/gcc/gensupport.c b/gcc/gensupport.c index 7cacfa4540b..f455eb97260 100644 --- a/gcc/gensupport.c +++ b/gcc/gensupport.c @@ -1299,6 +1299,34 @@ lookup_predicate (const char *name) return (struct pred_data *) htab_find (predicate_table, &key); } +/* Record that predicate PRED can accept CODE. */ + +void +add_predicate_code (struct pred_data *pred, enum rtx_code code) +{ + if (!pred->codes[code]) + { + pred->num_codes++; + pred->codes[code] = true; + + if (GET_RTX_CLASS (code) != RTX_CONST_OBJ) + pred->allows_non_const = true; + + if (code != REG + && code != SUBREG + && code != MEM + && code != CONCAT + && code != PARALLEL + && code != STRICT_LOW_PART) + pred->allows_non_lvalue = true; + + if (pred->num_codes == 1) + pred->singleton = code; + else if (pred->num_codes == 2) + pred->singleton = UNKNOWN; + } +} + void add_predicate (struct pred_data *pred) { @@ -1320,32 +1348,31 @@ struct std_pred_table { const char *name; bool special; + bool allows_const_p; RTX_CODE codes[NUM_RTX_CODE]; }; static const struct std_pred_table std_preds[] = { - {"general_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, - LABEL_REF, SUBREG, REG, MEM }}, - {"address_operand", true, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, - LABEL_REF, SUBREG, REG, MEM, - PLUS, MINUS, MULT}}, - {"register_operand", false, {SUBREG, REG}}, - {"pmode_register_operand", true, {SUBREG, REG}}, - {"scratch_operand", false, {SCRATCH, REG}}, - {"immediate_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, - LABEL_REF}}, - {"const_int_operand", false, {CONST_INT}}, - {"const_double_operand", false, {CONST_INT, CONST_DOUBLE}}, - {"nonimmediate_operand", false, {SUBREG, REG, MEM}}, - {"nonmemory_operand", false, {CONST_INT, CONST_DOUBLE, CONST, SYMBOL_REF, - LABEL_REF, SUBREG, REG}}, - {"push_operand", false, {MEM}}, - {"pop_operand", false, {MEM}}, - {"memory_operand", false, {SUBREG, MEM}}, - {"indirect_operand", false, {SUBREG, MEM}}, - {"comparison_operator", false, {EQ, NE, LE, LT, GE, GT, LEU, LTU, GEU, GTU, - UNORDERED, ORDERED, UNEQ, UNGE, UNGT, UNLE, - UNLT, LTGT}} + {"general_operand", false, true, {SUBREG, REG, MEM}}, + {"address_operand", true, true, {SUBREG, REG, MEM, PLUS, MINUS, MULT}}, + {"register_operand", false, false, {SUBREG, REG}}, + {"pmode_register_operand", true, false, {SUBREG, REG}}, + {"scratch_operand", false, false, {SCRATCH, REG}}, + {"immediate_operand", false, true, {0}}, + {"const_int_operand", false, false, {CONST_INT}}, + {"const_double_operand", false, false, {CONST_INT, CONST_DOUBLE}}, + {"nonimmediate_operand", false, false, {SUBREG, REG, MEM}}, + {"nonmemory_operand", false, true, {SUBREG, REG}}, + {"push_operand", false, false, {MEM}}, + {"pop_operand", false, false, {MEM}}, + {"memory_operand", false, false, {SUBREG, MEM}}, + {"indirect_operand", false, false, {SUBREG, MEM}}, + {"comparison_operator", false, false, {EQ, NE, + LE, LT, GE, GT, + LEU, LTU, GEU, GTU, + UNORDERED, ORDERED, + UNEQ, UNGE, UNGT, + UNLE, UNLT, LTGT}} }; #define NUM_KNOWN_STD_PREDS ARRAY_SIZE (std_preds) @@ -1369,22 +1396,12 @@ init_predicate_table (void) pred->special = std_preds[i].special; for (j = 0; std_preds[i].codes[j] != 0; j++) - { - enum rtx_code code = std_preds[i].codes[j]; - - pred->codes[code] = true; - if (GET_RTX_CLASS (code) != RTX_CONST_OBJ) - pred->allows_non_const = true; - if (code != REG - && code != SUBREG - && code != MEM - && code != CONCAT - && code != PARALLEL - && code != STRICT_LOW_PART) - pred->allows_non_lvalue = true; - } - if (j == 1) - pred->singleton = std_preds[i].codes[0]; + add_predicate_code (pred, std_preds[i].codes[j]); + + if (std_preds[i].allows_const_p) + for (j = 0; j < NUM_RTX_CODE; j++) + if (GET_RTX_CLASS (j) == RTX_CONST_OBJ) + add_predicate_code (pred, j); add_predicate (pred); } diff --git a/gcc/gensupport.h b/gcc/gensupport.h index f604bd0be0e..effd4a4b397 100644 --- a/gcc/gensupport.h +++ b/gcc/gensupport.h @@ -76,6 +76,7 @@ struct pred_data /* data used primarily by genrecog.c */ enum rtx_code singleton; /* if pred takes only one code, that code */ + int num_codes; /* number of codes accepted */ bool allows_non_lvalue; /* if pred allows non-lvalue expressions */ bool allows_non_const; /* if pred allows non-const expressions */ bool codes[NUM_RTX_CODE]; /* set of codes accepted */ @@ -83,6 +84,7 @@ struct pred_data extern struct pred_data *first_predicate; extern struct pred_data *lookup_predicate (const char *); +extern void add_predicate_code (struct pred_data *, enum rtx_code); extern void add_predicate (struct pred_data *); #define FOR_ALL_PREDICATES(p) for (p = first_predicate; p; p = p->next) -- 2.30.2