On Mon, Jun 2, 2014 at 12:48 PM, Ilya Enkovich <enkovich....@gmail.com> wrote: > On 30 May 10:59, Jeff Law wrote: >> On 05/29/14 05:05, Ilya Enkovich wrote: >> >Hi, >> > >> >This patch allows to perform function versioning when some structures are >> >not available yet. It is required to make clones for Pointer Bounds >> >Checker right after SSA build. >> > >> >Bootstrapped and tested on linux-x86_64. >> > >> >Thanks, >> >Ilya >> >-- >> >gcc/ >> > >> >2014-05-29 Ilya Enkovich <ilya.enkov...@intel.com> >> > >> > * tree-inline.c (copy_cfg_body): Check loop tree >> > existence before accessing it. >> > (tree_function_versioning): Check DF info existence >> > before accessing it. >> > >> >diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c >> >index 4293241..23fef90 100644 >> >--- a/gcc/tree-inline.c >> >+++ b/gcc/tree-inline.c >> >@@ -2544,7 +2544,8 @@ copy_cfg_body (copy_body_data * id, gcov_type count, >> >int frequency_scale, >> > >> > /* If the loop tree in the source function needed fixup, mark the >> > destination loop tree for fixup, too. */ >> >- if (loops_for_fn (src_cfun)->state & LOOPS_NEED_FIXUP) >> >+ if (loops_for_fn (src_cfun) >> >+ && loops_for_fn (src_cfun)->state & LOOPS_NEED_FIXUP) >> > loops_state_set (LOOPS_NEED_FIXUP); >> Hmm, so if I understand things correctly, src_fun has no loop >> structures attached, thus there's nothing to copy. Presumably at >> some later point we build loop structures for the copy from scratch? > I suppose it is just a simple bug with absent NULL pointer check. Here is > original code: > > /* Duplicate the loop tree, if available and wanted. */ > if (loops_for_fn (src_cfun) != NULL > && current_loops != NULL) > { > copy_loops (id, entry_block_map->loop_father, > get_loop (src_cfun, 0)); > /* Defer to cfgcleanup to update loop-father fields of basic-blocks. */ > loops_state_set (LOOPS_NEED_FIXUP); > } > > /* If the loop tree in the source function needed fixup, mark the > destination loop tree for fixup, too. */ > if (loops_for_fn (src_cfun)->state & LOOPS_NEED_FIXUP) > loops_state_set (LOOPS_NEED_FIXUP); > > As you may see we have check for absent loops structure in the first > if-statement and no check in the second one. I hit segfault and added the > check.
Actually after SSA is built we always have loops (loops are built once we build the CFG which happens earlier). So all the above checks are no longer necessary now. >> >> Similarly for the PTA info, we just build it from scratch in the >> copy at some point? > > Here we also have conditional access like > > /* Reset the escaped solution. */ > if (cfun->gimple_df) > pt_solution_reset (&cfun->gimple_df->escaped); > > and following unconditional I've fixed. Likewise. The init_data_structures pass initializes this (init_tree_ssa). So I'm not sure why you need all this given we are in SSA form? Richard. >> >> Assuming the answers to both are yes, then this patch is OK for the >> trunk when the rest of the patches are approved. It's not great, >> bit it's OK. > > Thanks! > Ilya > >> >> jeff >>