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.

Thanks,
Richard.

> Thanks,
> Prasad
>
>> Richard.
>>
>>>> Richard.
>>>>
>>>>>Thanks,
>>>>>Prathamesh
>>>>>>
>>>>>>
>>>>>>
>>>>>> Thanks,
>>>>>> Prasad Ghangal
>>>>
>>>>

Reply via email to