diff mbox

Speed-up def_builtin_const (ix86_valid_target_attribute)

Message ID 550B3DDC.4030408@suse.cz
State New
Headers show

Commit Message

Martin Liška March 19, 2015, 9:21 p.m. UTC
On 03/13/2015 05:42 AM, Jan Hubicka wrote:
>> 2015-03-09  Martin Liska  <marxin.liska@gmail.com>
>>
>> 	* config/i386/i386.c (def_builtin): Collect union of all
>> 	possible masks.
>> 	(ix86_add_new_builtins): Do not iterate over all builtins
>> 	in cases that isa value has no intersection with possible masks
>> 	and(or) last passed value is equal to the provided.
>> ---
>>   gcc/config/i386/i386.c | 11 +++++++++++
>>   1 file changed, 11 insertions(+)
>>
>> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
>> index ab8f03a..5f180b6 100644
>> --- a/gcc/config/i386/i386.c
>> +++ b/gcc/config/i386/i386.c
>> @@ -30592,6 +30592,8 @@ struct builtin_isa {
>>
>>   static struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
>>
>> +/* Union of all masks that are part of builtin_isa structures.  */
>> +static HOST_WIDE_INT defined_isa_values = 0;
>>
>>   /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
>>      of which isa_flags to use in the ix86_builtins_isa array.  Stores the
>> @@ -30619,6 +30621,7 @@ def_builtin (HOST_WIDE_INT mask, const char *name,
>>     if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
>>       {
>>         ix86_builtins_isa[(int) code].isa = mask;
>> +      defined_isa_values |= mask;
>
> I think you can move this down to set_and_not_build_p set.  Please add also
> comment explaining the caching mehanism.

Hi.

Explanation of the patch is introduced.

>>
>>         mask &= ~OPTION_MASK_ISA_64BIT;
>>         if (mask == 0
>> @@ -30670,6 +30673,14 @@ def_builtin_const (HOST_WIDE_INT mask, const char *name,
>>   static void
>>   ix86_add_new_builtins (HOST_WIDE_INT isa)
>>   {
>> +  /* Last cached isa value.  */
>> +  static HOST_WIDE_INT last_tested_isa_value = 0;
>> +
>> +  if ((isa & defined_isa_values) == 0 || isa == last_tested_isa_value)
>
> Heer you need to compare (isa & defined_isa_values) == (isa &
> last_tested_isa_value) right, because we have isa flags that enable no
> builtins.

I do not understand why, the guard simply ignores last value, which is already processed and
'isa' with any intersection with defined_isa_values. Maybe I miss something?

Thanks,
Martin

>
> Honza
>

Comments

Jan Hubicka March 20, 2015, 12:10 a.m. UTC | #1
> Hi.
> 
> Explanation of the patch is introduced.

thanks
> 
> >>
> >>        mask &= ~OPTION_MASK_ISA_64BIT;
> >>        if (mask == 0
> >>@@ -30670,6 +30673,14 @@ def_builtin_const (HOST_WIDE_INT mask, const char *name,
> >>  static void
> >>  ix86_add_new_builtins (HOST_WIDE_INT isa)
> >>  {
> >>+  /* Last cached isa value.  */
> >>+  static HOST_WIDE_INT last_tested_isa_value = 0;
> >>+
> >>+  if ((isa & defined_isa_values) == 0 || isa == last_tested_isa_value)
> >
> >Heer you need to compare (isa & defined_isa_values) == (isa &
> >last_tested_isa_value) right, because we have isa flags that enable no
> >builtins.
> 
> I do not understand why, the guard simply ignores last value, which is already processed and
> 'isa' with any intersection with defined_isa_values. Maybe I miss something?

I think you can also skip processing in cases ISA changed but the change has empty intersection with
defined_isa_values.

Honza
diff mbox

Patch

From f40f0fa07d8a9643050c30cd4e29c8c4c8de6cce Mon Sep 17 00:00:00 2001
From: marxin <marxin.liska@gmail.com>
Date: Sun, 8 Mar 2015 19:39:55 -0500
Subject: [PATCH] def_builtin_const: speed-up.

gcc/ChangeLog:

2015-03-09  Martin Liska  <mliska@suse.cz>

	* config/i386/i386.c (def_builtin): Collect union of all
	possible masks.
	(ix86_add_new_builtins): Do not iterate over all builtins
	in cases that isa value has no intersection with possible masks
	and(or) last passed value is equal to the provided.
---
 gcc/config/i386/i386.c | 14 ++++++++++++++
 1 file changed, 14 insertions(+)

diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index ab8f03a..134b349 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -30592,6 +30592,8 @@  struct builtin_isa {
 
 static struct builtin_isa ix86_builtins_isa[(int) IX86_BUILTIN_MAX];
 
+/* Union of all masks that are part of builtin_isa structures.  */
+static HOST_WIDE_INT defined_isa_values = 0;
 
 /* Add an ix86 target builtin function with CODE, NAME and TYPE.  Save the MASK
    of which isa_flags to use in the ix86_builtins_isa array.  Stores the
@@ -30619,6 +30621,7 @@  def_builtin (HOST_WIDE_INT mask, const char *name,
   if (!(mask & OPTION_MASK_ISA_64BIT) || TARGET_64BIT)
     {
       ix86_builtins_isa[(int) code].isa = mask;
+      defined_isa_values |= mask;
 
       mask &= ~OPTION_MASK_ISA_64BIT;
       if (mask == 0
@@ -30670,6 +30673,17 @@  def_builtin_const (HOST_WIDE_INT mask, const char *name,
 static void
 ix86_add_new_builtins (HOST_WIDE_INT isa)
 {
+  /* Last cached isa value.  */
+  static HOST_WIDE_INT last_tested_isa_value = 0;
+
+  /* We iterate through all defined builtins just if the last tested
+     values is different from ISA and just in case there is any intersection
+     between ISA value and union of all possible configurations.  */
+  if ((isa & defined_isa_values) == 0 || isa == last_tested_isa_value)
+    return;
+
+  last_tested_isa_value = isa;
+
   int i;
   tree saved_current_target_pragma = current_target_pragma;
   current_target_pragma = NULL_TREE;
-- 
2.1.2