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. thanks, Alex