From c4071191f4d20d25389181b90c0a24f254a47b87 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Wed, 14 Nov 2018 10:01:47 +0100 Subject: [PATCH] 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 --- gcc/ChangeLog | 9 +++++++++ gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/gcc.dg/recip_sqrt_mult_1.c | 2 +- gcc/testsuite/gcc.dg/recip_sqrt_mult_2.c | 2 +- gcc/testsuite/gcc.dg/recip_sqrt_mult_3.c | 2 +- gcc/testsuite/gcc.dg/recip_sqrt_mult_4.c | 2 +- gcc/testsuite/gcc.dg/recip_sqrt_mult_5.c | 2 +- gcc/tree-ssa-math-opts.c | 13 ++++++++++--- 8 files changed, 33 insertions(+), 8 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 62f6383195a..cbd89695b1d 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2018-11-14 Jakub Jelinek + + 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 PR rtl-optimization/87507 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index c1c92b1cbc8..eb871d03d7c 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2018-11-14 Jakub Jelinek + + 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 PR rtl-optimization/87507 diff --git a/gcc/testsuite/gcc.dg/recip_sqrt_mult_1.c b/gcc/testsuite/gcc.dg/recip_sqrt_mult_1.c index 188390a4ecf..e057306a4ee 100644 --- a/gcc/testsuite/gcc.dg/recip_sqrt_mult_1.c +++ b/gcc/testsuite/gcc.dg/recip_sqrt_mult_1.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-recip" } */ +/* { dg-options "-Ofast -fdump-tree-recip -fcompare-debug" } */ double res, res2, tmp; void diff --git a/gcc/testsuite/gcc.dg/recip_sqrt_mult_2.c b/gcc/testsuite/gcc.dg/recip_sqrt_mult_2.c index c5fc3de7b65..6ff284b60d3 100644 --- a/gcc/testsuite/gcc.dg/recip_sqrt_mult_2.c +++ b/gcc/testsuite/gcc.dg/recip_sqrt_mult_2.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-optimized" } */ +/* { dg-options "-Ofast -fdump-tree-optimized -fcompare-debug" } */ float foo (float a) diff --git a/gcc/testsuite/gcc.dg/recip_sqrt_mult_3.c b/gcc/testsuite/gcc.dg/recip_sqrt_mult_3.c index e7d185ba7e2..7a8305de727 100644 --- a/gcc/testsuite/gcc.dg/recip_sqrt_mult_3.c +++ b/gcc/testsuite/gcc.dg/recip_sqrt_mult_3.c @@ -1,5 +1,5 @@ /* { dg-do compile } */ -/* { dg-options "-Ofast -fdump-tree-optimized" } */ +/* { dg-options "-Ofast -fdump-tree-optimized -fcompare-debug" } */ double foo (double a) diff --git a/gcc/testsuite/gcc.dg/recip_sqrt_mult_4.c b/gcc/testsuite/gcc.dg/recip_sqrt_mult_4.c index e3005f2feb6..3b8c1ec600f 100644 --- a/gcc/testsuite/gcc.dg/recip_sqrt_mult_4.c +++ b/gcc/testsuite/gcc.dg/recip_sqrt_mult_4.c @@ -1,5 +1,5 @@ /* { 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. Avoid introducing them in the recip pass. */ diff --git a/gcc/testsuite/gcc.dg/recip_sqrt_mult_5.c b/gcc/testsuite/gcc.dg/recip_sqrt_mult_5.c index e871f0fcd4f..27c6cd2e512 100644 --- a/gcc/testsuite/gcc.dg/recip_sqrt_mult_5.c +++ b/gcc/testsuite/gcc.dg/recip_sqrt_mult_5.c @@ -1,5 +1,5 @@ /* { 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 a multiplication on the main path. */ diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index ccff56f4297..d21077734e6 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -652,8 +652,12 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def) print_gimple_stmt (dump_file, stmt, 0, TDF_NONE); fprintf (dump_file, "with new division\n"); } - gimple_assign_set_lhs (stmt, sqr_ssa_name); - gimple_assign_set_rhs2 (stmt, a); + stmt + = 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); update_stmt (stmt); @@ -704,7 +708,7 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def) gimple *new_stmt = 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); update_stmt (stmt); } @@ -715,6 +719,8 @@ optimize_recip_sqrt (gimple_stmt_iterator *def_gsi, tree def) gsi_remove (&gsi2, true); release_defs (stmt); } + else + release_ssa_name (x); } /* Look for floating-point divisions among DEF's uses, and try to @@ -951,6 +957,7 @@ pass_cse_reciprocals::execute (function *fun) stmt = gsi_stmt (gsi); if (flag_unsafe_math_optimizations && is_gimple_assign (stmt) + && gimple_assign_lhs (stmt) == def && !stmt_can_throw_internal (cfun, stmt) && gimple_assign_rhs_code (stmt) == RDIV_EXPR) optimize_recip_sqrt (&gsi, def); -- 2.30.2