reload question
Chris Lattner
sabre@nondot.org
Sun Jan 27 04:34:00 GMT 2002
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/
More information about the Gcc
mailing list