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

Reply via email to