2014-09-24 23:09 GMT+04:00 Jeff Law <l...@redhat.com>: > On 09/24/14 07:13, Ilya Enkovich wrote: >> >> I tried to generate PARALLEL with all regs set by call. Here is a >> memset call I got: >> >> (call_insn 23 22 24 2 (set (parallel [ >> (expr_list:REG_DEP_TRUE (reg:DI 0 ax) >> (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 ("memset") [flags 0x41] > > [ snip ] > Looks good. This is the approved way to handle multiple results of a call. > >> >> During register allocation LRA generated a weird move instruction: >> >> (insn 63 0 0 (set (reg/f:DI 100) >> (parallel [ >> (expr_list:REG_DEP_TRUE (reg:DI 0 ax) >> (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])) >> ])) -1 >> (nil)) >> >> Which caused ICE later in LRA. This move happens because of >> REG_RETURNED (reg/f:DI 100) (see condition in inherit_in_ebb at >> lra-constraints.c:5312). Thus this code in LRA doesn't accept >> PARALLEL dest for calls. > > This is a bug in LRA then. Multiple return values aren't heavily used, so > I'm not surprised that its handling was missed in LRA. > > The question now is how to bundle things together in such a way as to make > it easy for Vlad to reproduce and fix this in LRA. > > Jeff
I suppose it should be easy to reproduce using the same test case I use and some speudo patch which adds fake return values (e.g. xmm6 and xmm7) to calls. Will try to make some minimal patch and test Vlad could work with. Ilya