On 02/05/12 14:00, Richard Sandiford wrote: > Jim MacArthur <jim.macart...@arm.com> writes: >> New Changelog text: >> >> 2012-05-02 Jim MacArthur<jim.macart...@arm.com> >> * recog.c (reg_fits_class_p): Check both regno and regno + offset are >> hard registers. > > Thanks. I still think the final: > >> + && HARD_REGISTER_NUM_P (end_hard_regno (regno + offset, mode)) > > check belongs in in_hard_reg_set_p, since most callers don't (and IMO > shouldn't need to) check this. The idea behind adding these functions > was to commonise various bits of code that were doing the same checks > in slightly different ways. Requiring each caller to check the end > register would go against that to some extent. >
If you're going to do that (which is fine, BTW), I think in_hard_reg_set_p should gcc_assert() that regno is a valid hard reg. > E.g. the code could be: > > end_regno = end_hard_regno (mode, regno); > if (!HARD_REGISTER_NUM_P (end_regno)) > return false; > > while (++regno < end_regno) > if (!TEST_HARD_REG_BIT (regs, regno)) > return false; > > Or alternatively we could change hard-reg-set.h so that HARD_REG_SET > is big enough to store a bit for FIRST_PSEUDO_REGISTER. I don't mind > which, but others might. I'd prefer the test to be explicit. The buffer overrun check might be a tad more efficient in some cases, but someday someone will manage to find a way of directly going 2 regs beyond the end... > > Looks good otherwise. And for the record, I can't approve this anyway. :-) > > Richard >