[PATCH] Slightly improve TARGET_STV splitters (PR target/70321)

Uros Bizjak ubizjak@gmail.com
Wed Mar 23 08:35:00 GMT 2016


On Tue, Mar 22, 2016 at 10:37 PM, Jakub Jelinek <jakub@redhat.com> wrote:
> Hi!
>
> As the PR mentions, DImode AND/IOR/XOR patterns often result in too ugly
> code, regression from when the patterns weren't there (before STV has been
> added).  This patch attempts to improve it a little bit by improving the
> splitter for these, rather than always generating two SImode AND/IOR/XOR
> instructions, if the last operand's subword is either 0 or -1, optimize
> the corresponding instruction in the pair to nothing, or to clearing, or
> negation.  More improvement can be IMHO only achieved by moving the STV
> pass before combiner and split patterns we don't adjust into vector patterns
> into corresponding SImode patterns, so that the combiner can handle them,
> but that sounds like stage1 material.
>
> Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
>
> 2016-03-22  Jakub Jelinek  <jakub@redhat.com>
>
>         PR target/70321
>         * config/i386/i386.md (*anddi3_doubleword, *<code>di3_doubleword):
>         Optimize TARGET_STV splitters, if high or low word of last argument
>         is 0 or -1.

Looks reasonable and safe.

OK.

Thanks,
Uros.

> --- gcc/config/i386/i386.md.jj  2016-03-22 09:13:54.000000000 +0100
> +++ gcc/config/i386/i386.md     2016-03-22 18:45:16.392316554 +0100
> @@ -8141,16 +8141,31 @@
>          (match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
>          (match_operand:DI 2 "x86_64_szext_general_operand" "Z,re,rm")))
>     (clobber (reg:CC FLAGS_REG))]
> -  "!TARGET_64BIT && TARGET_STV && TARGET_SSE2 && ix86_binary_operator_ok (AND, DImode, operands)"
> +  "!TARGET_64BIT && TARGET_STV && TARGET_SSE2
> +   && ix86_binary_operator_ok (AND, DImode, operands)"
>    "#"
>    "&& reload_completed"
> -  [(parallel [(set (match_dup 0)
> -                  (and:SI (match_dup 1) (match_dup 2)))
> -             (clobber (reg:CC FLAGS_REG))])
> -   (parallel [(set (match_dup 3)
> -                  (and:SI (match_dup 4) (match_dup 5)))
> -             (clobber (reg:CC FLAGS_REG))])]
> -  "split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);")
> +  [(const_int 0)]
> +{
> +  split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);
> +  if (operands[2] == const0_rtx)
> +    {
> +      operands[1] = const0_rtx;
> +      ix86_expand_move (SImode, &operands[0]);
> +    }
> +  else if (operands[2] != constm1_rtx)
> +    emit_insn (gen_andsi3 (operands[0], operands[1], operands[2]));
> +  else if (operands[5] == constm1_rtx)
> +    emit_note (NOTE_INSN_DELETED);
> +  if (operands[5] == const0_rtx)
> +    {
> +      operands[4] = const0_rtx;
> +      ix86_expand_move (SImode, &operands[3]);
> +    }
> +  else if (operands[5] != constm1_rtx)
> +    emit_insn (gen_andsi3 (operands[3], operands[4], operands[5]));
> +  DONE;
> +})
>
>  (define_insn "*andsi_1"
>    [(set (match_operand:SI 0 "nonimmediate_operand" "=rm,r,Ya,!k")
> @@ -8665,16 +8680,41 @@
>          (match_operand:DI 1 "nonimmediate_operand" "%0,0,0")
>          (match_operand:DI 2 "x86_64_szext_general_operand" "Z,re,rm")))
>     (clobber (reg:CC FLAGS_REG))]
> -  "!TARGET_64BIT && TARGET_STV && TARGET_SSE2 && ix86_binary_operator_ok (<CODE>, DImode, operands)"
> +  "!TARGET_64BIT && TARGET_STV && TARGET_SSE2
> +   && ix86_binary_operator_ok (<CODE>, DImode, operands)"
>    "#"
>    "&& reload_completed"
> -  [(parallel [(set (match_dup 0)
> -                  (any_or:SI (match_dup 1) (match_dup 2)))
> -             (clobber (reg:CC FLAGS_REG))])
> -   (parallel [(set (match_dup 3)
> -                  (any_or:SI (match_dup 4) (match_dup 5)))
> -             (clobber (reg:CC FLAGS_REG))])]
> -  "split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);")
> +  [(const_int 0)]
> +{
> +  split_double_mode (DImode, &operands[0], 3, &operands[0], &operands[3]);
> +  if (operands[2] == constm1_rtx)
> +    {
> +      if (<CODE> == IOR)
> +       {
> +         operands[1] = constm1_rtx;
> +         ix86_expand_move (SImode, &operands[0]);
> +       }
> +      else
> +       ix86_expand_unary_operator (NOT, SImode, &operands[0]);
> +    }
> +  else if (operands[2] != const0_rtx)
> +    ix86_expand_binary_operator (<CODE>, SImode, &operands[0]);
> +  else if (operands[5] == const0_rtx)
> +    emit_note (NOTE_INSN_DELETED);
> +  if (operands[5] == constm1_rtx)
> +    {
> +      if (<CODE> == IOR)
> +       {
> +         operands[4] = constm1_rtx;
> +         ix86_expand_move (SImode, &operands[3]);
> +       }
> +      else
> +       ix86_expand_unary_operator (NOT, SImode, &operands[3]);
> +    }
> +  else if (operands[5] != const0_rtx)
> +    ix86_expand_binary_operator (<CODE>, SImode, &operands[3]);
> +  DONE;
> +})
>
>  (define_insn_and_split "*andndi3_doubleword"
>    [(set (match_operand:DI 0 "register_operand" "=r,r")
>
>         Jakub



More information about the Gcc-patches mailing list