Commit 0fbdb0c0 by Richard Biener Committed by Richard Biener

re PR tree-optimization/91178 (Infinite recursion in split_constant_offset in slp after r260289)

2019-07-31  Richard Biener  <rguenther@suse.de>

	PR tree-optimization/91178
	* tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address):
	Use tail-recursion.

	* gcc.dg/torture/pr91178-2.c: New testcase.

From-SVN: r273928
parent 1104467f
2019-07-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/91178
* tree-ssa-sccvn.c (vn_reference_maybe_forwprop_address):
Use tail-recursion.
2019-07-31 Jakub Jelinek <jakub@redhat.com> 2019-07-31 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/91201 PR tree-optimization/91201
......
2019-07-31 Richard Biener <rguenther@suse.de>
PR tree-optimization/91178
* gcc.dg/torture/pr91178-2.c: New testcase.
2019-07-31 Jakub Jelinek <jakub@redhat.com> 2019-07-31 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/91201 PR tree-optimization/91201
......
/* { dg-do compile } */
int a[100][70304];
int b[100];
void c()
{
for (int d = 2; d < 4; d++)
for (int e = 2; e <= 50; e++)
for (int f = 32; f <= 38; f++)
b[d + f] -= a[e][5];
}
...@@ -1249,8 +1249,13 @@ static bool ...@@ -1249,8 +1249,13 @@ static bool
vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops, vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
unsigned int *i_p) unsigned int *i_p)
{ {
bool changed = false;
vn_reference_op_t op;
do
{
unsigned int i = *i_p; unsigned int i = *i_p;
vn_reference_op_t op = &(*ops)[i]; op = &(*ops)[i];
vn_reference_op_t mem_op = &(*ops)[i - 1]; vn_reference_op_t mem_op = &(*ops)[i - 1];
gimple *def_stmt; gimple *def_stmt;
enum tree_code code; enum tree_code code;
...@@ -1258,12 +1263,12 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops, ...@@ -1258,12 +1263,12 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
def_stmt = SSA_NAME_DEF_STMT (op->op0); def_stmt = SSA_NAME_DEF_STMT (op->op0);
if (!is_gimple_assign (def_stmt)) if (!is_gimple_assign (def_stmt))
return false; return changed;
code = gimple_assign_rhs_code (def_stmt); code = gimple_assign_rhs_code (def_stmt);
if (code != ADDR_EXPR if (code != ADDR_EXPR
&& code != POINTER_PLUS_EXPR) && code != POINTER_PLUS_EXPR)
return false; return changed;
off = poly_offset_int::from (wi::to_poly_wide (mem_op->op0), SIGNED); off = poly_offset_int::from (wi::to_poly_wide (mem_op->op0), SIGNED);
...@@ -1313,8 +1318,9 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops, ...@@ -1313,8 +1318,9 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
if (!addr_base if (!addr_base
|| TREE_CODE (addr_base) != MEM_REF || TREE_CODE (addr_base) != MEM_REF
|| (TREE_CODE (TREE_OPERAND (addr_base, 0)) == SSA_NAME || (TREE_CODE (TREE_OPERAND (addr_base, 0)) == SSA_NAME
&& SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (addr_base, 0)))) && SSA_NAME_OCCURS_IN_ABNORMAL_PHI (TREE_OPERAND (addr_base,
return false; 0))))
return changed;
off += addr_offset; off += addr_offset;
off += mem_ref_offset (addr_base); off += mem_ref_offset (addr_base);
...@@ -1332,7 +1338,7 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops, ...@@ -1332,7 +1338,7 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
happen when we value-number a PHI to its backedge value. */ happen when we value-number a PHI to its backedge value. */
|| SSA_VAL (ptr) == op->op0 || SSA_VAL (ptr) == op->op0
|| !poly_int_tree_p (ptroff)) || !poly_int_tree_p (ptroff))
return false; return changed;
off += wi::to_poly_offset (ptroff); off += wi::to_poly_offset (ptroff);
op->op0 = ptr; op->op0 = ptr;
...@@ -1350,12 +1356,16 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops, ...@@ -1350,12 +1356,16 @@ vn_reference_maybe_forwprop_address (vec<vn_reference_op_s> *ops,
if (TREE_CODE (op->op0) != SSA_NAME) if (TREE_CODE (op->op0) != SSA_NAME)
op->opcode = TREE_CODE (op->op0); op->opcode = TREE_CODE (op->op0);
/* And recurse. */ changed = true;
if (TREE_CODE (op->op0) == SSA_NAME) }
vn_reference_maybe_forwprop_address (ops, i_p); /* Tail-recurse. */
else if (TREE_CODE (op->op0) == ADDR_EXPR) while (TREE_CODE (op->op0) == SSA_NAME);
/* Fold a remaining *&. */
if (TREE_CODE (op->op0) == ADDR_EXPR)
vn_reference_fold_indirect (ops, i_p); vn_reference_fold_indirect (ops, i_p);
return true;
return changed;
} }
/* Optimize the reference REF to a constant if possible or return /* Optimize the reference REF to a constant if possible or return
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment