https://gcc.gnu.org/bugzilla/show_bug.cgi?id=109967

Davin McCall <davmac at davmac dot org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |davmac at davmac dot org

--- Comment #3 from Davin McCall <davmac at davmac dot org> ---
-fdisable-tree-cunroll avoids it.

This is the take of someone who is new to poking GCC internals, so take this
with a grain of salt, but:

It looks like cunroll duplicates (partially unrolls, I suppose) the inner loop,
meaning that `g' is live in two disjoint ranges, with a CLOBBER between them.

Then later passes (fre5, but disabling it doesn't seem to help) recognise that
&g and &g are the same in both ranges and so use a single temporary for both.
This confuses cfgexpand (as Andrew Pinski notes) because the memory dereference
of the temporary isn't seen as an access of g (in
add_scope_conflicts()/add_scope_conflicts_1()/visit_conflict()). 

I don't understand the IR semantics well enough to know the right fix - perhaps
cunroll should be removing the clobber (does a clobber affect storage lifetime
or only value?), or perhaps cfgexpand should be more conservative when it sees
a memory access.

Reply via email to