On July 18, 2016 8:28:15 PM GMT+02:00, Prasad Ghangal 
<prasad.ghan...@gmail.com> wrote:
>On 15 July 2016 at 16:13, Richard Biener <richard.guent...@gmail.com>
>wrote:
>> On Sun, Jul 10, 2016 at 6:13 PM, Prasad Ghangal
>> <prasad.ghan...@gmail.com> wrote:
>>> On 8 July 2016 at 13:13, Richard Biener <richard.guent...@gmail.com>
>wrote:
>>>> On Thu, Jul 7, 2016 at 9:45 PM, Prasad Ghangal
><prasad.ghan...@gmail.com> wrote:
>>>>> On 6 July 2016 at 14:24, Richard Biener
><richard.guent...@gmail.com> wrote:
>>>>>> On Wed, Jul 6, 2016 at 9:51 AM, Prasad Ghangal
><prasad.ghan...@gmail.com> wrote:
>>>>>>> On 30 June 2016 at 17:10, Richard Biener
><richard.guent...@gmail.com> wrote:
>>>>>>>> On Wed, Jun 29, 2016 at 9:13 PM, Prasad Ghangal
>>>>>>>> <prasad.ghan...@gmail.com> wrote:
>>>>>>>>> On 29 June 2016 at 22:15, Richard Biener
><richard.guent...@gmail.com> wrote:
>>>>>>>>>> On June 29, 2016 6:20:29 PM GMT+02:00, Prathamesh Kulkarni
><prathamesh.kulka...@linaro.org> wrote:
>>>>>>>>>>>On 18 June 2016 at 12:02, Prasad Ghangal
><prasad.ghan...@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.

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
>>>>>>>>>>
>>>>>>>>>>


Reply via email to