After fixing loop-im to do the correct overflow rewriting for pointer types too. We end up with code like: ``` _9 = (unsigned long) &g; _84 = _9 + 18446744073709551615; _11 = _42 + _84; _44 = (signed char *) _11; ... *_44 = 10; g ={v} {CLOBBER(eos)}; ... n[0] = &f; *_44 = 8; g ={v} {CLOBBER(eos)}; ``` Which was not being recongized by the scope conflicts code. This was because it only handled one level walk backs rather than multiple ones. This fixes it by using a work_list to avoid huge recursion and a visited bitmape to avoid going into an infinite loops when dealing with loops.
Bootstrapped and tested on x86_64-linux-gnu. PR tree-optimization/111422 gcc/ChangeLog: * cfgexpand.cc (add_scope_conflicts_2): Rewrite to be a full walk of all operands and their uses. Signed-off-by: Andrew Pinski <quic_apin...@quicinc.com> --- gcc/cfgexpand.cc | 46 +++++++++++++++++++++++++++------------------- 1 file changed, 27 insertions(+), 19 deletions(-) diff --git a/gcc/cfgexpand.cc b/gcc/cfgexpand.cc index 6c1096363af..2e653d7207c 100644 --- a/gcc/cfgexpand.cc +++ b/gcc/cfgexpand.cc @@ -573,32 +573,40 @@ visit_conflict (gimple *, tree op, tree, void *data) /* Helper function for add_scope_conflicts_1. For USE on a stmt, if it is a SSA_NAME and in its SSA_NAME_DEF_STMT is known to be - based on some ADDR_EXPR, invoke VISIT on that ADDR_EXPR. */ + based on some ADDR_EXPR, invoke VISIT on that ADDR_EXPR. Also walk + the assignments backwards as they might be based on an ADDR_EXPR. */ -static inline void +static void add_scope_conflicts_2 (tree use, bitmap work, walk_stmt_load_store_addr_fn visit) { - if (TREE_CODE (use) == SSA_NAME - && (POINTER_TYPE_P (TREE_TYPE (use)) - || INTEGRAL_TYPE_P (TREE_TYPE (use)))) + auto_vec<tree, 4> work_list; + auto_bitmap visited_ssa_names; + work_list.safe_push (use); + + while (!work_list.is_empty()) { - gimple *g = SSA_NAME_DEF_STMT (use); - if (gassign *a = dyn_cast <gassign *> (g)) + use = work_list.pop(); + if (!use) + continue; + if (TREE_CODE (use) == ADDR_EXPR) + visit (nullptr, TREE_OPERAND (use, 0), use, work); + else if (TREE_CODE (use) == SSA_NAME + && (POINTER_TYPE_P (TREE_TYPE (use)) + || INTEGRAL_TYPE_P (TREE_TYPE (use)))) { - if (tree op = gimple_assign_rhs1 (a)) - if (TREE_CODE (op) == ADDR_EXPR) - visit (a, TREE_OPERAND (op, 0), op, work); + gimple *g = SSA_NAME_DEF_STMT (use); + if (!bitmap_set_bit (visited_ssa_names, SSA_NAME_VERSION(use))) + continue; + if (gassign *a = dyn_cast <gassign *> (g)) + { + for (unsigned i = 1; i < gimple_num_ops (g); i++) + work_list.safe_push (gimple_op (a, i)); + } + else if (gphi *p = dyn_cast <gphi *> (g)) + for (unsigned i = 0; i < gimple_phi_num_args (p); ++i) + work_list.safe_push (gimple_phi_arg_def (p, i)); } - else if (gphi *p = dyn_cast <gphi *> (g)) - for (unsigned i = 0; i < gimple_phi_num_args (p); ++i) - if (TREE_CODE (use = gimple_phi_arg_def (p, i)) == SSA_NAME) - if (gassign *a = dyn_cast <gassign *> (SSA_NAME_DEF_STMT (use))) - { - if (tree op = gimple_assign_rhs1 (a)) - if (TREE_CODE (op) == ADDR_EXPR) - visit (a, TREE_OPERAND (op, 0), op, work); - } } } -- 2.34.1