On 04 Jun 11:59, Richard Biener wrote:
> On Wed, Jun 4, 2014 at 8:46 AM, Jeff Law <l...@redhat.com> wrote:
> > On 06/03/14 03:29, Richard Biener wrote:
> >>
> >> On Tue, Jun 3, 2014 at 7:55 AM, Ilya Enkovich <enkovich....@gmail.com>
> >> wrote:
> >>>
> >>> 2014-06-02 21:27 GMT+04:00 Jeff Law <l...@redhat.com>:
> >>>>
> >>>> On 06/02/14 04:48, Ilya Enkovich wrote:
> >>>>>>
> >>>>>>
> >>>>>> 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.
> >>>>
> >>>>
> >>>> Downthread you indicated you're not in SSA form which might explain the
> >>>> inconsistency here.  If so, then we need to make sure that the loop & df
> >>>> structures do get set up properly later.
> >>>
> >>>
> >>> That is what init_data_structures pass will do for us as Richard pointed.
> >>> Right?
> >>
> >>
> >> loops are set up during the CFG construction and thus are available
> >> everywhere.
> >
> > Which would argue that the hunk that checks for the loop tree's existence
> > before accessing it should not be needed.  Ilya -- is it possible you hit
> > this prior to Richi's work to build the loop structures as part of CFG
> > construction and maintain them throughout compilation.
> 
> That's likely.  It's still on my list of janitor things to do to remove all
> those if (current_loops) checks ...

I tried to remove this loops check and got no failures this time.  So, here is 
a new patch version.

Bootstrapped and tested on linux-x86_64.

Thanks,
Ilya
--
gcc/

2014-06-05  Ilya Enkovich  <ilya.enkov...@intel.com>

        * tree-inline.c (tree_function_versioning): Check DF info existence
        before accessing it.


diff --git a/gcc/tree-inline.c b/gcc/tree-inline.c
index 4293241..2972346 100644
--- a/gcc/tree-inline.c
+++ b/gcc/tree-inline.c
@@ -5350,8 +5350,9 @@ tree_function_versioning (tree old_decl, tree new_decl,
   DECL_ARGUMENTS (new_decl) = DECL_ARGUMENTS (old_decl);
   initialize_cfun (new_decl, old_decl,
                   old_entry_block->count);
-  DECL_STRUCT_FUNCTION (new_decl)->gimple_df->ipa_pta
-    = id.src_cfun->gimple_df->ipa_pta;
+  if (DECL_STRUCT_FUNCTION (new_decl)->gimple_df)
+    DECL_STRUCT_FUNCTION (new_decl)->gimple_df->ipa_pta
+      = id.src_cfun->gimple_df->ipa_pta;
 
   /* Copy the function's static chain.  */
   p = DECL_STRUCT_FUNCTION (old_decl)->static_chain_decl;

Reply via email to