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" } } */