Hi,

> > (call_insn:HI 91 270 92 5 cor_h.c:129 (parallel [
> >            (set (reg:SI 1 $c1)
> >                (call (mem:SI (symbol_ref:SI
> > ("DotProductWithoutShift") [flags 0x41] <function_decl 0x401f7d00
> > DotProductWithoutShift>) [0 S4 A32])
> >                    (const_int 0 [0x0])))
> >            (use (const_int 0 [0x0]))
> >            (clobber (reg:SI 31 $link))
> >        ]) 42 {*call_value_direct} (expr_list:REG_DEAD (reg:SI 4 $c4)
> >        (expr_list:REG_DEAD (reg:SI 3 $c3 [ ivtmp.103 ])
> >            (expr_list:REG_DEAD (reg:SI 2 $c2 [ h ])
> >                (nil))))
> >    (expr_list:REG_DEP_TRUE (use (reg:SI 4 $c4))
> >        (expr_list:REG_DEP_TRUE (use (reg:SI 3 $c3 [ ivtmp.103 ]))
> >            (expr_list:REG_DEP_TRUE (use (reg:SI 2 $c2 [ h ]))
> >                (expr_list:REG_DEP_TRUE (use (reg:SI 1 $c1 [ ivtmp.101 ]))
> >                    (nil))))))
>
> I don't think so, it should be in dead_or_set, the value contained in $c1 dies
> in the insn.

Yes, after going through the code more closely, I concur.
The problem lies in that, $c1 isn't live_throughout, but at the point
before the call insn
it is live. Therefore If an instruction is inserted before the call
insn as is done when a caller
save instruction is inserted (by caller-save.c) and if this doesnt
kill $c1 then its live_throughout
should have the bit for $c1 set. This doesnt happen because while
inserting the caller save insn, its
live_throughout is simply set to the live_throughout of the call insn
+ the registers marked with
REG_DEAD notes in the call insn. However since $c1 is an argument to
the call it is used by the call_insn
and is marked  REG_DEP_TRUE ( Read after Write).  Shouldnt regs in
REG_DEP_TRUE be added to
live_throughout. My suspicion is that the LOG_LINKS are not always
up-to-date, therefore will it be
better to use DF_INSN_UID_USES ?

Thanks in advance,
Pranav

Reply via email to