https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119997
Bug ID: 119997
Summary: [13/14/15/16 Regression] PRE no longer hoists
&ptr->field
Product: gcc
Version: 15.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: rguenth at gcc dot gnu.org
Target Milestone: ---
Since r13-137-gee1cb43bc76de8 PRE no longer hoists the invariant address
computations in gcc.target/i386/pr109362.c:
struct S { long a, b; };
int
foo (struct S *v)
{
while (1)
{
__atomic_load_n (&v->a, __ATOMIC_ACQUIRE);
if (__atomic_load_n (&v->b, __ATOMIC_ACQUIRE))
return 1;
}
}
<bb 2> [local count: 118111600]:
<bb 3> [local count: 1073741824]:
_1 = &v_6(D)->a;
__atomic_load_8 (_1, 2);
_2 = &v_6(D)->b;
_3 = __atomic_load_8 (_2, 2);
if (_3 != 0)
goto <bb 4>; [11.00%]
else
goto <bb 5>; [89.00%]
<bb 5> [local count: 955630224]:
goto <bb 3>; [100.00%]
since PRE in compute_avail() relies on vn_reference_lookup_pieces to lookup
the address but that a) did not get the special-handling of such addresses
so we can't find the inserted expression, b) it relies on the vn_reference
instead of just wanting a value, but we internally handle it as vn_nary.