This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
Re: [patch] speed up ifcvt:cond_move_convert_if_block
Il 06/08/2012 13:15, Steven Bosscher ha scritto:
> On Mon, Aug 6, 2012 at 1:07 PM, Paolo Bonzini <bonzini@gnu.org> wrote:
>> Il 06/08/2012 08:54, Steven Bosscher ha scritto:
>>> Hello,
>>>
>>> In PR54146, ifcvt spends a lot of time just clearing memory. This
>>> patch changes the value maps to pointer-maps to fix this issue.
>>>
>>> Bootstrapped&tested on x86_64-unknown-linux-gnu. OK?
>>
>> Nice, but perhaps we need a sparsemap to do even better?
>
> If you mean sparseset: no, it won't do any better.
No, I mean "inventing" a sparseset that cannot do boolean operations,
but can store an associative value in a second dense array. That is
sparsemap_insert(m, k, v)
{
if (!sparsemap_contains(m, k)) {
s->sparse[k] = s->members++;
s->dense_keys[i] = k;
}
i = s->sparse[k];
s->dense_values[i] = v;
}
sparsemap_contains(m, k)
{
if (!sparsemap_contains(m, k)) {
return -1;
} else {
return s->dense_values[i];
}
> My first idea was to use a sparseset, but:
>
> 1. The amount of memory allocated is simply too big. In fact, it'd be
> even worse than before: 4*max_regno*sizeof(rtx) instead of "only"
> 2*max_regno*sizeof(rtx).
Yeah, sparseset wastes some memory. I wonder if the dense array should
be allocated separately and even made dynamically resizable, also because...
> 2. sparseset has the same problem of memory clearing (for valgrind,
> see sparseset_alloc).
... only the sparse array needs this clearing, but currently we do it
for both.
> What could work, is to allocate a sparseset once at the beginning of
> if_convert, but I don't see any good reason to add a pair of global
> variables for this.
Yes, this is what I meant. Fast clearing is where sparsesets behave
well, so it makes sense to make them global in that case. What I missed
was that the maps remain small. Otherwise they would also need clearing.
Paolo