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