This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: Flow crash for conditional branches against a constant
- From: Richard Earnshaw <Richard dot Earnshaw at arm dot com>
- To: Daniel Jacobowitz <drow at false dot org>
- Cc: gcc at gcc dot gnu dot org
- Date: Fri, 11 Jun 2004 18:00:15 +0100
- Subject: Re: Flow crash for conditional branches against a constant
- References: <20040611154452.GA26000@nevyn.them.org>
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).