On Tue, Feb 21, 2017 at 7:52 PM, Uros Bizjak <ubiz...@gmail.com> wrote:
> Hello!
>
> Attached patch fixes oversight in standard_x87sse_constant_load
> splitter and its float-extend counterpart, where a FP reg-reg move
> insn RTX can be tagged with REG_EQUIV or REG_EQUAL const_double RTX.
>
> find_constant_src and ix86_standard_x87sse_constant_load_p predicate
> are able to handle this situation, and patched splitters emit direct
> constant load instead of a reg-reg move. This also lowers regstack
> register pressure, as evident from the testcase:
>
> --- pr79593.s_  2017-02-21 19:41:36.615740647 +0100
> +++ pr79593.s   2017-02-21 19:41:47.251622966 +0100
> @@ -15,21 +15,16 @@
>         fldz
>  .L2:
>         fld1
> -       fld     %st(0)
> -       fcomp   %st(2)
> +       fcomp   %st(1)
>         fnstsw  %ax
>         sahf
> -       jnb     .L5
> -       fstp    %st(1)
> -       jmp     .L3
> -       .p2align 4,,10
> -       .p2align 3
> -.L5:
> +       jnb     .L3
>         fstp    %st(0)
> +       fld1
>  .L3:
>         rep ret
>         .cfi_endproc
>  .LFE2:
>         .size   bar, .-bar
> -       .ident  "GCC: (GNU) 7.0.0 20170117 (experimental) [trunk
> revision 244540]"
> +       .ident  "GCC: (GNU) 7.0.1 20170221 (experimental) [trunk
> revision 245630]"
>         .section        .note.GNU-stack,"",@progbits
>
> Patched compiler also removed a jump to a BB where only compensating
> regstack pop was emitted.
>
> 2017-02-21  Uros Bizjak  <ubiz...@gmail.com>
>
>     PR target/79593
>     * config/i386/i386.md (standard_x87sse_constant_load splitter):
>     Use nonimmediate_operand instead of memory_operand for operand 1.
>     (float-extend standard_x87sse_constant_load splitter): Ditto.
>
> testsuite/ChangeLog:
>
> 2017-02-21  Uros Bizjak  <ubiz...@gmail.com>
>
>     PR target/79593
>     * gcc.target/i386/pr79593.c: New test.
>
> Patch was bootstrapped and regression tested on x86_64-linux-gnu {,-m32}.
>
> Committed to mainline SVN.

Now with a patch.

Uros.
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index cfbe0b0..23f2ea0 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -3660,7 +3660,7 @@
 
 (define_split
   [(set (match_operand 0 "any_fp_register_operand")
-       (match_operand 1 "memory_operand"))]
+       (match_operand 1 "nonimmediate_operand"))]
   "reload_completed
    && (GET_MODE (operands[0]) == TFmode
        || GET_MODE (operands[0]) == XFmode
@@ -3672,7 +3672,7 @@
 
 (define_split
   [(set (match_operand 0 "any_fp_register_operand")
-       (float_extend (match_operand 1 "memory_operand")))]
+       (float_extend (match_operand 1 "nonimmediate_operand")))]
   "reload_completed
    && (GET_MODE (operands[0]) == TFmode
        || GET_MODE (operands[0]) == XFmode
/* PR target/79593 */
/* { dg-do compile } */
/* { dg-options "-Ofast -mfpmath=387" } */

extern float global_data[1024];

static long double MIN (long double a, long double b) { return a < b ? a : b; }
static long double MAX (long double a, long double b) { return a > b ? a : b; }

float bar (void)
{
  long double delta = (global_data[0]);

  return (MIN (MAX (delta, 0.0l), 1.0l));
}

/* { dg-final { scan-assembler-not "fld\[ \t\]+%st" } } */

Reply via email to