This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH] Fix PR rtl-optimization/61278


On Fri, May 23, 2014 at 12:33 PM, Zhenqiang Chen
<zhenqiang.chen@linaro.org> wrote:
> On 23 May 2014 17:05, Richard Biener <richard.guenther@gmail.com> wrote:
>> On Fri, May 23, 2014 at 9:23 AM, Zhenqiang Chen
>> <zhenqiang.chen@linaro.org> wrote:
>>> Hi,
>>>
>>> The patch fixes PR rtl-optimization/61278. Root cause for issue is
>>> that df_live does not exist at -O1.
>>>
>>> Bootstrap and no make check regression on X86-64.
>>>
>>> OK for trunk?
>>
>> Why do you need to give up?  It seems you can simply avoid
>> marking the block as dirty (though df_get_live_in/out also hands you
>> back DF_LR_IN/OUT if !df_live).  So isn't the df_grow_bb_info the
>> "real" fix?
>
> The df_get_live_in of the new basic block will be used to analyse
> later INSNs. If it is not set or incorrect, it will impact on later
> analysis.
> df_grow_bb_info is to make sure the live_in data structure is
> allocated for the new basic block (although I have not found any case
> fail without it). After bitmap_copy(...), we can use it for later
> INSNs.
>
>> Note that df_get_live_in/out are functions tailored to IRA that
>> knows that they handle both df_live and df_lr dependent on
>> optimization level.  Is shrink-wrapping supposed to work with
>> both problems as well?
>
> Yes. But it seams not perfect to handle df_lr problem. When I fixed PR
> 57637 (https://gcc.gnu.org/ml/gcc-patches/2013-07/msg00897.html), we
> selected "if DF_LIVE doesn't exist, i.e. at -O1, just give up
> searching NEXT_BLOCK."

Ok, I see.  Maybe it would be better to completely disable
shrink-wrapping when LIVE is not available.

Patch is ok.

Thanks,
Richard.

> Thanks!
> -Zhenqiang
>
>>>
>>> ChangeLog:
>>> 2014-05-23  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
>>>
>>>         PR rtl-optimization/61278
>>>         * shrink-wrap.c (move_insn_for_shrink_wrap): Check df_live.
>>>
>>> testsuite/ChangeLog:
>>> 2014-05-23  Zhenqiang Chen  <zhenqiang.chen@linaro.org>
>>>
>>>         * gcc.dg/lto/pr61278_0.c: New test.
>>>         * gcc.dg/lto/pr61278_1.c: New test.
>>>
>>> diff --git a/gcc/shrink-wrap.c b/gcc/shrink-wrap.c
>>> index f09cfe7..be17829 100644
>>> --- a/gcc/shrink-wrap.c
>>> +++ b/gcc/shrink-wrap.c
>>> @@ -204,8 +204,15 @@ move_insn_for_shrink_wrap (basic_block bb, rtx insn,
>>>    /* Create a new basic block on the edge.  */
>>>    if (EDGE_COUNT (next_block->preds) == 2)
>>>      {
>>> +      /* If DF_LIVE doesn't exist, i.e. at -O1, just give up.  */
>>> +      if (!df_live)
>>> +       return false;
>>> +
>>>        next_block = split_edge (live_edge);
>>>
>>> +      /* We create a new basic block.  Call df_grow_bb_info to make sure
>>> +        all data structures are allocated.  */
>>> +      df_grow_bb_info (df_live);
>>>        bitmap_copy (df_get_live_in (next_block), df_get_live_out (bb));
>>>        df_set_bb_dirty (next_block);
>>>
>>> diff --git a/gcc/testsuite/gcc.dg/lto/pr61278_0.c
>>> b/gcc/testsuite/gcc.dg/lto/pr61278_0.c
>>> new file mode 100644
>>> index 0000000..03a24ae
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gcc.dg/lto/pr61278_0.c
>>> @@ -0,0 +1,30 @@
>>> +/* { dg-lto-do link } */
>>> +/* { dg-lto-options { { -flto -O0 } } } */
>>> +/* { dg-extra-ld-options " -flto -O1 " } */
>>> +
>>> +static unsigned int
>>> +fn1 (int p1, int p2)
>>> +{
>>> +  return 0;
>>> +}
>>> +
>>> +char a, b, c;
>>> +
>>> +char
>>> +foo (char *p)
>>> +{
>>> +  int i;
>>> +  for (b = 1 ; b > 0; b++)
>>> +    {
>>> +      for (i = 0; i < 2; i++)
>>> +       ;
>>> +      for (a = 1; a > 0; a++)
>>> +       {
>>> +         char d[1] = { 0 };
>>> +         if (*p)
>>> +           break;
>>> +         c ^= fn1 (fn1 (fn1 (0, 0), 0), 0);
>>> +       }
>>> +    }
>>> +  return 0;
>>> +}
>>> diff --git a/gcc/testsuite/gcc.dg/lto/pr61278_1.c
>>> b/gcc/testsuite/gcc.dg/lto/pr61278_1.c
>>> new file mode 100644
>>> index 0000000..b02c8ac
>>> --- /dev/null
>>> +++ b/gcc/testsuite/gcc.dg/lto/pr61278_1.c
>>> @@ -0,0 +1,13 @@
>>> +/* { dg-lto-do link } */
>>> +/* { dg-lto-options { { -flto -O1 } } } */
>>> +
>>> +extern char foo (char *);
>>> +
>>> +char d;
>>> +
>>> +int
>>> +main ()
>>> +{
>>> +  foo (&d);
>>> +  return 0;
>>> +}


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]