This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH, rtl-optimization]: Fix PR 51821, 64bit > 32bit conversion produces incorrect results with optimizations


On Fri, Jan 13, 2012 at 12:01 AM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> The solution is to fix the scanning loop to look into the insn pattern
>> itself for all set and clobbered hard registers. This way, all
>> registers, clobbered by the pattern, will be correctly marked in the
>> "live" bitmap, including FLAGS register that is ignored by current
>> approach.
>>
>> 2012-01-12 ?Uros Bizjak ?<ubizjak@gmail.com>
>>
>> ? ? ? * recog.c (peep2_find_free_register): Determine clobbered registers
>> ? ? ? from insn pattern.
>
> Is that a complete solution though? ?Don't we need to do more, for example
> because of peep2_reg_dead_p and peep2_update_life? ?These are not rhetorical
> questions, but genuine ones; it's a little disturbing to discover such a flaw
> in this kind of code after all these years (I can reproduce the problem with
> all the compilers of the 4.x series, so this didn't work with flow.c either).

Yes, it is a complete solution. Tracking register liveness is
different issue, and a register is indeed dead after instruction, if
it has been clobbered by insn, or when marked unused. This works OK,
and there are many examples of peep2_{reg|regno}_dead_p usag in
i386.md.

The problem my patch solves is the answer to the question "Is the
choosen non-live temporary register untouched over the insn
sequence?". The answer: "Yes, if it was not set or clobbered by any
insn in the sequence".

Uros.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]