RFA: patch to fix a bad code generation for PR64110 -- new constraints addition

Jeff Law law@redhat.com
Thu Jan 15 05:06:00 GMT 2015


On 01/14/15 16:52, Vladimir Makarov wrote:
>    The problem of unexpected code generation is discussed on
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=64110
>
>    The following patch introduces 2 new constraints '^' and '$'  which
> are analogous to '?' and '!' but disfavor given alternative when *the
> operand with the new constraint* needs a reload ('?' and '!' disfavor
> the alternative if *any* operand needs a reload).  I hope the new
> constraints will be useful for other insns and targets.
Right.  This gives us finer grained control over when to disparage an 
alternative.

Reloading some of the operands in an alternative may not be a big deal, 
but there may be other operands in the alternative that if a reload was 
needed for that operand would be so bad that we'd want to reject the 
entire alternative.

The example I had in mind when I read Vlad's analysis in the BZ were the 
old movb and addb patterns on the PA.  Basically we have some side 
effect like addition/subtraction/register copy along with a conditional 
jump.

(define_insn ""
   [(set (pc)
         (if_then_else
           (match_operator 2 "movb_comparison_operator"
            [(match_operand:SI 1 "register_operand" "r,r,r,r") 
(const_int 0)])
           (label_ref (match_operand 3 "" ""))
           (pc)))
    (set (match_operand:SI 0 "reg_before_reload_operand" "=!r,!*f,*Q,!*q")
         (match_dup 1))]

Needing a reload for operand 1 really isn't a big deal here, but 
reloading operand 0 is a disaster.  This would be a good place to use 
the new constraint modifiers.

I can distinctly recall running into similar issues on other ports 
through the years.  I wouldn't be at all surprised if a notable 
percentage of the "!" and "?"s that appear in our machine descriptions 
would be better off as "^" and "$".


>
> 2015-01-14  Vladimir Makarov <vmakarov@redhat.com>
>
>          PR rtl-optimization/64110
>          * stmt.c (parse_output_constraint): Process '^' and '$'.
>          (parse_input_constraint): Ditto.
>          * lra-constraints.c (process_alt_operands): Process the new
>          constraints.
>          * ira-costs.c (record_reg_classes): Process the new constraint
>          '^'.
>          * genoutput.c (indep_constraints): Add '^' and '$'.
>          * config/i386/sse.md (*vec_dup<mode>): Use '$' instead of '!'.
>          * doc/md.texi: Add description of the new constraints.
>
> 2015-01-14  Vladimir Makarov <vmakarov@redhat.com>
>
>          PR rtl-optimization/64110
>          * gcc.target/i386/pr64110.c: Add scan-assembler.
>
>
> pr64110-3.patch
>
>
> Index: config/i386/sse.md
> ===================================================================
> --- config/i386/sse.md	(revision 219262)
> +++ config/i386/sse.md	(working copy)
> @@ -16713,7 +16713,7 @@
>   (define_insn "*vec_dup<mode>"
>     [(set (match_operand:AVX2_VEC_DUP_MODE 0 "register_operand" "=x,x,x")
>   	(vec_duplicate:AVX2_VEC_DUP_MODE
> -	  (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "m,x,!r")))]
> +	  (match_operand:<ssescalarmode> 1 "nonimmediate_operand" "m,x,$r")))]
>     "TARGET_AVX2"
>     "@
>      v<sseintprefix>broadcast<bcstscalarsuff>\t{%1, %0|%0, %1}
> Index: doc/md.texi
> ===================================================================
> --- doc/md.texi	(revision 219262)
> +++ doc/md.texi	(working copy)
> @@ -1503,6 +1503,18 @@ in it.
>   Disparage severely the alternative that the @samp{!} appears in.
>   This alternative can still be used if it fits without reloading,
>   but if reloading is needed, some other alternative will be used.
> +
> +@cindex @samp{^} in constraint
> +@cindex caret
> +@item ^
> +This constraint is analogous to @samp{?} but it disparages slightly
> +the alternative only unless the corresponding operand applies exactly.
> +
> +@cindex @samp{$} in constraint
> +@cindex dollar sign
> +@item $
> +This constraint is analogous to @samp{!} but it disparages severely
> +the alternative only unless the corresponding operand applies exactly.
>   @end table
I found these hard to parse.

This disparages severely the alternative if the operand with the 
@samp{$} needs a reload.

Seems clearer to me.

With the doc update this is good for the trunk.

Jeff



More information about the Gcc-patches mailing list