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