On Mon, 20 Nov 2017, Jakub Jelinek wrote: > Hi! > > All the hash_maps in tree-ssa-strlen.c except for the newly added one > were pointers to hash maps, which were constructed either lazily or during > the pass. But strlen_to_stridx is now constructed at the compiler start, > which is something I'd prefer to avoid, it affects even -O0 that way and > empty/small file compilation, something e.g. the kernel folks care so much > about. > > Apparently the hash map is only needed when one of the two warnings > is enabled, so this patch initializes it only in that case and otherwise > doesn't fill it or query it. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok. Richard. > 2017-11-20 Jakub Jelinek <ja...@redhat.com> > > * tree-ssa-strlen.c (strlen_to_stridx): Change into a pointer to > hash_map. > (handle_builtin_strlen, strlen_optimize_stmt): Only access it > if non-NULL, instead of . use ->. > (handle_builtin_stxncpy): Return early if strlen_to_stridx > is NULL. Spelling fix. Instead of . use ->. > (pass_strlen::execute): Allocate strlen_to_stridx if > warn_stringop_{truncation,overflow}. Instead of calling empty on it > delete it and clear it at the end of the pass. > > --- gcc/tree-ssa-strlen.c.jj 2017-11-15 09:40:03.000000000 +0100 > +++ gcc/tree-ssa-strlen.c 2017-11-20 18:10:42.565458585 +0100 > @@ -153,7 +153,7 @@ struct decl_stridxlist_map > static hash_map<tree_decl_hash, stridxlist> *decl_to_stridxlist_htab; > > typedef std::pair<int, location_t> stridx_strlenloc; > -static hash_map<tree, stridx_strlenloc> strlen_to_stridx; > +static hash_map<tree, stridx_strlenloc> *strlen_to_stridx; > > /* Obstack for struct stridxlist and struct decl_stridxlist_map. */ > static struct obstack stridx_obstack; > @@ -1207,8 +1207,11 @@ handle_builtin_strlen (gimple_stmt_itera > gcc_assert (si->full_string_p); > } > > - location_t loc = gimple_location (stmt); > - strlen_to_stridx.put (lhs, stridx_strlenloc (idx, loc)); > + if (strlen_to_stridx) > + { > + location_t loc = gimple_location (stmt); > + strlen_to_stridx->put (lhs, stridx_strlenloc (idx, loc)); > + } > return; > } > } > @@ -1253,8 +1256,11 @@ handle_builtin_strlen (gimple_stmt_itera > set_strinfo (idx, si); > find_equal_ptrs (src, idx); > > - location_t loc = gimple_location (stmt); > - strlen_to_stridx.put (lhs, stridx_strlenloc (idx, loc)); > + if (strlen_to_stridx) > + { > + location_t loc = gimple_location (stmt); > + strlen_to_stridx->put (lhs, stridx_strlenloc (idx, loc)); > + } > } > } > > @@ -1909,6 +1915,9 @@ maybe_diag_stxncpy_trunc (gimple_stmt_it > static void > handle_builtin_stxncpy (built_in_function, gimple_stmt_iterator *gsi) > { > + if (strlen_to_stridx == NULL) > + return; > + > gimple *stmt = gsi_stmt (*gsi); > > bool with_bounds = gimple_call_with_bounds_p (stmt); > @@ -1917,9 +1926,9 @@ handle_builtin_stxncpy (built_in_functio > tree len = gimple_call_arg (stmt, with_bounds ? 3 : 2); > > /* If the length argument was computed from strlen(S) for some string > - S retrieve the strinfo index for the string (PSS->FIRST) alonng with > + S retrieve the strinfo index for the string (PSS->FIRST) along with > the location of the strlen() call (PSS->SECOND). */ > - stridx_strlenloc *pss = strlen_to_stridx.get (len); > + stridx_strlenloc *pss = strlen_to_stridx->get (len); > if (!pss || pss->first <= 0) > { > if (maybe_diag_stxncpy_trunc (*gsi, src, len)) > @@ -2966,9 +2975,12 @@ strlen_optimize_stmt (gimple_stmt_iterat > fold_strstr_to_strncmp (gimple_assign_rhs1 (stmt), > gimple_assign_rhs2 (stmt), stmt); > > - tree rhs1 = gimple_assign_rhs1 (stmt); > - if (stridx_strlenloc *ps = strlen_to_stridx.get (rhs1)) > - strlen_to_stridx.put (lhs, stridx_strlenloc (*ps)); > + if (strlen_to_stridx) > + { > + tree rhs1 = gimple_assign_rhs1 (stmt); > + if (stridx_strlenloc *ps = strlen_to_stridx->get (rhs1)) > + strlen_to_stridx->put (lhs, stridx_strlenloc (*ps)); > + } > } > else if (TREE_CODE (lhs) != SSA_NAME && !TREE_SIDE_EFFECTS (lhs)) > { > @@ -3202,6 +3214,9 @@ pass_strlen::execute (function *fun) > ssa_ver_to_stridx.safe_grow_cleared (num_ssa_names); > max_stridx = 1; > > + if (warn_stringop_truncation || warn_stringop_overflow) > + strlen_to_stridx = new hash_map<tree, stridx_strlenloc> (64); > + > calculate_dominance_info (CDI_DOMINATORS); > > /* String length optimization is implemented as a walk of the dominator > @@ -3220,7 +3235,11 @@ pass_strlen::execute (function *fun) > laststmt.len = NULL_TREE; > laststmt.stridx = 0; > > - strlen_to_stridx.empty (); > + if (strlen_to_stridx) > + { > + delete strlen_to_stridx; > + strlen_to_stridx = NULL; > + } > > return 0; > } > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE LINUX GmbH, GF: Felix Imendoerffer, Jane Smithard, Graham Norton, HRB 21284 (AG Nuernberg)