On Mon, 6 Jun 2016, Jan Hubicka wrote: > Hi, > does this look better?
Can you make the argument of gimple_inexpensive_call_p a gcall * please? Ok with that change. Thanks, Richard. > Honza > > * gimple.c: Include builtins.h > (gimple_inexpensive_call_p): New function. > * gimple.h (gimple_inexpensive_call_p): Declare. > * tree-ssa-loop-ch.c (should_duplicate_loop_header_p): Use it. > * tree-ssa-loop-ivcanon.c (tree_estimate_loop_size): Likewise. > Index: gimple.c > =================================================================== > --- gimple.c (revision 237101) > +++ gimple.c (working copy) > @@ -38,6 +38,7 @@ along with GCC; see the file COPYING3. > #include "gimple-walk.h" > #include "gimplify.h" > #include "target.h" > +#include "builtins.h" > > > /* All the tuples have their operand vector (if present) at the very bottom > @@ -3018,3 +3019,16 @@ maybe_remove_unused_call_args (struct fu > update_stmt_fn (fn, stmt); > } > } > + > +/* Return false if STMT will likely expand to real function call. */ > + > +bool > +gimple_inexpensive_call_p (gimple *stmt) > +{ > + if (gimple_call_internal_p (stmt)) > + return true; > + tree decl = gimple_call_fndecl (stmt); > + if (decl && is_inexpensive_builtin (decl)) > + return true; > + return false; > +} > Index: gimple.h > =================================================================== > --- gimple.h (revision 237101) > +++ gimple.h (working copy) > @@ -1525,6 +1525,7 @@ extern void preprocess_case_label_vec_fo > extern void gimple_seq_set_location (gimple_seq, location_t); > extern void gimple_seq_discard (gimple_seq); > extern void maybe_remove_unused_call_args (struct function *, gimple *); > +extern bool gimple_inexpensive_call_p (gimple *); > > /* Formal (expression) temporary table handling: multiple occurrences of > the same scalar expression are evaluated into the same temporary. */ > Index: tree-ssa-loop-ch.c > =================================================================== > --- tree-ssa-loop-ch.c (revision 237101) > +++ tree-ssa-loop-ch.c (working copy) > @@ -118,7 +118,8 @@ should_duplicate_loop_header_p (basic_bl > if (is_gimple_debug (last)) > continue; > > - if (is_gimple_call (last)) > + if (gimple_code (last) == GIMPLE_CALL > + && !gimple_inexpensive_call_p (last)) > { > if (dump_file && (dump_flags & TDF_DETAILS)) > fprintf (dump_file, > Index: tree-ssa-loop-ivcanon.c > =================================================================== > --- tree-ssa-loop-ivcanon.c (revision 237101) > +++ tree-ssa-loop-ivcanon.c (working copy) > @@ -339,15 +339,11 @@ tree_estimate_loop_size (struct loop *lo > for (gsi = gsi_start_bb (bb); !gsi_end_p (gsi); gsi_next (&gsi)) > { > gimple *stmt = gsi_stmt (gsi); > - if (gimple_code (stmt) == GIMPLE_CALL) > + if (gimple_code (stmt) == GIMPLE_CALL > + && !gimple_inexpensive_call_p (stmt)) > { > int flags = gimple_call_flags (stmt); > - tree decl = gimple_call_fndecl (stmt); > - > - if (decl && DECL_IS_BUILTIN (decl) > - && is_inexpensive_builtin (decl)) > - ; > - else if (flags & (ECF_PURE | ECF_CONST)) > + if (flags & (ECF_PURE | ECF_CONST)) > size->num_pure_calls_on_hot_path++; > else > size->num_non_pure_calls_on_hot_path++; > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)