> Hi, > > This patch fixes nested PARALLEL in retval for isntrumented calls. Current > possible call: > > (call_insn:TI 6 30 17 2 (set (parallel [ > (expr_list:REG_DEP_TRUE (parallel:TI [ > (expr_list:REG_DEP_TRUE (reg:DF 21 xmm0) > (const_int 0 [0])) > (expr_list:REG_DEP_TRUE (reg:DF 22 xmm1) > (const_int 8 [0x8])) > ]) > (const_int 0 [0])) > (expr_list:REG_DEP_TRUE (reg:BND64 77 bnd0) > (const_int 0 [0])) > (expr_list:REG_DEP_TRUE (reg:BND64 78 bnd1) > (const_int 0 [0])) > ]) > (call/j (mem:QI (symbol_ref:DI ("test1") [flags 0x41] <function_decl > 0x7f6f50e02ca8 test1.chkp>) [0 test1.chkp S1 A8]) > (const_int 0 [0]))) complex.c:11 670 {*call_value} > > Such construction causes DF analysis problems. This patch tranforms it to: > > (call_insn:TI 6 30 17 2 (set (parallel:TI [ > (expr_list:REG_DEP_TRUE (reg:DF 21 xmm0) > (const_int 0 [0])) > (expr_list:REG_DEP_TRUE (reg:DF 22 xmm1) > (const_int 8 [0x8])) > (expr_list:REG_DEP_TRUE (reg:BND64 77 bnd0) > (const_int 0 [0])) > (expr_list:REG_DEP_TRUE (reg:BND64 78 bnd1) > (const_int 0 [0])) > ]) > (call/j (mem:QI (symbol_ref:DI ("test1") [flags 0x41] <function_decl > 0x7fb609bf7ca8 test1.chkp>) [0 test1.chkp S1 A8]) > (const_int 0 [0]))) complex.c:11 670 {*call_value}
Yep, nested parallels should not happen. > 2015-04-02 Ilya Enkovich <ilya.enkov...@intel.com> > > * config/i386/i386.c (ix86_expand_call): Avoid nested > PARALLEL in returned call value. > > > diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c > index 744642c..1d821cd 100644 > --- a/gcc/config/i386/i386.c > +++ b/gcc/config/i386/i386.c > @@ -25624,8 +25624,19 @@ ix86_expand_call (rtx retval, rtx fnaddr, rtx > callarg1, > { > rtx b0 = gen_rtx_REG (BND64mode, FIRST_BND_REG); > rtx b1 = gen_rtx_REG (BND64mode, FIRST_BND_REG + 1); > - retval = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (3, retval, b0, b1)); > - chkp_put_regs_to_expr_list (retval); > + if (GET_CODE (retval) == PARALLEL) > + { > + b0 = gen_rtx_EXPR_LIST (VOIDmode, b0, const0_rtx); > + b1 = gen_rtx_EXPR_LIST (VOIDmode, b1, const0_rtx); > + rtx par = gen_rtx_PARALLEL (VOIDmode, gen_rtvec (2, b0, b1)); > + retval = chkp_join_splitted_slot (retval, par); I do not understand this code. Isn't it just droping the original return value constructing prallelcontaining only the BND_REGs? Honza