------- Comment #12 from pbrook at gcc dot gnu dot org 2007-01-30 18:06 ------- Before reload the problematic instruction is:
(set (mem:HI (something)) (subreg:HI (reg:SI 177))) Reload decides to reload the second operand into a register. In find_reloads_subreg_address, reg_equiv_memory_loc tells us that reg 117 is equivalent to (mem:SI (plus:SI (mult:SI (reg:SI r1) (const_int 16)) (reg:SI r6))) This is a valid SImode address, but not a valid HImode address. we change the mem:SI to mem:HI, then call find_reloads_address to fixup the result. However the comment above find_reloads_address says: Note that there is no verification that the address will be valid after this routine does its work. Instead, we rely on the fact that the address was valid when reload started. So we need only undo things that reload could have broken. These are wrong register types, pseudos not allocated to a hard register, and frame pointer elimination. */ No mention of having broken the address by changing the mode of the mem. The new HImode mem passes through find_reloads_address unmolested, causing an ICE later when we try to assign it to the reload reg. My guess would be that we need to be calling something other than find_reloads_address after replacing the subreg with the mem, but don't know reload well enough to say what. -- pbrook at gcc dot gnu dot org changed: What |Removed |Added ---------------------------------------------------------------------------- AssignedTo|pbrook at gcc dot gnu dot |unassigned at gcc dot gnu |org |dot org Status|ASSIGNED |NEW http://gcc.gnu.org/bugzilla/show_bug.cgi?id=28675