Paolo Bonzini schrieb:
> On 10/22/2010 01:16 PM, Georg Lay wrote:
>> Then the first insn gets split after reload and before peephole2:
>>
>> (insn 22 8 23 2 peep2.c:5 (set (reg:SI 15 d15)
>>          (and:SI (reg:SI 4 d4 [ x ])
>>              (const_int -98305 [0xfffe7fff]))) 143
>> {*and3_zeroes.insert.{SI}.ic}
>> (nil))
>>
>> (insn 23 22 21 2 peep2.c:5 (set (reg:SI 15 d15)
>>          (xor:SI (reg:SI 15 d15)
>>              (reg:SI 4 d4 [ x ]))) 39 {*xorsi3} (nil))
>>
>> (insn 21 23 10 2 peep2.c:5 (set (reg:SI 4 d4)
>>          (reg:SI 15 d15)) 2 {*movsi_insn} (nil))
>>
>> (call_insn/j 10 21 11 2 peep2.c:5 (parallel [
>>              (set (reg:SI 2 d2)
>>                  (call (mem:HI (symbol_ref:SI ("f") [flags
>> 0x41]<function_decl
>> 0xb76b3280 f>) [0 S2 A16])
>>                      (const_int 0 [0x0])))
>>              (use (const_int 1 [0x1]))
>>          ]) 92 {call_value_insn} (nil)
>>      (expr_list:REG_DEP_TRUE (use (reg:SI 4 d4))
>>          (nil)))
>> ;; End of basic block 2 ->  ( 1)
>> ;; lr  out      2 [d2] 26 [SP] 27 [a11]
>> ;; live  out      2 [d2] 26 [SP] 27 [a11]
>> ;; Succ edge  EXIT [100.0%]  (ab,sibcall)
>>
>> (barrier 11 10 20)
>>
>> D15, is not marked as dead
> 
> True.  It should have had a REG_DEAD note.  Are you using 4.6 (which
> scans forwards in peephole2 and requires REG_DEAD notes) or 4.5 (which
> scans backwards)?  If the latter, the absence of the note could be a red
> herring, because 4.5 didn't need REG_DEAD notes so it didn't compute them.

It is a target port of 4.5.1. I just skimmed peep2_reg_dead_p and it looks
backward. So this function will never see that D15 dies and report D15 as alive.

> What's your definition of CALL_USED_REGISTERS,
> CALL_REALLY_USED_REGISTERS, EPILOGUE_USES?  Is d15 in any of them?

D15 is not an element of any of them. D15 is call-saved and will get restored in
the RET-instruction of the callee which is tail-called in this particular case.

But even if f is not being tail-called D15 is not reported as dead. In that case
the insns after the call are (D2 is the return register, returning 1+f(...))

(insn 17 12 20 2 peep2.c:11 (set (reg/i:SI 2 d2)
        (plus:SI (reg:SI 2 d2)
            (const_int 1 [0x1]))) 6 {*addsi3} (nil))

(insn 20 17 28 2 peep2.c:11 (use (reg/i:SI 2 d2)) -1 (nil))

(jump_insn 29 28 30 2 peep2.c:11 (return) -1 (nil))

(barrier 30 29 23)

As far as 4.6 is concerned, I have not tried it yet. I do not know how stable
the releases are and how much work it is to switch from 4.5 to 4.6.

Georg Lay


Reply via email to