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 <[email protected]>
---
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