re PR middle-end/33187 (Missed cmove opportunity)

PR middle-end/33187
       * combine.c (subst): Do not try to simplify X if it represents load
       of FP constant from the constant pool via float extension.

testsuite/ChangeLog:

       PR middle-end/33187
       * gcc.target/i386/cmov7.c: New file.

From-SVN: r128072
This commit is contained in:
Uros Bizjak 2007-09-04 12:07:19 +02:00 committed by Uros Bizjak
parent 731c68a204
commit 95afbcac54
4 changed files with 38 additions and 0 deletions

View file

@ -1,3 +1,9 @@
2007-09-04 Uros Bizjak <ubizjak@gmail.com>
PR middle-end/33187
* combine.c (subst): Do not try to simplify X if it represents load
of FP constant from the constant pool via float extension.
2007-09-04 Ben Elliston <bje@au.ibm.com>
* c-opts.c: Include "tm_p.h".

View file

@ -4478,6 +4478,18 @@ subst (rtx x, rtx from, rtx to, int in_dest, int unique_copy)
}
}
/* Check if we are loading something from the constant pool via float
extension; in this case we would undo compress_float_constant
optimization and degenerate constant load to an immediate value. */
if (GET_CODE (x) == FLOAT_EXTEND
&& MEM_P (XEXP (x, 0))
&& MEM_READONLY_P (XEXP (x, 0)))
{
rtx tmp = avoid_constant_pool_reference (x);
if (x != tmp)
return x;
}
/* Try to simplify X. If the simplification changed the code, it is likely
that further simplification will help, so loop, but limit the number
of repetitions that will be performed. */

View file

@ -1,3 +1,8 @@
2007-09-04 Uros Bizjak <ubizjak@gmail.com>
PR middle-end/33187
* gcc.target/i386/cmov7.c: New file.
2007-09-04 Uros Bizjak <ubizjak@gmail.com>
* gcc.target/i386/sse4a-check.h: New file.

View file

@ -0,0 +1,15 @@
/* PR middle-end/33187 */
/* { dg-do compile } */
/* { dg-options "-O2 -march=k8 -ffast-math -mfpmath=387" } */
/* { dg-final { scan-assembler "fcmov" } } */
/* compress_float_constant generates load + float_extend
sequence which combine pass failed to combine into
(set (reg:DF) (float_extend:DF (mem:SF (symbol_ref...)))). */
double
sgn (double __x)
{
return __x >= 0.0 ? 1.0 : -1.0;
}