Cache reals for 1/4, 1/6 and 1/9

Bernd Schmidt bschmidt@redhat.com
Mon Oct 5 15:31:00 GMT 2015


On 10/05/2015 05:22 PM, Richard Sandiford wrote:
> Bernd Schmidt <bschmidt@redhat.com> writes:
>> On 10/05/2015 04:47 PM, Richard Sandiford wrote:
>>> @@ -9536,7 +9520,7 @@ fold_builtin_classify (location_t loc, tree fndecl, tree arg, int builtin_index)
>>>    	{
>>>    	  r = TREE_REAL_CST (arg);
>>>    	  if (real_isinf (&r))
>>> -	    return real_compare (GT_EXPR, &r, &dconst0)
>>> +	    return real_compare (GT_EXPR, &r, &dconst<0> ())
>>>    		   ? integer_one_node : integer_minus_one_node;
>>>    	  else
>>>    	    return integer_zero_node;
>>
>> So... are the templates magic enough not to make us create a new
>> temporary every time this is used?
>
> Yeah, the static variables become comdat objects keyed off the full name
> (dconst<...>::value).  They're shared between calls and between TUs.

Hmm. And since you're returning a reference, taking the address works. 
The whole thing is subtle enough that it deserves a comment. Since this 
kind of thing is something I don't like about C++ (simple-looking code 
expanding into non-obvious behaviour) I'm not going to ack this patch, 
but if someone else wants to, that's fine.

I do believe you still have some code growth since the inline dconst 
function always expands code that will initialize the constant. IMO 
that's not desirable.


Bernd



More information about the Gcc-patches mailing list