This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: Question about compare rtl
Aurelien Buhrig <aurelien.buhrig.gcc@gmail.com> writes:
>>> So the question is more about the RTL difference there would be between
>>> (set (pc) (if_then_else (lt (sub r0 r1) (const_int 0)) (label_ref) (pc)))
>>> and
>>> (set (pc) (if_then_else (lt r0 r1) (label_ref) (pc)))
>>> and the ability / correctness to merge both insn (if different) with a
>>> (sub r0 r1) (in combine or cse pass).
>>
>> The first one (lt (sub r0 r1) (const_int 0)) can be combined with a sub
>> insn, if the result of the sub insn is not used.
>
> It cannot combine the sub with a cbranch if the result is used (maybe
> because of DFG consideration?). but in my case, the cbranch is expanded
> into a compare insn and a branch<condition> insn which enables combining
> the sub and the compare.
To be clear, combine does not generate the input to a define_expand. It
only generates patterns that are matched by a define_insn. So what you
are describing would only work if you implement a conditional branch via
a define_insn, and then use a define_split to split it up into the
actual instructions.
> It doesn't seems to be the best practice according to
> http://gcc.gnu.org/wiki/general_backend_cleanup (I'm not sure why), but
> it enables better optimizations and/or many less peephole to write...
Are you talking about CC0? Don't use CC0 in a new port. It requires a
lot of special case code in the backend. That code is rarely tested
because very few ports still use CC0.
>> The second one can not.
>
> I did not test, but perhaps it can in my case?
How?
Ian