Hi!

On Fri, Dec 13, 2019 at 05:25:41PM +0100, Stefan Franke wrote:
> I suggest this patch to allow architectures do substitute cc0_rtx with a 
> generated cc register.
> 
> Why? If you are using a cc register plus your architecture as many 
> instructions which may clobber that cc register, some passes (e.g. gcse) 
> will reorder the insns. This can lead to the situation that an insn is 
> moved between a compare and it' consuming jump insn. Which yields 
> invalid code. (Note that at these stages clobbers are not yet tracked as 
> CLOBBER insns).

Then that port has a bug.  In the m68k port, there are no separate compare
and jump insns ever, but for most ports those won't yet exist during gcse.

This is not unique to cc0 conversions: every port has a similar problem
with all FIXED_REGISTERS.

> --- a/gcc/jump.c
> +++ b/gcc/jump.c
> @@ -1028,7 +1028,7 @@ sets_cc0_p (const_rtx x)
>    if (INSN_P (x))
>      x = PATTERN (x);
> 
> -  if (GET_CODE (x) == SET && SET_DEST (x) == cc0_rtx)
> +  if (GET_CODE (x) == SET && rtx_equal_p(SET_DEST (x), cc0_rtx))
>      return 1;

@findex cc0_rtx
There is only one expression object of code @code{cc0}; it is the
value of the variable @code{cc0_rtx}.  Any attempt to create an
expression of code @code{cc0} will return @code{cc0_rtx}.

There is a lot of code that depends on this property, you cannot break
it without fixing everything.


Segher

Reply via email to