This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: [gimplefe] Parsing PHI functions
- From: Richard Biener <richard dot guenther at gmail dot com>
- To: Prasad Ghangal <prasad dot ghangal at gmail dot com>
- Cc: gcc Mailing List <gcc at gcc dot gnu dot org>
- Date: Mon, 4 Jul 2016 11:47:30 +0200
- Subject: Re: [gimplefe] Parsing PHI functions
- Authentication-results: sourceware.org; auth=none
- References: <CAE+uiWYGhK8+Y55zmVwZx_zTrdruTdrmShdp6=Z=5-Yc7Gipmw@mail.gmail.com> <CAFiYyc0CUH4fLkJDkshhXbN0gcXY6e2jpD+FKu2-E5Yq+O60uQ@mail.gmail.com> <CAE+uiWYOwdQEkHSPwrF-j6NT0CWXEq8bFvZZ+0eHE8AnCC-o0g@mail.gmail.com> <CAFiYyc1ppsJNNubZcF5eHJKoHKAwAMJ40TA+Fb=iqf1epHhACw@mail.gmail.com> <CAE+uiWZKDz-ErXOpG-ih7LuY+p1eiqf_PTtRD1w=7cnvzoaD7Q@mail.gmail.com>
On Sun, Jul 3, 2016 at 9:34 AM, Prasad Ghangal <prasad.ghangal@gmail.com> wrote:
> In this patch, I am passing labels and vars with internal function and
> handling them in tree-cfg for parsing PHI.
> For first label, label_to_block() gives correct basic block and I am
> getting proper edges but for other labels the function is giving NULL.
>
> test-case :
>
> void __GIMPLE () foo()
> {
> int a;
> int a_2;
> int a_3;
> int a_1;
>
> bb_2:
> a_2 = 3;
> goto bb_4;
>
> bb_3:
> a_3 = 6;
> goto bb_4;
>
> bb_4:
> a_1 = __PHI (bb_2: a_2, bb_3: a_3);
> a_1 = a_1 + 1;
> return;
> }
>
The issue is probably you lower PHIs after cleanup_tree_cfg is run which may
end up removing labels. Or it is cleanup_dead_labels in build_gimple_cfg.
Richard.
>
>
>
> On 1 July 2016 at 17:33, Richard Biener <richard.guenther@gmail.com> wrote:
>> On Fri, Jul 1, 2016 at 1:57 PM, Prasad Ghangal <prasad.ghangal@gmail.com> wrote:
>>> On 29 June 2016 at 12:42, Richard Biener <richard.guenther@gmail.com> wrote:
>>>> On Tue, Jun 28, 2016 at 4:16 PM, Prasad Ghangal
>>>> <prasad.ghangal@gmail.com> wrote:
>>>>> Hi,
>>>>>
>>>>> For handling PHI, it expects cfg to be built before. So I was
>>>>> wondering how are we going to handle this? Do we need to build cfg
>>>>> while parsing only?
>>>>
>>>> For handling PHIs we need to have a CFG in the sense that the GIMPLE PHI
>>>> data structures are built in a way to have the PHI argument index correspond
>>>> to CFG predecessor edge index. As we'd like to parse phis with args
>>>> corresponding
>>>> to predecessor block labels, like
>>>>
>>>> a:
>>>> i_1 = 1;
>>>> goto p;
>>>>
>>>> b:
>>>> i_2 = 2;
>>>> goto p;
>>>>
>>>> p:
>>>> i_3 = __PHI (a: i_1, b: i_2);
>>>>
>>>> I think that a possibility is to leave those PHIs as internal function
>>>> with label / arg
>>>> pairs and have CFG construction lower them to real PHIs.
>>>>
>>>> Of course the parser could as well build a CFG on its own but I think
>>>> we should use
>>>> the easy way out for now.
>>>>
>>>> Thus you'd have to modify CFG construction a bit to lower the internal
>>>> function calls.
>>>
>>> Currently I am just building internal call using
>>> gimple_build_call_internal_vec (), and detecting (and removing for
>>> now) it after edge creation in tree-cfg. I was observing
>>> internal-fn.def, do I need to make entry in internal-fn.def and write
>>> expand function?
>>
>> You should add an entry and a stub expand function (like those
>> others that simply have gcc_unreachable in them).
>>
>> Richard.
>>
>>>>
>>>> Richard.
>>>>>
>>>>>
>>>>>
>>>>> Thanks,
>>>>> Prasad