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} Only MPX target is affected. Bootstrapped and tested on x86_64-unknown-linux-gnu. Does it look OK? Thanks, Ilya -- 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); + } + else + { + retval = gen_rtx_PARALLEL (VOIDmode, + gen_rtvec (3, retval, b0, b1)); + chkp_put_regs_to_expr_list (retval); + } } call = gen_rtx_SET (VOIDmode, retval, call);