[PATCH] Fix PR target/33923
Jim Wilson
wilson@specifix.com
Wed Nov 14 22:34:00 GMT 2007
Eric Botcazou wrote:
> PR target/33923
> * config/ia64/ia64.h (CANNOT_CHANGE_MODE_CLASS): Forbid mode changes
> for registers in BR_REGS class.
I found this a bit puzzling. HARD_REGNO_MODE_OK says that BR_REGS can
only hold DImode, so it seems strange that we need
CANNOT_CHANGE_MODE_CLASS support here. I tried debugging this myself.
The underlying problem here is that an SImode register got tied to a
DImode register, and then the DImode register got allocated to BR_REGS,
thus causing the invalid SImode BR_REGS reference. This makes sense.
The MODES_TIEABLE_P docs clearly say that MODES_TIEABLE_P must return
false if there is any register class that accepts one mode but not the
other. BR_REGS accepts DImode but not SImode, so MODES_TIEABLE_P should
return false in this case. I did verify that this fixes the problem.
However, the docs also say that returning false for integer mode
combinations is a very bad idea, and that you should try an alternative
solution if possible. Which is what your patch does by using
CANNOT_CHANGE_MODE_CLASS.
The only minor criticism I have is that I'd like the comment to mention
the MODES_TIEABLE_P connection, to make it clear why the BR_REGS support
in CANNOT_CHANGE_MODE_CLASS is necessary. Otherwise the patch doesn't
make much sense to me. The patch is OK with that change.
In theory, we may have the same problem with AR_REGS, the application
registers. These registers also only allow DImode. However, the
register allocator shouldn't be using those, so it may not be a real
problem. I'm not going to worry about this. If it pops up, we can deal
with it then.
--
Jim Wilson, GNU Tools Support, http://www.specifix.com
More information about the Gcc-patches
mailing list