This is the mail archive of the gcc@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: Flow crash for conditional branches against a constant


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


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