On Wed, Aug 26, 2015 at 08:40:49AM +0930, Alan Modra wrote:
> On Tue, Aug 25, 2015 at 10:08:54AM -0700, Segher Boessenkool wrote:
> > -(define_insn_and_split "*and<mode>3_imm_dot_shifted"
> > -  [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y")
> > +(define_insn "*and<mode>3_imm_dot_shifted"
> > +  [(set (match_operand:CC 3 "cc_reg_operand" "=x")
> 
> Is this really the best solution?  The operand predicate allows any
> cr, but the constraint only cr0.  In the past we've seen this sort of
> thing result in "insn does not satisfy its constraints" errors,

I don't think that can happen here.  It is the same situation as
gpc_reg_operand with a "b" constraint.

> and if
> the operand is successfully reloaded you'll get slow mcrf insns.

What is slow about those?  It's not mfcr :-)

Also note that prior compilers (at least as far back as 4.7) generated
it here, too (at -O2 etc. even).

>  At
> -O1 the testcase generates:
> 
>         andi. 8,3,0x16
>         mcrf 4,0
> 
> I started throwing together a patch yesterday, before you claimed the
> bug.  With this patch, I see what looks to be better code despite it
> being larger:
> 
>         li 9,22
>         and 9,3,9
>         cmpdi 4,9,0

The alternative that I was trying to avoid is

        andi. 8,3,0x16
        cmpdi 4,8,0

which doesn't have such a long dependency chain.

> diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md
> index 87abd6e..a9eea80 100644
> --- a/gcc/config/rs6000/rs6000.md
> +++ b/gcc/config/rs6000/rs6000.md
> @@ -3060,17 +3060,18 @@
>      return "#";
>  }
>    "&& reload_completed && cc_reg_not_cr0_operand (operands[3], CCmode)"
> -  [(set (match_dup 0)
> -     (and:GPR (lshiftrt:GPR (match_dup 1)
> -                            (match_dup 4))
> -              (match_dup 2)))
> +  [(set (match_dup 0) (match_dup 2))

This won't work for 0xa000 etc.

> +   (set (match_dup 0) (and:GPR (match_dup 1) (match_dup 0)))
>     (set (match_dup 3)
>       (compare:CC (match_dup 0)
>                   (const_int 0)))]
> -  ""
> +  "
> +{
> +  operands[2] = GEN_INT (UINTVAL (operands[2]) << INTVAL (operands[4]));
> +}"
>    [(set_attr "type" "logical")
>     (set_attr "dot" "yes")
> -   (set_attr "length" "4,8")])
> +   (set_attr "length" "4,12")])


Segher

Reply via email to