[PATCH] Improve -Ofast vectorization of std::sin etc. (PR libstdc++/81706)

Jonathan Wakely jwakely@redhat.com
Mon Aug 7 20:59:00 GMT 2017


On 07/08/17 17:27 +0200, Jakub Jelinek wrote:
>On Mon, Aug 07, 2017 at 10:54:18AM -0400, Jason Merrill wrote:
>> On 08/07/2017 05:08 AM, Jakub Jelinek wrote:
>> > +		  tree s = lookup_attribute ("omp declare simd",
>> > +					     DECL_ATTRIBUTES (newdecl));
>> > +		  if (s)
>> > +		    {
>> > +		      tree b
>> > +			= builtin_decl_explicit (DECL_FUNCTION_CODE (newdecl));
>> > +		      if (b)
>> > +			{
>> > +			  tree s2 = lookup_attribute ("omp declare simd",
>> > +						      DECL_ATTRIBUTES (b));
>> > +			  while (s)
>> > +			    {
>> > +			      tree s3;
>> > +			      for (s3 = s2; s3;
>> > +				   s3 = lookup_attribute ("omp declare simd",
>> > +							  TREE_CHAIN (s3)))
>> > +				if (attribute_value_equal (s, s3))
>> > +				  break;
>> > +			      if (!s3)
>> > +				{
>> > +				  s3 = copy_node (s);
>> > +				  TREE_CHAIN (s3) = DECL_ATTRIBUTES (b);
>> > +				  DECL_ATTRIBUTES (b) = s3;
>> > +				}
>> > +			      s = lookup_attribute ("omp declare simd",
>> > +						    TREE_CHAIN (s));
>> > +			    }
>> > +			}
>> > +		    }
>>
>> This should really be a separate function.  Perhaps "merge_one_attribute"?
>
>If it is outlined without the first 7 lines, i.e. just the body of if (b),
>then it could be duplicate_one_attribute (tree *, tree, const char *);
>called like if (b) duplicate_one_attribute (&DECL_ATTRIBUTES (b), s, "omp declare simd");
>If it is duplicated as whole, it should be called
>duplicate_one_attr_to_builtin or something similar.
>In any case, it could be in tree.c or attribs.c.
>
>The primary question is if we want this behavior, or if we should go the
>libstdc++ patch routine (and for Jonathan the question is if he knows
>why __builtin_XXXf has been used there rather than the ::XXXf).

I don't know for certain, but I suspect it's because sinf, cosf, powf
etc. were new in C99, so a strict libc might not declare them in C++98
mode.

By using __builtin_sinf we don't need a declaration of sinf, we only
require the definition to exist in libc or libm. If the function is
present, but not declared for C++98, then it works.




More information about the Libstdc++ mailing list