This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: peephole2: dead regs not marked as dead


On 10/25/2010 11:35 AM, Georg Lay wrote:
 (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.

In this case, as I mentioned the function _doesn't need_ a note to see that D15 dies. There's no such thing as a register that is "naturally dead because the function ends" and needs special treatment. Liveness is computed like everything else from data flow and, when scanning backwards, can be computed simply from the defs and uses of each instruction. The notes are not necessary, so their absence is (as I also have mentioned above already) a red herring.


The definition of liveness is lr_before = lr_after - def + use, which gives:

at the end of basic block          lr from dump file = {2,26,27}
insn 10 def = {2}, use = {4}       lr before insn 10 = {4,26,27}
insn 21 def = {4}, use = {15}      lr before insn 21 = {15,26,27}
insn 23 def = {15}, use = {4,15}   lr before insn 23 = {4,15,26,27}
insn 22 def = {15}, use = {4}      lr before insn 22 = {4,26,27}

When GCC matches the peephole against 21+23, peep2_reg_dead_p(2, reg) should test reg against "lr before insn 10". This is {4,26,27}. You have to set a breakpoint in df_simulate_one_insn_backwards and see which part of my theory above is incorrect.

Paolo


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]