https://gcc.gnu.org/bugzilla/show_bug.cgi?id=116785
Richard Biener <rguenth at gcc dot gnu.org> changed:
What |Removed |Added
----------------------------------------------------------------------------
Assignee|unassigned at gcc dot gnu.org |rguenth at gcc dot
gnu.org
Status|UNCONFIRMED |ASSIGNED
Ever confirmed|0 |1
Last reconfirmed| |2024-09-27
--- Comment #11 from Richard Biener <rguenth at gcc dot gnu.org> ---
Note I have to use -fno-vect-cost-model on the reduced testcase to get
vectorization. There is indeed
[t.ii:27:12] # PT = anything
tBasis_65 = [t.ii:27:21] this_61(D)->m_Bt;
[t.ii:71:57] # PT = anything
_507 = Y_66 + _506;
derefaddrtmp(22) = &NULL
*ANYTHING = derefaddrtmp(22)
Likely the volatile
irep ={v} 0;
...
irep.1_36 = &ANYTHING
_37 = irep.1_36 + UNKNOWN
_37 = &NONLOCAL
*ANYTHING = _37
irep.3_38 = &ANYTHING
_39 = irep.3_38
because:
irep.1_36 ={v} irep;
_37 = irep.1_36 + 1;
irep ={v} _37;
well, a volatile read-modify-write. Not using volatile int for RepIndex_type
fixes it.
Note that the volatile handling was adjusted with r15-579-ga9251ab3c91c8c but
it didn't have the desired effect due to bugs fixed with the later changes.
Note that the handling of volatiles, esp. on the store side is a bit too
conservative. Can you try the following on the original benchmark?
diff --git a/gcc/tree-ssa-structalias.cc b/gcc/tree-ssa-structalias.cc
index d6a53f801f0..54c4818998d 100644
--- a/gcc/tree-ssa-structalias.cc
+++ b/gcc/tree-ssa-structalias.cc
@@ -3646,7 +3646,7 @@ get_constraint_for_1 (tree t, vec<ce_s> *results, bool
address_p,
}
case tcc_reference:
{
- if (TREE_THIS_VOLATILE (t))
+ if (!lhs_p && TREE_THIS_VOLATILE (t))
/* Fall back to anything. */
break;
@@ -3751,7 +3751,7 @@ get_constraint_for_1 (tree t, vec<ce_s> *results, bool
address_p,
}
case tcc_declaration:
{
- if (VAR_P (t) && TREE_THIS_VOLATILE (t))
+ if (!lhs_p && VAR_P (t) && TREE_THIS_VOLATILE (t))
/* Fall back to anything. */
break;
get_constraint_for_ssa_var (t, results, address_p);