https://gcc.gnu.org/bugzilla/show_bug.cgi?id=99473
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|NEW |ASSIGNED
--- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> ---
g3 and g1 behave differently also because of (there's a dup PR I can't find
right now) sinking happening in a way that the pass store-commoning code
doesn't trigger on the sunk store.
cselim doesn't trigger because
if ((TREE_CODE (lhs) != MEM_REF
&& TREE_CODE (lhs) != ARRAY_REF
&& TREE_CODE (lhs) != COMPONENT_REF)
|| !is_gimple_reg_type (TREE_TYPE (lhs)))
return false;
lhs is a VAR_DECL and 'nontrap' only tracks pointers. There's code to actually
handle auto-vars now but the above still disallows bare decls. Because
we have the address-taken the transform will also require
-fallow-store-data-races.
diff --git a/gcc/tree-ssa-phiopt.c b/gcc/tree-ssa-phiopt.c
index ddd9d531b13..6f7efa29a1b 100644
--- a/gcc/tree-ssa-phiopt.c
+++ b/gcc/tree-ssa-phiopt.c
@@ -2490,9 +2490,8 @@ cond_store_replacement (basic_block middle_bb,
basic_block join_bb,
locus = gimple_location (assign);
lhs = gimple_assign_lhs (assign);
rhs = gimple_assign_rhs1 (assign);
- if ((TREE_CODE (lhs) != MEM_REF
- && TREE_CODE (lhs) != ARRAY_REF
- && TREE_CODE (lhs) != COMPONENT_REF)
+ if ((!REFERENCE_CLASS_P (lhs)
+ && !DECL_P (lhs))
|| !is_gimple_reg_type (TREE_TYPE (lhs)))
return false;
fixes g3 this (with -fallow-store-data-races). Queued for GCC 12.
g2 needs sinking/commoning of f (&x) for which there's yet another PR I think.