On 06/23/10 11:22, Alex Turjan wrote:
Hi,
My port supports hardware loops generated by the following (do_end) pattern:
(set (pc) (if_then_else (ne (match_operand:HI 0 "general_register_operand" "d")
(const_int 0))
(label_ref (match_operand 1 "" ""))
(pc)))
(set (match_operand:HI 2 "general_register_operand" "=0")
(plus:HI (match_operand:HI 3 "general_register_operand" "0")
(const_int -1)))
(clobber (match_operand:BI 4 "predicate_register_operand" "=j"))
When Im compiling a loop with high register pressure the register allocator
does not allocate a register for the loop counter (i.e., operand 0) as it has a
long life range. Thus operand 0 has to be reloaded but then I get a failure in
the reload:
error: unable to generate reloads for:
(jump_insn 211 182 188 11 lib5.c:51 (parallel [
(set (pc)
(if_then_else (ne (reg:HI 292 [ N ])
(const_int 0 [0x0]))
(label_ref 183)
(pc)))
(set (reg:HI 292 [ N ])
(plus:HI (reg:HI 292 [ N ])
(const_int -1 [0xffffffffffffffff])))
(clobber (reg:BI 33 p1 [293]))
]) 506 {do_endhi} (expr_list:REG_UNUSED (reg:BI 33 p1 [293])
(expr_list:REG_BR_PROB (const_int 9100 [0x238c])
(nil)))
-> 183)
lib5.c:105:1: internal compiler error: in find_reloads, at reload.c:3821
Can anybody give me a hint?
I am aware of the following msg:
http://gcc.gnu.org/ml/gcc/2001-09/msg00942.html
but still dont know how to make reload do the work.
insns which branch are not allowed to have output reloads. You must
support any kind of register as well as memory operands in your insn for
the loop counter.
Jeff