From 95afbcac54236d4704a84d2c0fff4dd63005d30c Mon Sep 17 00:00:00 2001 From: Uros Bizjak Date: Tue, 4 Sep 2007 12:07:19 +0200 Subject: [PATCH] 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 --- gcc/ChangeLog | 6 ++++++ gcc/combine.c | 12 ++++++++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.target/i386/cmov7.c | 15 +++++++++++++++ 4 files changed, 38 insertions(+) create mode 100644 gcc/testsuite/gcc.target/i386/cmov7.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 630a118ae98..e3c0ea4a826 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2007-09-04 Uros Bizjak + + 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 * c-opts.c: Include "tm_p.h". diff --git a/gcc/combine.c b/gcc/combine.c index c794e11857f..b2bc7806f7b 100644 --- a/gcc/combine.c +++ b/gcc/combine.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 465aaa29b6f..1db7371f602 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2007-09-04 Uros Bizjak + + PR middle-end/33187 + * gcc.target/i386/cmov7.c: New file. + 2007-09-04 Uros Bizjak * gcc.target/i386/sse4a-check.h: New file. diff --git a/gcc/testsuite/gcc.target/i386/cmov7.c b/gcc/testsuite/gcc.target/i386/cmov7.c new file mode 100644 index 00000000000..b5d50d7cbcf --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/cmov7.c @@ -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; +} -- 2.30.2