This is the mail archive of the gcc@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: [gimplefe] hacking pass manager


On 19 July 2016 at 00:25, Richard Biener <richard.guenther@gmail.com> wrote:
> On July 18, 2016 8:28:15 PM GMT+02:00, Prasad Ghangal <prasad.ghangal@gmail.com> wrote:
>>On 15 July 2016 at 16:13, Richard Biener <richard.guenther@gmail.com>
>>wrote:
>>> On Sun, Jul 10, 2016 at 6:13 PM, Prasad Ghangal
>>> <prasad.ghangal@gmail.com> wrote:
>>>> On 8 July 2016 at 13:13, Richard Biener <richard.guenther@gmail.com>
>>wrote:
>>>>> On Thu, Jul 7, 2016 at 9:45 PM, Prasad Ghangal
>><prasad.ghangal@gmail.com> wrote:
>>>>>> On 6 July 2016 at 14:24, Richard Biener
>><richard.guenther@gmail.com> wrote:
>>>>>>> On Wed, Jul 6, 2016 at 9:51 AM, Prasad Ghangal
>><prasad.ghangal@gmail.com> wrote:
>>>>>>>> On 30 June 2016 at 17:10, Richard Biener
>><richard.guenther@gmail.com> wrote:
>>>>>>>>> On Wed, Jun 29, 2016 at 9:13 PM, Prasad Ghangal
>>>>>>>>> <prasad.ghangal@gmail.com> wrote:
>>>>>>>>>> On 29 June 2016 at 22:15, Richard Biener
>><richard.guenther@gmail.com> wrote:
>>>>>>>>>>> On June 29, 2016 6:20:29 PM GMT+02:00, Prathamesh Kulkarni
>><prathamesh.kulkarni@linaro.org> wrote:
>>>>>>>>>>>>On 18 June 2016 at 12:02, Prasad Ghangal
>><prasad.ghangal@gmail.com>
>>>>>>>>>>>>wrote:
>>>>>>>>>>>>> Hi,
>>>>>>>>>>>>>
>>>>>>>>>>>>> I tried hacking pass manager to execute only given passes.
>>For this I
>>>>>>>>>>>>> am adding new member as opt_pass *custom_pass_list to the
>>function
>>>>>>>>>>>>> structure to store passes need to execute and providing the
>>>>>>>>>>>>> custom_pass_list to execute_pass_list() function instead of
>>all
>>>>>>>>>>>>passes
>>>>>>>>>>>>>
>>>>>>>>>>>>> for test case like-
>>>>>>>>>>>>>
>>>>>>>>>>>>> int a;
>>>>>>>>>>>>> void __GIMPLE (execute ("tree-ccp1", "tree-fre1")) foo()
>>>>>>>>>>>>> {
>>>>>>>>>>>>> bb_1:
>>>>>>>>>>>>>   a = 1 + a;
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>> it will execute only given passes i.e. ccp1 and fre1 pass
>>on the
>>>>>>>>>>>>function
>>>>>>>>>>>>>
>>>>>>>>>>>>> and for test case like -
>>>>>>>>>>>>>
>>>>>>>>>>>>> int a;
>>>>>>>>>>>>> void __GIMPLE (startwith ("tree-ccp1")) foo()
>>>>>>>>>>>>> {
>>>>>>>>>>>>> bb_1:
>>>>>>>>>>>>>   a = 1 + a;
>>>>>>>>>>>>> }
>>>>>>>>>>>>>
>>>>>>>>>>>>> it will act as a entry point to the pipeline and will
>>execute passes
>>>>>>>>>>>>> starting from given pass.
>>>>>>>>>>>>Bike-shedding:
>>>>>>>>>>>>Would it make sense to have syntax for defining pass ranges
>>to execute
>>>>>>>>>>>>?
>>>>>>>>>>>>for instance:
>>>>>>>>>>>>void __GIMPLE(execute (pass_start : pass_end))
>>>>>>>>>>>>which would execute all the passes within range [pass_start,
>>pass_end],
>>>>>>>>>>>>which would be convenient if the range is large.
>>>>>>>>>>>
>>>>>>>>>>> But it would rely on a particular pass pipeline, f.e.
>>pass-start appearing before pass-end.
>>>>>>>>>>>
>>>>>>>>>>> Currently control doesn't work 100% as it only replaces
>>all_optimizations but not lowering passes or early opts, nor IPA opts.
>>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> Each pass needs GIMPLE in some specific form. So I am letting
>>lowering
>>>>>>>>>> and early opt passes to execute. I think we have to execute
>>some
>>>>>>>>>> passes (like cfg) anyway to represent GIMPLE into proper form
>>>>>>>>>
>>>>>>>>> Yes, that's true.  Note that early opt passes only optimize but
>>we need
>>>>>>>>> pass_build_ssa_passes at least (for into-SSA).  For proper
>>unit-testing
>>>>>>>>> of GIMPLE passes we do need to guard off early opts somehow
>>>>>>>>> (I guess a simple if (flag_gimple && cfun->custom_pass_list)
>>would do
>>>>>>>>> that).
>>>>>>>>>
>>>>>>>>> Then there is of course the question about IPA passes which I
>>think is
>>>>>>>>> somewhat harder (one could always disable all IPA passes
>>manually
>>>>>>>>> via flags of course or finally have a global -fipa/no-ipa like
>>most
>>>>>>>>> other compilers).
>>>>>>>>>
>>>>>>>> Can we iterate through all ipa passes and do -fdisable-ipa-pass
>>or
>>>>>>>> -fenable-ipa-pass equivalent for each?
>>>>>>>
>>>>>>> We could do that, yes.  But let's postpone this issue.  I think
>>that
>>>>>>> startwith is going to be most useful and rather than constructing
>>>>>>> a pass list for it "native" support for it in the pass manager is
>>>>>>> likely to produce better results (add a 'startwith' member
>>alongside
>>>>>>> the pass list member and if it is set the pass manager skips all
>>>>>>> passes that do not match 'startwith' and once it reaches it it
>>clears
>>>>>>> the field).
>>>>>>>
>>>>>>> In the future I hope we can get away from a static pass list and
>>more
>>>>>>> towards rule-driven pass execution (we have all those PROP_*
>>stuff
>>>>>>> already but it isn't really used for example).  But well, that
>>would be
>>>>>>> a separate GSoC project ;)
>>>>>>>
>>>>>>> IMHO startwith will provide everything needed for unit-testing.
>>We can
>>>>>>> add a flag on whether further passes should be executed or not
>>and
>>>>>>> even a pass list like execute ("ccp1", "fre") can be implemented
>>by
>>>>>>> startwith ccp1 and then from there executing the rest of the
>>passes in the
>>>>>>> list and stopping at the end.
>>>>>>>
>>>>>>> As said, unit-testing should exercise a single pass if we can
>>control
>>>>>>> its input.
>>>>>>>
>>>>>> In this patch I am skipping execution of passes until
>>pass_startwith
>>>>>> is found. Unlike previous build, now pass manager executes all
>>passes
>>>>>> in pipeline starting from pass_startwith instead of just sub
>>passes.
>>>>>
>>>>> That looks good.  I wonder if
>>>>>
>>>>> +  if (startwith_p && cfun->startwith)
>>>>> +    {
>>>>> +      if (pass->name == cfun->pass_startwith->name
>>>>> +         || pass->name == "*clean_state")
>>>>>
>>>>> need better be strcmp ()s though.  Also the early optimization
>>pipeline
>>>>> should be executed with startwith support as well.
>>>>>
>>>>
>>>> This patch adds startwith support for early opt passes. But for
>>>> starting from some passes (like asan0, optimized) in all_passes
>>>> pipeline, it falils at verify_curr_properties in execute_one_pass
>>().
>>>> I wonder if we need to update properties after skipping each pass
>>>
>>> Yeah, it's not possible to start at arbitrary points with skipping
>>passes
>>> that provide a required property.  I suspect it's good enough that
>>we'll
>>> ICE if that happens.
>>>
>>> I see you are working on the dump-file side a bit now.  What is still
>>> missing after you got support for PHIs is parsing of SSA names.
>>> Without this unit-testing will be difficult at best.
>>>
>>> I think what we need to do is simplify the job of the parser and
>>> make the syntax we use to print SSA names a bit different.
>>> So rather than printing VAR_VERSION we need to choose a
>>> letter that is not part of a valid identifier before VERSION,
>>> like a dot '.'.  Thus we'd have i.1 instead of i_1 and we'd have
>>> .2 instead of _2 for an anonymous SSA name.  The advantage
>>> for non-anonymous names is that we can properly re-use the
>>> C frontends decl handling for declaring and looking up 'i'.
>>> The disadvantage is that for anonymous SSA names this isn't
>>> so easy which means we could choose to not support those
>>> for the moment and require fake decls for them.  In fact
>>> into-SSA will do the correct thing if we just treat them as decls,
>>> thus continue to dump them as _VERSION.
>>>
>>
>>I am little confused here about parsing 'i.1' because lexer drops DOT
>>token for syntax like NAME.NUMBER . Hence instead of 'i.1' parser
>>receives 'i1'
>
> Are you sure? You should get three tokens, one for 'i', one for the dot and
> One for '1'.  You'd lookup the first via the C frontend symbol table only.
>

Yes, I was also expecting that. For syntax like 'a.b' (ie name.name)
it gives proper 3 tokens but for syntax like 'a.1' it produces only 2.

This is what I observed while debugging "int a.1;"

(gdb) print *c_parser_peek_nth_token (parser, 1)
$3 = {type = CPP_KEYWORD, id_kind = C_ID_NONE, keyword = RID_INT,
  pragma_kind = PRAGMA_NONE, location = 242114, value = 0x7ffff65c82d0}
(gdb) print *c_parser_peek_nth_token (parser, 2)
$4 = {type = CPP_NAME, id_kind = C_ID_ID, keyword = RID_MAX,
  pragma_kind = PRAGMA_NONE, location = 242240, value = 0x7ffff66d0b90}
(gdb) print *c_parser_peek_nth_token (parser, 3)
$5 = {type = CPP_NUMBER, id_kind = C_ID_NONE, keyword = RID_MAX,
  pragma_kind = PRAGMA_NONE, location = 242273, value = 0x7ffff66e0030}


Thanks,
Prasad

> Richard.
>
>>> Another issue would be to preserve SSA name VERSIONS
>>> (the decl idea for anon ones doesn't work) or basic-block
>>> numbering/ordering (requires direct CFG construction).  Both
>>> are out-of-scope for the GSoC project I think.
>>>
>>> Richard.
>>>
>>>> Thanks,
>>>> Prasad
>>>>
>>>>> Richard.
>>>>>
>>>>>>> Thanks,
>>>>>>> Richard.
>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Prasad
>>>>>>>>
>>>>>>>>> Richard.
>>>>>>>>>
>>>>>>>>>>> Richard.
>>>>>>>>>>>
>>>>>>>>>>>>Thanks,
>>>>>>>>>>>>Prathamesh
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>>
>>>>>>>>>>>>> Thanks,
>>>>>>>>>>>>> Prasad Ghangal
>>>>>>>>>>>
>>>>>>>>>>>
>
>


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