Flow crash for conditional branches against a constant

Ian Lance Taylor ian@wasabisystems.com
Fri Jun 11 15:47:00 GMT 2004


Daniel Jacobowitz <drow@false.org> writes:

> 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.
> 
> 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.

Isn't there something a bit strange about that?  If reg 66 holds a
QImode value, can you really do an SImode compare?  How do you know
what is in the upper bits of the register?

Should you be defining PROMOTE_MODE?

Ian



More information about the Gcc mailing list