Commit c4071191 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/87977 (ICE: verify_ssa failed (error: definition in…

re PR tree-optimization/87977 (ICE: verify_ssa failed (error: definition in block 4 follows the use))

	PR tree-optimization/87977
	* tree-ssa-math-opts.c (optimize_recip_sqrt): Don't reuse division
	stmt, build a new one and replace the old one with it.  Formatting fix.
	Call release_ssa_name (x) if !has_other_use and !delete_div.
	(pass_cse_reciprocals::execute): Before calling optimize_recip_sqrt
	verify lhs of stmt is still def.

	* gcc.dg/recip_sqrt_mult_1.c: Add -fcompare-debug to dg-options.
	* gcc.dg/recip_sqrt_mult_2.c: Likewise.
	* gcc.dg/recip_sqrt_mult_3.c: Likewise.
	* gcc.dg/recip_sqrt_mult_4.c: Likewise.
	* gcc.dg/recip_sqrt_mult_5.c: Likewise.

From-SVN: r266098
parent 38e60111
2018-11-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/87977
* tree-ssa-math-opts.c (optimize_recip_sqrt): Don't reuse division
stmt, build a new one and replace the old one with it. Formatting fix.
Call release_ssa_name (x) if !has_other_use and !delete_div.
(pass_cse_reciprocals::execute): Before calling optimize_recip_sqrt
verify lhs of stmt is still def.
2018-11-13 Peter Bergner <bergner@linux.ibm.com> 2018-11-13 Peter Bergner <bergner@linux.ibm.com>
PR rtl-optimization/87507 PR rtl-optimization/87507
2018-11-14 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/87977
* gcc.dg/recip_sqrt_mult_1.c: Add -fcompare-debug to dg-options.
* gcc.dg/recip_sqrt_mult_2.c: Likewise.
* gcc.dg/recip_sqrt_mult_3.c: Likewise.
* gcc.dg/recip_sqrt_mult_4.c: Likewise.
* gcc.dg/recip_sqrt_mult_5.c: Likewise.
2018-11-13 Peter Bergner <bergner@linux.ibm.com> 2018-11-13 Peter Bergner <bergner@linux.ibm.com>
PR rtl-optimization/87507 PR rtl-optimization/87507
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-recip" } */ /* { dg-options "-Ofast -fdump-tree-recip -fcompare-debug" } */
double res, res2, tmp; double res, res2, tmp;
void void
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-optimized" } */ /* { dg-options "-Ofast -fdump-tree-optimized -fcompare-debug" } */
float float
foo (float a) foo (float a)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-optimized" } */ /* { dg-options "-Ofast -fdump-tree-optimized -fcompare-debug" } */
double double
foo (double a) foo (double a)
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-recip" } */ /* { dg-options "-Ofast -fdump-tree-recip -fcompare-debug" } */
/* The main path doesn't have any multiplications. /* The main path doesn't have any multiplications.
Avoid introducing them in the recip pass. */ Avoid introducing them in the recip pass. */
......
/* { dg-do compile } */ /* { dg-do compile } */
/* { dg-options "-Ofast -fdump-tree-recip" } */ /* { dg-options "-Ofast -fdump-tree-recip -fcompare-debug" } */
/* We want to do the recip_sqrt transformations here there is already /* We want to do the recip_sqrt transformations here there is already
a multiplication on the main path. */ a multiplication on the main path. */
......
...@@ -652,8 +652,12 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def) ...@@ -652,8 +652,12 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def)
print_gimple_stmt (dump_file, stmt, 0, TDF_NONE); print_gimple_stmt (dump_file, stmt, 0, TDF_NONE);
fprintf (dump_file, "with new division\n"); fprintf (dump_file, "with new division\n");
} }
gimple_assign_set_lhs (stmt, sqr_ssa_name); stmt
gimple_assign_set_rhs2 (stmt, a); = gimple_build_assign (sqr_ssa_name, gimple_assign_rhs_code (stmt),
gimple_assign_rhs1 (stmt), a);
gsi_insert_before (def_gsi, stmt, GSI_SAME_STMT);
gsi_remove (def_gsi, true);
*def_gsi = gsi_for_stmt (stmt);
fold_stmt_inplace (def_gsi); fold_stmt_inplace (def_gsi);
update_stmt (stmt); update_stmt (stmt);
...@@ -704,7 +708,7 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def) ...@@ -704,7 +708,7 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def)
gimple *new_stmt gimple *new_stmt
= gimple_build_assign (x, MULT_EXPR, = gimple_build_assign (x, MULT_EXPR,
orig_sqrt_ssa_name, sqr_ssa_name); orig_sqrt_ssa_name, sqr_ssa_name);
gsi_insert_after (def_gsi, new_stmt, GSI_NEW_STMT); gsi_insert_after (def_gsi, new_stmt, GSI_NEW_STMT);
update_stmt (stmt); update_stmt (stmt);
} }
...@@ -715,6 +719,8 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def) ...@@ -715,6 +719,8 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def)
gsi_remove (&gsi2, true); gsi_remove (&gsi2, true);
release_defs (stmt); release_defs (stmt);
} }
else
release_ssa_name (x);
} }
/* Look for floating-point divisions among DEF's uses, and try to /* Look for floating-point divisions among DEF's uses, and try to
...@@ -951,6 +957,7 @@ pass_cse_reciprocals::execute (function *fun) ...@@ -951,6 +957,7 @@ pass_cse_reciprocals::execute (function *fun)
stmt = gsi_stmt (gsi); stmt = gsi_stmt (gsi);
if (flag_unsafe_math_optimizations if (flag_unsafe_math_optimizations
&& is_gimple_assign (stmt) && is_gimple_assign (stmt)
&& gimple_assign_lhs (stmt) == def
&& !stmt_can_throw_internal (cfun, stmt) && !stmt_can_throw_internal (cfun, stmt)
&& gimple_assign_rhs_code (stmt) == RDIV_EXPR) && gimple_assign_rhs_code (stmt) == RDIV_EXPR)
optimize_recip_sqrt (&gsi, def); optimize_recip_sqrt (&gsi, def);
......
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