[PATCH] Fix debug stmt handling in optimize_recip_sqrt (PR tree-optimization/87977)

Jakub Jelinek jakub@redhat.com
Tue Nov 13 23:32:00 GMT 2018


On Tue, Nov 13, 2018 at 10:19:10AM +0100, Jakub Jelinek wrote:
> > >  Though, in this particular case the sqrt call is
> > > optimized away, so it wouldn't make a difference.
> > > 
> > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk, or
> > > should I do the gimple_build_assign + gsi_replace change?
> > 
> > I think that would be cleaner.
> 
> Ok, will do.  Thanks.

Here it is.  Bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2018-11-13  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.

	* 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.

--- gcc/tree-ssa-math-opts.c.jj	2018-11-12 20:01:19.224793981 +0100
+++ gcc/tree-ssa-math-opts.c	2018-11-13 11:30:16.326203020 +0100
@@ -652,10 +652,14 @@ optimize_recip_sqrt (gimple_stmt_iterato
 	  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);
 
       if (dump_file)
 	print_gimple_stmt (dump_file, stmt, 0, TDF_NONE);
@@ -704,7 +707,7 @@ optimize_recip_sqrt (gimple_stmt_iterato
 
       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 +718,8 @@ optimize_recip_sqrt (gimple_stmt_iterato
       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 +956,7 @@ pass_cse_reciprocals::execute (function
 	      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);
--- gcc/testsuite/gcc.dg/recip_sqrt_mult_1.c.jj	2018-11-12 20:01:19.315792497 +0100
+++ gcc/testsuite/gcc.dg/recip_sqrt_mult_1.c	2018-11-13 11:17:41.667541915 +0100
@@ -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
--- gcc/testsuite/gcc.dg/recip_sqrt_mult_2.c.jj	2018-11-12 20:01:19.320792415 +0100
+++ gcc/testsuite/gcc.dg/recip_sqrt_mult_2.c	2018-11-13 11:17:41.668541899 +0100
@@ -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)
--- gcc/testsuite/gcc.dg/recip_sqrt_mult_3.c.jj	2018-11-12 20:01:19.363791713 +0100
+++ gcc/testsuite/gcc.dg/recip_sqrt_mult_3.c	2018-11-13 11:17:41.671541850 +0100
@@ -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)
--- gcc/testsuite/gcc.dg/recip_sqrt_mult_4.c.jj	2018-11-12 20:01:19.371791582 +0100
+++ gcc/testsuite/gcc.dg/recip_sqrt_mult_4.c	2018-11-13 11:17:41.686541603 +0100
@@ -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.  */
--- gcc/testsuite/gcc.dg/recip_sqrt_mult_5.c.jj	2018-11-12 20:01:19.386791336 +0100
+++ gcc/testsuite/gcc.dg/recip_sqrt_mult_5.c	2018-11-13 11:17:41.705541293 +0100
@@ -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.  */


	Jakub



More information about the Gcc-patches mailing list