This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
reload question
- From: Chris Lattner <sabre at nondot dot org>
- To: <gcc at gcc dot gnu dot org>
- Date: Sat, 26 Jan 2002 19:40:22 -0600 (CST)
- Subject: reload question
I'm fixing some bugs in a test backend I wrote for GCC, and am hitting a
few snags in the reload phase. Specifically, GCC isn't able to reload:
(insn 29 28 31 (set (reg:SI 8 %o0 [113])
(zero_extend:SI (subreg:QI (reg/v:SI 108) 0))) 19 {zero_extendqisi2} (nil)
(expr_list:REG_EQUIV (mem/f:SI (reg/f:PDI 14 %sp) 0)
(expr_list:REG_DEAD (reg/v:SI 108)
(nil))))
and a small set of other cases, involving (zero|sign) extending subregs of
registers.
Can anyone give me a hint as to what could cause this? I have the
following instruction pattern:
(define_insn "zero_extendqisi2"
[(set (match_operand:SI 0 "register_operand" "=r")
(zero_extend:SI (match_operand:QI 1 "register_operand" "")))]
""
"zero_extendqisi2 %1 -> %0")
Which is obviously matched by the labeler, and combined by the combiner...
but reload isn't able to split the combined instruction into something
like this:
(set (reg:QI %reg:QI 1000)
(subreg:QI (reg/v:SI 108)))
(set (reg:SI 8 %o0 [113])
(zero_extend:SI (reg:QI 1000)))
Is there something that I'm missing that enables such transformations to
take place? Is there someplace in the manual that I should reread to
understand this phase of GCC? Do subreg's ever get turned into
truncate's?
Thanks for the help,
-Chris
http://www.nondot.org/sabre/os/