[Bug target/28675] [4.1/4.2/4.3 regression] ICE in extract_insn, at recog.c:2084 (unrecognizable insn) [arm]
pbrook at gcc dot gnu dot org
gcc-bugzilla@gcc.gnu.org
Tue Jan 30 18:06:00 GMT 2007
------- 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
More information about the Gcc-bugs
mailing list