On Fri, Apr 15, 2011 at 3:20 PM, Nathan Froyd <froy...@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); > } > > >