Patchwork Don't optimize volatile stores or loads in cselim (PR tree-optimization/56098)

login
register
mail settings
Submitter Jakub Jelinek
Date Jan. 25, 2013, 6:21 p.m.
Message ID <20130125182132.GD4385@tucnak.redhat.com>
Download mbox | patch
Permalink /patch/215821/
State New
Headers show

Comments

Jakub Jelinek - Jan. 25, 2013, 6:21 p.m.
Hi!

As shown by the testcases, we shouldn't try to optimize volatile
stores resp. loads in tree-ssa-phiopt.c.

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2013-01-25  Jakub Jelinek  <jakub@redhat.com>

	PR tree-optimization/56098
	* tree-ssa-phiopt.c (nt_init_block): Don't call add_or_mark_expr
	for stmts with volatile ops.
	(cond_store_replacement): Don't optimize if assign has volatile ops.
	(cond_if_else_store_replacement_1): Don't optimize if either
	then_assign or else_assign have volatile ops.
	(hoist_adjacent_loads): Don't optimize if either def1 or def2 have
	volatile ops.

	* gcc.dg/pr56098-1.c: New test.
	* gcc.dg/pr56098-2.c: New test.


	Jakub
Jeff Law - Jan. 25, 2013, 7:59 p.m.
On 01/25/2013 11:21 AM, Jakub Jelinek wrote:
> Hi!
>
> As shown by the testcases, we shouldn't try to optimize volatile
> stores resp. loads in tree-ssa-phiopt.c.
>
> Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
> trunk?
>
> 2013-01-25  Jakub Jelinek  <jakub@redhat.com>
>
> 	PR tree-optimization/56098
> 	* tree-ssa-phiopt.c (nt_init_block): Don't call add_or_mark_expr
> 	for stmts with volatile ops.
> 	(cond_store_replacement): Don't optimize if assign has volatile ops.
> 	(cond_if_else_store_replacement_1): Don't optimize if either
> 	then_assign or else_assign have volatile ops.
> 	(hoist_adjacent_loads): Don't optimize if either def1 or def2 have
> 	volatile ops.
>
> 	* gcc.dg/pr56098-1.c: New test.
> 	* gcc.dg/pr56098-2.c: New test.
OK for trunk.

Thanks,
Jeff

Patch

--- gcc/tree-ssa-phiopt.c.jj	2013-01-11 09:02:55.000000000 +0100
+++ gcc/tree-ssa-phiopt.c	2013-01-25 16:27:24.813349943 +0100
@@ -1342,7 +1342,7 @@  nt_init_block (struct dom_walk_data *dat
     {
       gimple stmt = gsi_stmt (gsi);
 
-      if (gimple_assign_single_p (stmt))
+      if (gimple_assign_single_p (stmt) && !gimple_has_volatile_ops (stmt))
 	{
 	  add_or_mark_expr (bb, gimple_assign_lhs (stmt), nontrap_set, true);
 	  add_or_mark_expr (bb, gimple_assign_rhs1 (stmt), nontrap_set, false);
@@ -1419,7 +1419,8 @@  cond_store_replacement (basic_block midd
 
   /* Check if middle_bb contains of only one store.  */
   if (!assign
-      || !gimple_assign_single_p (assign))
+      || !gimple_assign_single_p (assign)
+      || gimple_has_volatile_ops (assign))
     return false;
 
   locus = gimple_location (assign);
@@ -1490,9 +1491,11 @@  cond_if_else_store_replacement_1 (basic_
   if (then_assign == NULL
       || !gimple_assign_single_p (then_assign)
       || gimple_clobber_p (then_assign)
+      || gimple_has_volatile_ops (then_assign)
       || else_assign == NULL
       || !gimple_assign_single_p (else_assign)
-      || gimple_clobber_p (else_assign))
+      || gimple_clobber_p (else_assign)
+      || gimple_has_volatile_ops (else_assign))
     return false;
 
   lhs = gimple_assign_lhs (then_assign);
@@ -1829,7 +1832,9 @@  hoist_adjacent_loads (basic_block bb0, b
 
       /* Both statements must be assignments whose RHS is a COMPONENT_REF.  */
       if (!gimple_assign_single_p (def1)
-	  || !gimple_assign_single_p (def2))
+	  || !gimple_assign_single_p (def2)
+	  || gimple_has_volatile_ops (def1)
+	  || gimple_has_volatile_ops (def2))
 	continue;
 
       ref1 = gimple_assign_rhs1 (def1);
--- gcc/testsuite/gcc.dg/pr56098-1.c.jj	2013-01-25 16:30:22.152341505 +0100
+++ gcc/testsuite/gcc.dg/pr56098-1.c	2013-01-25 16:30:55.000000000 +0100
@@ -0,0 +1,16 @@ 
+/* PR tree-optimization/56098 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+volatile int *p;
+
+void
+foo (int x)
+{
+  *p = 1;
+  if (x)
+    *p = 2;
+}
+
+/* { dg-final { scan-tree-dump-not "=\[^\n\r]*\\*p" "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- gcc/testsuite/gcc.dg/pr56098-2.c.jj	2013-01-25 16:55:37.474537207 +0100
+++ gcc/testsuite/gcc.dg/pr56098-2.c	2013-01-25 16:57:34.802867044 +0100
@@ -0,0 +1,19 @@ 
+/* PR tree-optimization/56098 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fhoist-adjacent-loads -fdump-tree-optimized" } */
+
+struct S { volatile int i; volatile int j; };
+
+int
+bar (struct S *x, int y)
+{
+  int r;
+  if (y)
+    r = x->i;
+  else
+    r = x->j;
+  return r;
+}
+
+/* { dg-final { scan-tree-dump-not "r_\[0-9]* =.v. \[^\n\r]*;\[\n\r]*  r_\[0-9]* =.v. " "optimized" } } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */