Patchwork refactor gimple asm memory clobber checking

login
register
mail settings
Submitter Nathan Froyd
Date April 15, 2011, 1:20 p.m.
Message ID <20110415132022.GY23480@codesourcery.com>
Download mbox | patch
Permalink /patch/91371/
State New
Headers show

Comments

Nathan Froyd - April 15, 2011, 1:20 p.m.
There are a couple places that check GIMPLE_ASMs for clobbering memory;
this patch centralizes the logic in gimple.c.

Tested on x86_64-unknown-linux-gnu.  OK to commit?

-Nathan

	* gimple.h (gimple_asm_clobbers_memory_p): Declare.
	* gimple.c (gimple_asm_clobbers_memory_p): Define.
	* ipa-pure-const.c (check_stmt): Call it.
	* tree-ssa-operands.c (get_asm_expr_operands): Likewise.
Richard Guenther - April 15, 2011, 2:16 p.m.
On Fri, Apr 15, 2011 at 3:20 PM, Nathan Froyd <froydnj@codesourcery.com> wrote:
> There are a couple places that check GIMPLE_ASMs for clobbering memory;
> this patch centralizes the logic in gimple.c.
>
> Tested on x86_64-unknown-linux-gnu.  OK to commit?

Ok.

Thanks,
Richard.

> -Nathan
>
>        * gimple.h (gimple_asm_clobbers_memory_p): Declare.
>        * gimple.c (gimple_asm_clobbers_memory_p): Define.
>        * ipa-pure-const.c (check_stmt): Call it.
>        * tree-ssa-operands.c (get_asm_expr_operands): Likewise.
>
> diff --git a/gcc/gimple.c b/gcc/gimple.c
> index 090fc94..5dc62ea 100644
> --- a/gcc/gimple.c
> +++ b/gcc/gimple.c
> @@ -5142,4 +5142,21 @@ gimple_call_builtin_p (gimple stmt, enum built_in_function code)
>          && DECL_FUNCTION_CODE (fndecl) == code);
>  }
>
> +/* Return true if STMT clobbers memory.  STMT is required to be a
> +   GIMPLE_ASM.  */
> +
> +bool
> +gimple_asm_clobbers_memory_p (const_gimple stmt)
> +{
> +  unsigned i;
> +
> +  for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
> +    {
> +      tree op = gimple_asm_clobber_op (stmt, i);
> +      if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
> +       return true;
> +    }
> +
> +  return false;
> +}
>  #include "gt-gimple.h"
> diff --git a/gcc/gimple.h b/gcc/gimple.h
> index 572cabc..840e149 100644
> --- a/gcc/gimple.h
> +++ b/gcc/gimple.h
> @@ -973,6 +973,7 @@ extern bool walk_stmt_load_store_ops (gimple, void *,
>                                      bool (*)(gimple, tree, void *));
>  extern bool gimple_ior_addresses_taken (bitmap, gimple);
>  extern bool gimple_call_builtin_p (gimple, enum built_in_function);
> +extern bool gimple_asm_clobbers_memory_p (const_gimple);
>
>  /* In gimplify.c  */
>  extern tree create_tmp_var_raw (tree, const char *);
> diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
> index b7deb57..eb5b0f6 100644
> --- a/gcc/ipa-pure-const.c
> +++ b/gcc/ipa-pure-const.c
> @@ -639,7 +639,6 @@ static void
>  check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa)
>  {
>   gimple stmt = gsi_stmt (*gsip);
> -  unsigned int i = 0;
>
>   if (is_gimple_debug (stmt))
>     return;
> @@ -693,16 +692,12 @@ check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa)
>        }
>       break;
>     case GIMPLE_ASM:
> -      for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
> +      if (gimple_asm_clobbers_memory_p (stmt))
>        {
> -         tree op = gimple_asm_clobber_op (stmt, i);
> -         if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
> -           {
> -              if (dump_file)
> -                fprintf (dump_file, "    memory asm clobber is not const/pure");
> -             /* Abandon all hope, ye who enter here. */
> -             local->pure_const_state = IPA_NEITHER;
> -           }
> +         if (dump_file)
> +           fprintf (dump_file, "    memory asm clobber is not const/pure");
> +         /* Abandon all hope, ye who enter here. */
> +         local->pure_const_state = IPA_NEITHER;
>        }
>       if (gimple_asm_volatile_p (stmt))
>        {
> diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
> index 57f443f..7f76cbf 100644
> --- a/gcc/tree-ssa-operands.c
> +++ b/gcc/tree-ssa-operands.c
> @@ -832,15 +832,8 @@ get_asm_expr_operands (gimple stmt)
>     }
>
>   /* Clobber all memory and addressable symbols for asm ("" : : : "memory");  */
> -  for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
> -    {
> -      tree link = gimple_asm_clobber_op (stmt, i);
> -      if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
> -       {
> -         add_virtual_operand (stmt, opf_def);
> -         break;
> -       }
> -    }
> +  if (gimple_asm_clobbers_memory_p (stmt))
> +    add_virtual_operand (stmt, opf_def);
>  }
>
>
>

Patch

diff --git a/gcc/gimple.c b/gcc/gimple.c
index 090fc94..5dc62ea 100644
--- a/gcc/gimple.c
+++ b/gcc/gimple.c
@@ -5142,4 +5142,21 @@  gimple_call_builtin_p (gimple stmt, enum built_in_function code)
 	  && DECL_FUNCTION_CODE (fndecl) == code);
 }
 
+/* Return true if STMT clobbers memory.  STMT is required to be a
+   GIMPLE_ASM.  */
+
+bool
+gimple_asm_clobbers_memory_p (const_gimple stmt)
+{
+  unsigned i;
+
+  for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
+    {
+      tree op = gimple_asm_clobber_op (stmt, i);
+      if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
+	return true;
+    }
+
+  return false;
+}
 #include "gt-gimple.h"
diff --git a/gcc/gimple.h b/gcc/gimple.h
index 572cabc..840e149 100644
--- a/gcc/gimple.h
+++ b/gcc/gimple.h
@@ -973,6 +973,7 @@  extern bool walk_stmt_load_store_ops (gimple, void *,
 				      bool (*)(gimple, tree, void *));
 extern bool gimple_ior_addresses_taken (bitmap, gimple);
 extern bool gimple_call_builtin_p (gimple, enum built_in_function);
+extern bool gimple_asm_clobbers_memory_p (const_gimple);
 
 /* In gimplify.c  */
 extern tree create_tmp_var_raw (tree, const char *);
diff --git a/gcc/ipa-pure-const.c b/gcc/ipa-pure-const.c
index b7deb57..eb5b0f6 100644
--- a/gcc/ipa-pure-const.c
+++ b/gcc/ipa-pure-const.c
@@ -639,7 +639,6 @@  static void
 check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa)
 {
   gimple stmt = gsi_stmt (*gsip);
-  unsigned int i = 0;
 
   if (is_gimple_debug (stmt))
     return;
@@ -693,16 +692,12 @@  check_stmt (gimple_stmt_iterator *gsip, funct_state local, bool ipa)
 	}
       break;
     case GIMPLE_ASM:
-      for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
+      if (gimple_asm_clobbers_memory_p (stmt))
 	{
-	  tree op = gimple_asm_clobber_op (stmt, i);
-	  if (strcmp (TREE_STRING_POINTER (TREE_VALUE (op)), "memory") == 0)
-	    {
-              if (dump_file)
-                fprintf (dump_file, "    memory asm clobber is not const/pure");
-	      /* Abandon all hope, ye who enter here. */
-	      local->pure_const_state = IPA_NEITHER;
-	    }
+	  if (dump_file)
+	    fprintf (dump_file, "    memory asm clobber is not const/pure");
+	  /* Abandon all hope, ye who enter here. */
+	  local->pure_const_state = IPA_NEITHER;
 	}
       if (gimple_asm_volatile_p (stmt))
 	{
diff --git a/gcc/tree-ssa-operands.c b/gcc/tree-ssa-operands.c
index 57f443f..7f76cbf 100644
--- a/gcc/tree-ssa-operands.c
+++ b/gcc/tree-ssa-operands.c
@@ -832,15 +832,8 @@  get_asm_expr_operands (gimple stmt)
     }
 
   /* Clobber all memory and addressable symbols for asm ("" : : : "memory");  */
-  for (i = 0; i < gimple_asm_nclobbers (stmt); i++)
-    {
-      tree link = gimple_asm_clobber_op (stmt, i);
-      if (strcmp (TREE_STRING_POINTER (TREE_VALUE (link)), "memory") == 0)
-	{
-	  add_virtual_operand (stmt, opf_def);
-	  break;
-	}
-    }
+  if (gimple_asm_clobbers_memory_p (stmt))
+    add_virtual_operand (stmt, opf_def);
 }