Flow crash for conditional branches against a constant

Richard Earnshaw Richard.Earnshaw@arm.com
Fri Jun 11 17:00:00 GMT 2004


On Fri, 2004-06-11 at 16:44, Daniel Jacobowitz wrote:
> I'm working on a port that has a branch instruction taking an unsigned
> immediate.  Something like this is valid:
> 
>   (set (pc) (if_then_else (ne (reg:SI 66) (const_int 1)))
>             (label_ref 1)
>             (pc))
> 
> But flow.c completely falls down on this construct.  For instance, that will
> cause not_reg_cond to abort because it is only prepared to handle comparison
> against 0.

That ought to work. It's exactly like the Thumb cbranch patterns in
arm.md

> 
> Flow also doesn't like this:
>   (set (pc) (if_then_else (ne (subreg:SI (reg:QI 66)) (const_int 1)))
>             (label_ref 1)
>             (pc))
> It uses REGNO on the first argument without checking for SUBREGs created by
> combine.
> 
> Both of these are pretty easy to fix.  But are other parts of the compiler
> going to misbehave also?  The relevant section of gccint hasn't been updated
> in a while; it claims that only (OP (cc0) (const_int 0)) is valid in
> if_then_else instructions, but this port doesn't use cc0.

Probably some legacy from the fact that flow used to be run only before
combine (IIRC).



More information about the Gcc mailing list