gimple.h (gimple_asm_clobbers_memory_p): Declare.
authorNathan Froyd <froydnj@codesourcery.com>
Fri, 15 Apr 2011 14:27:55 +0000 (14:27 +0000)
committerNathan Froyd <froydnj@gcc.gnu.org>
Fri, 15 Apr 2011 14:27:55 +0000 (14:27 +0000)
* 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.

From-SVN: r172496

gcc/ChangeLog
gcc/gimple.c
gcc/gimple.h
gcc/ipa-pure-const.c
gcc/tree-ssa-operands.c

index 9f091f28256ee4873f0a1ced62f49df366750c60..52a1718d24ccf17d18d233b2e45ebd47b23b191c 100644 (file)
@@ -1,3 +1,10 @@
+2011-04-15  Nathan Froyd  <froydnj@codesourcery.com>
+
+       * 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.
+
 2011-04-15  Richard Guenther  <rguenther@suse.de>
 
        PR tree-optimization/48290
index 090fc94dd2f6df9edbefa8c80710ac89a7923de6..5dc62ea999253fad8ba7e88bef96153880108893 100644 (file)
@@ -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"
index 572cabcc57fb77263f755ecc2db30b534aac431b..840e149fde8a41dc968cb2cea5b8bc99d14cdc65 100644 (file)
@@ -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 *);
index b7deb5776f4d6c3d09e1497b4f01d52eba66a5d2..eb5b0f6ab61937591533bedc09aeee1a502a7a07 100644 (file)
@@ -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))
        {
index 57f443fe2bccf042462377908a1933e3c9b0ae5e..7f76cbfe9c090d46ee1cf6dff4d2a5e60f5ca469 100644 (file)
@@ -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);
 }