Commit 5d476e35 by Kugan Vivekanandarajah Committed by Kugan Vivekanandarajah

re PR middle-end/71269 (segfault while compiling sqlite)

gcc/testsuite/ChangeLog:

2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>

	PR middle-end/71269
	PR middle-end/71292
	* gcc.dg/tree-ssa/pr71269.c: New test.
	* gcc.dg/tree-ssa/pr71292.c: New test.

gcc/ChangeLog:

2016-05-30  Kugan Vivekanandarajah  <kuganv@linaro.org>

	PR middle-end/71269
	PR middle-end/71252
	* tree-ssa-reassoc.c (insert_stmt_before_use): Use find_insert_point so
	that inserted stmt will not dominate stmts that defines its operand.
	(rewrite_expr_tree): Add stmt_to_insert before adding the use stmt.
	(rewrite_expr_tree_parallel): Likewise.

From-SVN: r236876
parent db5447ca
2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org> 2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/71269
PR middle-end/71252
* tree-ssa-reassoc.c (insert_stmt_before_use): Use find_insert_point so
that inserted stmt will not dominate stmts that defines its operand.
(rewrite_expr_tree): Add stmt_to_insert before adding the use stmt.
(rewrite_expr_tree_parallel): Likewise.
2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/71252 PR middle-end/71252
* tree-ssa-reassoc.c (swap_ops_for_binary_stmt): Fix swap such that * tree-ssa-reassoc.c (swap_ops_for_binary_stmt): Fix swap such that
all fields including stmt_to_insert are swapped. all fields including stmt_to_insert are swapped.
......
2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org> 2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/71269
PR middle-end/71292
* gcc.dg/tree-ssa/pr71269.c: New test.
* gcc.dg/tree-ssa/pr71292.c: New test.
2016-05-30 Kugan Vivekanandarajah <kuganv@linaro.org>
PR middle-end/71252 PR middle-end/71252
* gcc.dg/tree-ssa/pr71252-2.c: New test. * gcc.dg/tree-ssa/pr71252-2.c: New test.
......
/* PR middle-end/71269 */
/* { dg-do compile } */
/* { dg-options "-O1" } */
int a, b, c;
void fn2 (int);
void fn1 ()
{
fn2 (sizeof 0 + c + a + b + b);
}
/* PR middle-end/71292 */
/* { dg-do compile } */
/* { dg-options "-O2" } */
unsigned long a;
long b, d;
int c;
void fn1 ()
{
unsigned long e = a + c;
b = d + e + a + 8;
}
...@@ -1777,16 +1777,6 @@ eliminate_redundant_comparison (enum tree_code opcode, ...@@ -1777,16 +1777,6 @@ eliminate_redundant_comparison (enum tree_code opcode,
return false; return false;
} }
/* If the stmt that defines operand has to be inserted, insert it
before the use. */
static void
insert_stmt_before_use (gimple *stmt, gimple *stmt_to_insert)
{
gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
gimple_set_uid (stmt_to_insert, gimple_uid (stmt));
gsi_insert_before (&gsi, stmt_to_insert, GSI_NEW_STMT);
}
/* Transform repeated addition of same values into multiply with /* Transform repeated addition of same values into multiply with
constant. */ constant. */
...@@ -3787,6 +3777,29 @@ find_insert_point (gimple *stmt, tree rhs1, tree rhs2) ...@@ -3787,6 +3777,29 @@ find_insert_point (gimple *stmt, tree rhs1, tree rhs2)
return stmt; return stmt;
} }
/* If the stmt that defines operand has to be inserted, insert it
before the use. */
static void
insert_stmt_before_use (gimple *stmt, gimple *stmt_to_insert)
{
gcc_assert (is_gimple_assign (stmt_to_insert));
tree rhs1 = gimple_assign_rhs1 (stmt_to_insert);
tree rhs2 = gimple_assign_rhs2 (stmt_to_insert);
gimple *insert_point = find_insert_point (stmt, rhs1, rhs2);
gimple_stmt_iterator gsi = gsi_for_stmt (insert_point);
gimple_set_uid (stmt_to_insert, gimple_uid (insert_point));
/* If the insert point is not stmt, then insert_point would be
the point where operand rhs1 or rhs2 is defined. In this case,
stmt_to_insert has to be inserted afterwards. This would
only happen when the stmt insertion point is flexible. */
if (stmt == insert_point)
gsi_insert_before (&gsi, stmt_to_insert, GSI_NEW_STMT);
else
insert_stmt_after (stmt_to_insert, insert_point);
}
/* Recursively rewrite our linearized statements so that the operators /* Recursively rewrite our linearized statements so that the operators
match those in OPS[OPINDEX], putting the computation in rank match those in OPS[OPINDEX], putting the computation in rank
order. Return new lhs. */ order. Return new lhs. */
...@@ -3823,6 +3836,12 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex, ...@@ -3823,6 +3836,12 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
print_gimple_stmt (dump_file, stmt, 0, 0); print_gimple_stmt (dump_file, stmt, 0, 0);
} }
/* If the stmt that defines operand has to be inserted, insert it
before the use. */
if (oe1->stmt_to_insert)
insert_stmt_before_use (stmt, oe1->stmt_to_insert);
if (oe2->stmt_to_insert)
insert_stmt_before_use (stmt, oe2->stmt_to_insert);
/* Even when changed is false, reassociation could have e.g. removed /* Even when changed is false, reassociation could have e.g. removed
some redundant operations, so unless we are just swapping the some redundant operations, so unless we are just swapping the
arguments or unless there is no change at all (then we just arguments or unless there is no change at all (then we just
...@@ -3831,12 +3850,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex, ...@@ -3831,12 +3850,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
{ {
gimple *insert_point gimple *insert_point
= find_insert_point (stmt, oe1->op, oe2->op); = find_insert_point (stmt, oe1->op, oe2->op);
/* If the stmt that defines operand has to be inserted, insert it
before the use. */
if (oe1->stmt_to_insert)
insert_stmt_before_use (stmt, oe1->stmt_to_insert);
if (oe2->stmt_to_insert)
insert_stmt_before_use (stmt, oe2->stmt_to_insert);
lhs = make_ssa_name (TREE_TYPE (lhs)); lhs = make_ssa_name (TREE_TYPE (lhs));
stmt stmt
= gimple_build_assign (lhs, gimple_assign_rhs_code (stmt), = gimple_build_assign (lhs, gimple_assign_rhs_code (stmt),
...@@ -3852,12 +3865,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex, ...@@ -3852,12 +3865,6 @@ rewrite_expr_tree (gimple *stmt, unsigned int opindex,
{ {
gcc_checking_assert (find_insert_point (stmt, oe1->op, oe2->op) gcc_checking_assert (find_insert_point (stmt, oe1->op, oe2->op)
== stmt); == stmt);
/* If the stmt that defines operand has to be inserted, insert it
before the use. */
if (oe1->stmt_to_insert)
insert_stmt_before_use (stmt, oe1->stmt_to_insert);
if (oe2->stmt_to_insert)
insert_stmt_before_use (stmt, oe2->stmt_to_insert);
gimple_assign_set_rhs1 (stmt, oe1->op); gimple_assign_set_rhs1 (stmt, oe1->op);
gimple_assign_set_rhs2 (stmt, oe2->op); gimple_assign_set_rhs2 (stmt, oe2->op);
update_stmt (stmt); update_stmt (stmt);
...@@ -4097,16 +4104,18 @@ rewrite_expr_tree_parallel (gassign *stmt, int width, ...@@ -4097,16 +4104,18 @@ rewrite_expr_tree_parallel (gassign *stmt, int width,
print_gimple_stmt (dump_file, stmts[i], 0, 0); print_gimple_stmt (dump_file, stmts[i], 0, 0);
} }
/* If the stmt that defines operand has to be inserted, insert it
before the use. */
if (stmt1)
insert_stmt_before_use (stmts[i], stmt1);
if (stmt2)
insert_stmt_before_use (stmts[i], stmt2);
stmt1 = stmt2 = NULL;
/* We keep original statement only for the last one. All /* We keep original statement only for the last one. All
others are recreated. */ others are recreated. */
if (i == stmt_num - 1) if (i == stmt_num - 1)
{ {
/* If the stmt that defines operand has to be inserted, insert it
before the use. */
if (stmt1)
insert_stmt_before_use (stmts[i], stmt1);
if (stmt2)
insert_stmt_before_use (stmts[i], stmt2);
gimple_assign_set_rhs1 (stmts[i], op1); gimple_assign_set_rhs1 (stmts[i], op1);
gimple_assign_set_rhs2 (stmts[i], op2); gimple_assign_set_rhs2 (stmts[i], op2);
update_stmt (stmts[i]); update_stmt (stmts[i]);
...@@ -4114,12 +4123,6 @@ rewrite_expr_tree_parallel (gassign *stmt, int width, ...@@ -4114,12 +4123,6 @@ rewrite_expr_tree_parallel (gassign *stmt, int width,
else else
{ {
stmts[i] = build_and_add_sum (TREE_TYPE (last_rhs1), op1, op2, opcode); stmts[i] = build_and_add_sum (TREE_TYPE (last_rhs1), op1, op2, opcode);
/* If the stmt that defines operand has to be inserted, insert it
before new build_and_add stmt after it is created. */
if (stmt1)
insert_stmt_before_use (stmts[i], stmt1);
if (stmt2)
insert_stmt_before_use (stmts[i], stmt2);
} }
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
{ {
......
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