diff mbox

[5/5] Use preferred_for_speed in i386.md

Message ID 87mw8uagqk.fsf@e105548-lin.cambridge.arm.com
State New
Headers show

Commit Message

Richard Sandiford Oct. 17, 2014, 2:54 p.m. UTC
Undo the original fix for 61630 and use preferred_for_speed in the
problematic pattern.

I've not written many gcc.target/i386 tests so the markup might need
some work.

Richard


gcc/
	* lra.c (lra): Remove call to recog_init.
	* config/i386/i386.md (preferred_for_speed): New attribute
	(*float<SWI48:mode><MODEF:mode>2_sse): Override it instead of
	"enabled".

gcc/testsuite/
	* gcc.target/i386/conversion-2.c: New test.

Comments

Uros Bizjak Oct. 17, 2014, 4:45 p.m. UTC | #1
On Fri, Oct 17, 2014 at 4:54 PM, Richard Sandiford
<richard.sandiford@arm.com> wrote:
> Undo the original fix for 61630 and use preferred_for_speed in the
> problematic pattern.
>
> I've not written many gcc.target/i386 tests so the markup might need
> some work.
>
> Richard
>
>
> gcc/
>         * lra.c (lra): Remove call to recog_init.
>         * config/i386/i386.md (preferred_for_speed): New attribute
>         (*float<SWI48:mode><MODEF:mode>2_sse): Override it instead of
>         "enabled".
>
> gcc/testsuite/
>         * gcc.target/i386/conversion-2.c: New test.

Please use the attached testcase that is also compatible with 32bit
compiles (and removes unnecessary comments in the asm). Please also
mention the revert  in ChangeLog.

OK for x86 part with these changes.

Thanks,
Uros.
Vladimir Makarov Oct. 21, 2014, 2:57 p.m. UTC | #2
On 10/17/2014 10:54 AM, Richard Sandiford wrote:
> Undo the original fix for 61630 and use preferred_for_speed in the
> problematic pattern.
>
> I've not written many gcc.target/i386 tests so the markup might need
> some work.

Final lra.c change is ok for me too.
>
>
> gcc/
> 	* lra.c (lra): Remove call to recog_init.
> 	* config/i386/i386.md (preferred_for_speed): New attribute
> 	(*float<SWI48:mode><MODEF:mode>2_sse): Override it instead of
> 	"enabled".
>
> gcc/testsuite/
> 	* gcc.target/i386/conversion-2.c: New test.
>
>
diff mbox

Patch

Index: gcc/lra.c
===================================================================
--- gcc/lra.c	2014-10-17 15:47:34.357453465 +0100
+++ gcc/lra.c	2014-10-17 15:53:10.889463339 +0100
@@ -2116,11 +2116,6 @@  lra (FILE *f)
 
   lra_in_progress = 1;
 
-  /* The enable attributes can change their values as LRA starts
-     although it is a bad practice.  To prevent reuse of the outdated
-     values, clear them.  */
-  recog_init ();
-
   lra_live_range_iter = lra_coalesce_iter = 0;
   lra_constraint_iter = lra_constraint_iter_after_spill = 0;
   lra_inheritance_iter = lra_undo_inheritance_iter = 0;
Index: gcc/config/i386/i386.md
===================================================================
--- gcc/config/i386/i386.md	2014-10-01 10:48:51.079918153 +0100
+++ gcc/config/i386/i386.md	2014-10-17 15:53:10.889463339 +0100
@@ -779,6 +779,8 @@  (define_attr "enabled" ""
 	]
 	(const_int 1)))
 
+(define_attr "preferred_for_speed" "" (const_int 1))
+
 ;; Describe a user's asm statement.
 (define_asm_attributes
   [(set_attr "length" "128")
@@ -4794,16 +4796,12 @@  (define_insn "*float<SWI48:mode><MODEF:m
               (symbol_ref "TARGET_MIX_SSE_I387
                            && X87_ENABLE_FLOAT (<MODEF:MODE>mode,
                                                 <SWI48:MODE>mode)")
-            (eq_attr "alternative" "1")
-              /* ??? For sched1 we need constrain_operands to be able to
-                 select an alternative.  Leave this enabled before RA.  */
-              (symbol_ref "TARGET_INTER_UNIT_CONVERSIONS
-                           || optimize_function_for_size_p (cfun)
-                           || !(reload_completed
-                                || reload_in_progress
-                                || lra_in_progress)")
            ]
            (symbol_ref "true")))
+   (set (attr "preferred_for_speed")
+     (cond [(eq_attr "alternative" "1")
+              (symbol_ref "TARGET_INTER_UNIT_CONVERSIONS")]
+           (symbol_ref "true")))
    ])
 
 (define_insn "*float<SWI48x:mode><MODEF:mode>2_i387"
Index: gcc/testsuite/gcc.target/i386/conversion-2.c
===================================================================
--- /dev/null	2014-10-06 08:13:11.214126005 +0100
+++ gcc/testsuite/gcc.target/i386/conversion-2.c	2014-10-17 15:53:10.893463291 +0100
@@ -0,0 +1,35 @@ 
+/* { dg-options "-O2 -fno-toplevel-reorder -mfpmath=sse" } */
+/* { dg-require-effective-target lp64 } */
+
+void __attribute__ ((hot, target ("tune=bdver2")))
+f1 (int x)
+{
+  register float f asm ("%xmm0") = x;
+  asm volatile ("#f" :: "x" (f));
+}
+
+void __attribute__ ((cold, target ("tune=bdver2")))
+f2 (int x)
+{
+  register float f asm ("%xmm1") = x;
+  asm volatile ("#f" :: "x" (f));
+}
+
+void __attribute__ ((hot, target ("tune=bdver2")))
+f3 (int x)
+{
+  register float f asm ("%xmm2") = x;
+  asm volatile ("#f" :: "x" (f));
+}
+
+void __attribute__ ((cold, target ("tune=bdver2")))
+f4 (int x)
+{
+  register float f asm ("%xmm3") = x;
+  asm volatile ("#f" :: "x" (f));
+}
+
+/* { dg-final { scan-assembler "sp\\\), %xmm0" } } */
+/* { dg-final { scan-assembler "di, %xmm1" } } */
+/* { dg-final { scan-assembler "sp\\\), %xmm2" } } */
+/* { dg-final { scan-assembler "di, %xmm3" } } */