[PATCH] Add auto-resizing capability to irange's [PR109695]
Aldy Hernandez
aldyh@redhat.com
Mon May 15 18:14:04 GMT 2023
On 5/15/23 17:07, Aldy Hernandez wrote:
>
>
> On 5/15/23 12:42, Jakub Jelinek wrote:
>> On Mon, May 15, 2023 at 12:35:23PM +0200, Aldy Hernandez wrote:
>>> gcc/ChangeLog:
>>>
>>> PR tree-optimization/109695
>>> * value-range.cc (irange::operator=): Resize range.
>>> (irange::union_): Same.
>>> (irange::intersect): Same.
>>> (irange::invert): Same.
>>> (int_range_max): Default to 3 sub-ranges and resize as needed.
>>> * value-range.h (irange::maybe_resize): New.
>>> (~int_range): New.
>>> (int_range::int_range): Adjust for resizing.
>>> (int_range::operator=): Same.
>>
>> LGTM.
>>
>> One question is if we shouldn't do it for GCC13/GCC12 as well, perhaps
>> changing it to some larger number than 3 when the members aren't
>> wide_ints
>> in there but just trees. Sure, in 13/12 the problem is 10x less severe
>> than in current trunk, but still we have some cases where we run out of
>> stack because of it on some hosts.
>
> Sure, but that would require messing around with the gt_* GTY functions,
> and making sure we're allocating the trees from a sensible place, etc
> etc. I'm less confident in my ability to mess with GTY stuff this late
> in the game.
Hmmm, maybe backporting this isn't too bad. The only time we'd have a
chunk on the heap is for int_range_max, which will never live in GC
space. So I don't think we need to worry about GC at all.
Although, legacy mode in GCC13 does get in a the way a bit. Sigh.
And unrealted, but speaking of GC... we should remove all GTY markers
from vrange. It should never live in GC. That's why we have
vrange_storage for, and that is what we put in the tree_ssa_name.
/* Value range information. */
union ssa_name_info_type {
/* Range and aliasing info for pointers. */
struct GTY ((tag ("0"))) ptr_info_def *ptr_info;
/* Range info for everything else. */
struct GTY ((tag ("1"))) vrange_storage * range_info;
} GTY ((desc ("%1.typed.type ?" \
"!POINTER_TYPE_P (TREE_TYPE ((tree)&%1)) : 2"))) info;
That should have been the only use of range GC stuff, but alas another
one crept in... IPA:
struct GTY (()) ipa_jump_func
{
...
/* Information about value range, containing valid data only when
vr_known is
true. The pointed to structure is shared betweed different jump
functions. Use ipa_set_jfunc_vr to set this field. */
value_range *m_vr;
...
};
This means that we can't nuke int_range<N> and default to an always
resizable range just yet, because we'll end up with the value_range in
GC memory, and resizable part in the heap.
That m_vr pointer should be a pointer to vrange_storage. Meh...I'm
bumping against my IPA work yet again. I think it's time to start
dusting off those patches.
Aldy
More information about the Gcc-patches
mailing list