Adding Vladimir.

Ilya

2014-09-25 13:46 GMT+04:00 Ilya Enkovich <enkovich....@gmail.com>:
> 2014-09-25 1:51 GMT+04:00 Ilya Enkovich <enkovich....@gmail.com>:
>> 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
>
> I couldn't reproduce the problem on a small test but chrome build
> shows a lot of errors.  Due to the nature of the problem test's size
> shouldn't matter, so I attach patch which emulates situation with
> bounds regs (but uses xmm5 and xmm6 instead of bnd0 and bnd1) with a
> preprocessed chrome file.
>
> I apply patch to revision 215580.
>
> Command to reproduce:
>
>>g++ -O2 -c generated_message_reflection.ii
> ../../third_party/protobuf/src/google/protobuf/generated_message_reflection.cc:
> In member function 'virtual void
> google::protobuf::internal::GeneratedMessageReflection::AddBool(google::protobuf::Message*,
> const google::protobuf::FieldDescriptor*, bool) const':
> ../../third_party/protobuf/src/google/protobuf/generated_message_reflection.cc:726:3910:
> internal compiler error: in lra_set_insn_recog_data, at lra.c:941
> 0xc7b969 lra_set_insn_recog_data(rtx_insn*)
>         ../../gcc-pl/gcc/lra.c:939
> 0xc79822 lra_get_insn_recog_data
>         ../../gcc-pl/gcc/lra-int.h:473
> 0xc7d426 lra_update_insn_regno_info(rtx_insn*)
>         ../../gcc-pl/gcc/lra.c:1600
> 0xc7d690 lra_push_insn_1
>         ../../gcc-pl/gcc/lra.c:1653
> 0xc7d6c0 lra_push_insn(rtx_insn*)
>         ../../gcc-pl/gcc/lra.c:1661
> 0xc7d7bf push_insns
>         ../../gcc-pl/gcc/lra.c:1704
> 0xc7da47 lra_process_new_insns(rtx_insn*, rtx_insn*, rtx_insn*, char const*)
>         ../../gcc-pl/gcc/lra.c:1758
> 0xc94c80 inherit_in_ebb
>         ../../gcc-pl/gcc/lra-constraints.c:5356
> 0xc9599c lra_inheritance()
>         ../../gcc-pl/gcc/lra-constraints.c:5560
> 0xc7e86c lra(_IO_FILE*)
>         ../../gcc-pl/gcc/lra.c:2223
> 0xc2eab8 do_reload
>         ../../gcc-pl/gcc/ira.c:5311
> 0xc2edfe execute
>         ../../gcc-pl/gcc/ira.c:5470
> Please submit a full bug report,
> with preprocessed source if appropriate.
> Please include the complete backtrace with any bug report.
> See <http://gcc.gnu.org/bugs.html> for instructions.
>
> The problem as I see it is that in lra-constraints.c:5352 we do not
> check call dest is actually a register.  But probably REG_RETURNED
> shouldn't be applied to such call because it is not clear to which
> return value it applies.
>
> Thanks,
> Ilya

Reply via email to