Stefan Schulze Frielinghaus <stefa...@linux.ibm.com> writes: > Tests gcc.dg/asm-hard-reg-error-{4,5}.c ICE on sparc*-sun-solaris2.11 > since in tm-preds.h we have > > #define CONSTRAINT_LEN(c_,s_) 1 > > and, therefore, do not parse hard register constraints correctly. > Hard register constraints are non-single character constraints and > require insn_constraint_len() in order to determine the length. > > In write_tm_preds_h() from genpreds.cc, previously variable > constraint_max_namelen was used in order to decide whether we have > single or non-single character constraints: > > if (constraint_max_namelen > 1) > { > write_insn_constraint_len (); > puts ("#define CONSTRAINT_LEN(c_,s_) " > "insn_constraint_len (c_,s_)\n"); > } > else > puts ("#define CONSTRAINT_LEN(c_,s_) 1\n"); > > The distinction shouldn't be done anymore and we always must call into > insn_constraint_len(). > > Skimming over the remaining uses of constraint_max_namelen, the variable > was also used in order to decide whether we have any constraint at all. > My understanding is that, coming from common.md, every target has at > least a register constraint (among other constraints coming from > common.md) which means constraint_max_namelen > 0 should be always true. > Or in other words, if that wouldn't be true, then CONSTRAINT_LEN > wouldn't be defined which would result in compile errors. At least I > didn't find another spot were it is defined. > > I might have overlooked something which is why I kept the old behaviour > but reduced it to a boolean instead of a counting variable. Would be > great if someone could have a second look. If constraint_max_namelen > > 0 is indeed useless we could remove the check entirely.
Yeah, like you say, common.md means that we always have a constraint. The patch is ok with constraint_max_namelen/have_constraints removed. Thanks, Richard > gcc/ChangeLog: > > * genpreds.cc (add_constraint): Don't track the maximal > constraint length but rather whether we have any at all. > (write_tm_preds_h): Always write insn_constraint_len() and > define CONSTRAINT_LEN to it. > --- > gcc/genpreds.cc | 18 ++++++------------ > 1 file changed, 6 insertions(+), 12 deletions(-) > > diff --git a/gcc/genpreds.cc b/gcc/genpreds.cc > index 4f8beeb0514..4ed6dcdd81c 100644 > --- a/gcc/genpreds.cc > +++ b/gcc/genpreds.cc > @@ -719,7 +719,7 @@ static const char const_dbl_constraints[] = "GH"; > > /* Summary data used to decide whether to output various functions and > macro definitions. */ > -static unsigned int constraint_max_namelen; > +static bool have_constraints; > static bool have_register_constraints; > static bool have_memory_constraints; > static bool have_special_memory_constraints; > @@ -942,7 +942,7 @@ add_constraint (const char *name, const char *regclass, > *last_constraint_ptr = c; > last_constraint_ptr = &c->next_textual; > > - constraint_max_namelen = MAX (constraint_max_namelen, strlen (name)); > + have_constraints = true; > have_register_constraints |= c->is_register; > have_const_int_constraints |= c->is_const_int; > have_extra_constraints |= c->is_extra; > @@ -1563,7 +1563,7 @@ write_tm_preds_h (void) > "#endif\n" > "\n"); > > - if (constraint_max_namelen > 0) > + if (have_constraints) > { > write_enum_constraint_num (); > puts ("extern enum constraint_num lookup_constraint_1 (const char > *);\n" > @@ -1616,14 +1616,8 @@ write_tm_preds_h (void) > address_start, address_end); > write_allows_reg_mem_function (); > > - if (constraint_max_namelen > 1) > - { > - write_insn_constraint_len (); > - puts ("#define CONSTRAINT_LEN(c_,s_) " > - "insn_constraint_len (c_,s_)\n"); > - } > - else > - puts ("#define CONSTRAINT_LEN(c_,s_) 1\n"); > + write_insn_constraint_len (); > + puts ("#define CONSTRAINT_LEN(c_,s_) insn_constraint_len (c_,s_)\n"); > if (have_register_constraints) > puts ("extern enum reg_class reg_class_for_constraint_1 " > "(enum constraint_num);\n" > @@ -1750,7 +1744,7 @@ write_insn_preds_c (void) > FOR_ALL_PREDICATES (p) > write_one_predicate_function (p); > > - if (constraint_max_namelen > 0) > + if (have_constraints) > { > write_lookup_constraint_1 (); > write_lookup_constraint_array ();