Paul Koning <paul_kon...@dell.com> writes: > Working on the pdp11 target, I ran into something odd. > > It defines REGNO_OK_FOR_BASE_P in a way that seems to match what gccint says > one should do in the "strict" case -- but does so all the time. > Specifically, it says: > > #define REGNO_OK_FOR_BASE_P(REGNO) \ > ((REGNO) < 8 || (unsigned) reg_renumber[REGNO] < 8) > > (8 because there are 8 general registers on the PDP11, all suitable as base.) > > It then defines another similarly named macro REG_OK_FOR_BASE_P which takes > an rtx instead of a regno, for use in GO_IF_LEGITIMATE_ADDRESS. That second > macro *does* come with a non-strict form which accepts all registers. > > Looking at gccint, that seemed wrong. As far as I can tell, > REG_OK_FOR_BASE_P is not (or no longer) a standard macro so it's just a > convenience macro inside the target. No problem there. But the strict > REGNO_OK_FOR_BASE_P in non-strict settings seemed like an issue, so I changed > it. > > The surprise it that it makes no difference. No change in code, no change in > testsuite results. Why didn't it matter? Is the documentation wrong? Or is > the existing definition somehow ok even for the non-strict case, in a way > that isn't obvious?
I think the documentation is wrong. REGNO_OK_FOR_BASE_P is only meaningful for hard registers. It doesn't make much sense to ask whether a pseudo-register is OK to use as a base. The pseudo-register can in principle be assigned to any hard register, so the answer is always true. In older releases GO_IF_LEGITIMATE_ADDRESS was often a macro written in terms of REGNO_OK_FOR_BASE_P. Since GO_IF_LEGITIMATE_ADDRESS had to change based on REG_OK_STRICT, it made sense to have REGNO_OK_FOR_BASE_P change based on REG_OK_STRICT. But the generic part of gcc will not check REGNO_OK_FOR_BASE_P for a pseudo register. And since current targets should be using TARGET_LEGITIMATE_ADDRESS_P instead of GO_IF_LEGITIMATE_ADDRESS, the issue of REGNO_OK_FOR_BASE_P is less important. Probably the docs should be changed. Ian