------- 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

Reply via email to