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


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


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