I've got a small test case there the ira pass produces this ...

(insn 35 38 36 5 (set (reg/v:SI 29 [orig:17 _b ] [17])
        (reg/v:SI 17 [ _b ])) 48 {*ldsi}
     (expr_list:REG_DEAD (reg/v:SI 17 [ _b ])
        (nil)))

and the LRA processes it as follows ...

       Spilling non-eliminable hard regs: 6
            0 Non input pseudo reload: reject++
          alt=0,overall=607,losers=1,rld_nregs=2
            0 Non input pseudo reload: reject++
            1 Spill pseudo into memory: reject+=3
          alt=1,overall=616,losers=2,rld_nregs=2
            0 Non input pseudo reload: reject++
            alt=2: Bad operand -- refuse
     Choosing alt 0 in insn 35:  (0) =r  (1) r {*ldsi}
Creating newreg=34 from oldreg=29, assigning class GENERAL_REGS to r34
   35: r34:SI=r17:SI
      REG_DEAD r17:SI
    Inserting insn reload after:
   45: r29:SI=r34:SI

            0 Non input pseudo reload: reject++
            1 Non pseudo reload: reject++
          alt=0,overall=608,losers=1,rld_nregs=2
            0 Non input pseudo reload: reject++
          alt=1,overall=613,losers=2,rld_nregs=2
            0 Non input pseudo reload: reject++
            alt=2: Bad operand -- refuse
     Choosing alt 0 in insn 45:  (0) =r  (1) r {*ldsi}
Creating newreg=35 from oldreg=29, assigning class GENERAL_REGS to r35
   45: r35:SI=r34:SI
    Inserting insn reload after:
   46: r29:SI=r35:SI

so, it is stuck in a loop (continues on for 90 attempts then aborts) but I can't see what is causing it. The pattern (below) shouldn't require a reload so I can't see why it would be doing this

(define_insn "*ldsi"
  [(set (match_operand:SI 0 "register_operand"     "=r,r,r")
            (match_operand:SI 1 "general_operand"   "r,m,i"))
  ]
  ""

Can anyone shed any light on this behaviour ?

Thanks, Paul.

Reply via email to