On Tue, Mar 22, 2016 at 2:45 PM, Prathamesh Kulkarni <prathamesh.kulka...@linaro.org> wrote: > On 22 March 2016 at 16:26, Richard Biener <richard.guent...@gmail.com> wrote: >> On Tue, Mar 22, 2016 at 12:08 AM, Prasad Ghangal >> <prasad.ghan...@gmail.com> wrote: >>> Hi! >>> >>> How exactly can we achieve start stop compilation on specific pass (ie >>> run single pass on input)? >>> >>> eg. $cgimple -ftree-copyrename foo.c >>> >>> should produce optimization result of -ftree-copyrename pass on foo.c input >> >> You need pass manager support and annotate each function with information >> on what passes should be run (in which order even?). I think for the GSoC >> project specifying a starting pass for each function via the source, like >> >> __GIMPLE (tree-copyrename) void foo (void) >> { >> ... >> } >> >> and hacking the pass manager to honor that is enough. > Um would annotating each function with pass order work for ipa passes too ?
There is no single point of execution for an IPA pass so no - you can tag it with one of the umbrella passes I guess. I suppose we'd need some magic "phase" tags for this, like simply "IPA". You then need to enable/disable IPA passes you want to run. Richard. > Thanks, > Prathamesh >> >> Richard. >> >>> >>> >>> On 21 March 2016 at 09:05, Trevor Saunders <tbsau...@tbsaunde.org> wrote: >>>> On Mon, Mar 21, 2016 at 04:43:35AM +0530, Prasad Ghangal wrote: >>>>> Hi! >>>>> >>>>> Sorry for the late reply. >>>>> >>>>> I was observing gimple dumps and my initial findings are, to parse >>>>> gimple, we have to add support for following components to C FE >>>>> >>>>> *basic blocks >>>> >>>> I'd think you can probably make these enough like C labels that you >>>> don't need to do anything special in the C fe to parse these. Just >>>> removing the < and > gets you pretty close is that it? >>>> >>>>> *gimple labels and goto >>>> >>>> Similar I think. >>>> >>>>> *gimple phi functions >>>>> iftmp_0_1 = PHI (ftmp_0_3, iftmp_0_4) >>>> >>>> yesI think you need to add something here. I think you can do it as a >>>> builtin type function that expects its arguments to be labels or names >>>> of variables. >>>> >>>>> *gimple switch >>>>> switch (a_1) <default: <L0>, case 1: <L1>, case 2: <L2>> >>>> >>>> I'd think we could make this more C like too. >>>> >>>>> *gimple exception handling >>>> >>>> yeah, though note exceptions are lowered pretty quickly so supporting >>>> them with the explicit exception syntax probably isn't particularly >>>> important. >>>> >>>>> *openmp functions like >>>>> main._omp_fn.0 (void * .omp_data_i) >>>> >>>> I'd think you'd want to change the duping of this some to make it easier >>>> to tell from struct.some.member. >>>> >>>>> Please correct me if I am wrong. Also point out if I am missing anything >>>> >>>> I think you might need to do something about variable names? >>>> >>>> Trev >>>> >>>>> >>>>> >>>>> >>>>> >>>>> On 18 March 2016 at 14:53, Richard Biener <richard.guent...@gmail.com> >>>>> wrote: >>>>> > On Fri, Mar 18, 2016 at 6:55 AM, Prathamesh Kulkarni >>>>> > <prathamesh.kulka...@linaro.org> wrote: >>>>> >> On 15 March 2016 at 20:46, Richard Biener <richard.guent...@gmail.com> >>>>> >> wrote: >>>>> >>> On Mon, Mar 14, 2016 at 7:27 PM, Michael Matz <m...@suse.de> wrote: >>>>> >>>> Hi, >>>>> >>>> >>>>> >>>> On Thu, 10 Mar 2016, Richard Biener wrote: >>>>> >>>> >>>>> >>>>> Then I'd like to be able to re-construct SSA without jumping through >>>>> >>>>> hoops (usually you can get close but if you require copies >>>>> >>>>> propagated in >>>>> >>>>> a special way you are basically lost for example). >>>>> >>>>> >>>>> >>>>> Thus my proposal to make the GSoC student attack the unit-testing >>>>> >>>>> problem by doing modifications to the pass manager and "extending" >>>>> >>>>> an >>>>> >>>>> existing frontend (C for simplicity). >>>>> >>>> >>>>> >>>> I think it's wrong to try to shoehorn the gimple FE into the C FE. >>>>> >>>> C is >>>>> >>>> fundamentally different from gimple and you'd have to sprinkle >>>>> >>>> gimple_dialect_p() all over the place, and maintaining that while >>>>> >>>> developing future C improvements will turn out to be much work. Some >>>>> >>>> differences of C and gimple: >>>>> >>>> >>>>> >>>> * C has recursive expressions, gimple is n-op stmts, no expressions >>>>> >>>> at all >>>>> >>>> * C has type promotions, gimple is explicit >>>>> >>>> * C has all other kinds of automatic conversion (e.g. pointer decay) >>>>> >>>> * C has scopes, gimple doesn't (well, global and local only), i.e. >>>>> >>>> symbol >>>>> >>>> lookup is much more complicated >>>>> >>>> * C doesn't have exceptions >>>>> >>>> * C doesn't have class types, gimple has >>>>> >>>> * C doesn't have SSA (yes, I'm aware of your suggestions for that) >>>>> >>>> * C doesn't have self-referential types >>>>> >>>> * C FE generates GENERIC, not GIMPLE (so you'd need to go through the >>>>> >>>> gimplifier and again would feed gimple directly into the passes) >>>>> >>>> >>>>> >>>> I really don't think changing the C FE to accept gimple is a useful >>>>> >>>> way >>>>> >>>> forward. >>>>> >>> >>>>> >>> So I am most worried about replicating all the complexity of types >>>>> >>> and decl >>>>> >>> parsing for the presumably nice and small function body parser. >>>>> >> Um would it be a good idea if we separate "gimple" functions from >>>>> >> regular C functions, >>>>> >> say by annotating the function definition with "gimple" attribute ? >>>>> > >>>>> > Yes, that was my idea. >>>>> > >>>>> >> A "gimple" function should contain only gimple stmts and not C. >>>>> >> eg: >>>>> >> __attribute__((gimple)) >>>>> >> void foo(void) >>>>> >> { >>>>> >> // local decls/initializers in C >>>>> >> // GIMPLE body >>>>> >> } >>>>> >> Or perhaps we could add a new keyword "gimple" telling C FE that this >>>>> >> is a GIMPLE function. >>>>> > >>>>> > Though instead of an attribute I would indeed use a new keyword (as you >>>>> > can't really ignore the attribute and it should be an error with >>>>> > compilers >>>>> > not knowing it). Thus sth like >>>>> > >>>>> > void foo (void) >>>>> > __GIMPLE { >>>>> > } >>>>> > >>>>> > as it's also kind-of a "definition" specifier rather than a >>>>> > declaration specifier. >>>>> > >>>>> >> >>>>> >> My intention is that we could reuse C FE for parsing types and decls >>>>> >> (which I suppose is the primary >>>>> >> motivation behind reusing C FE) and avoid mixing C statements with >>>>> >> GIMPLE by having a separate >>>>> >> GIMPLE parser for parsing GIMPLE functions. >>>>> >> (I suppose the GIMPLE function parser would need to do minimal parsing >>>>> >> of decls/types to recognize >>>>> >> the input is a declaration and call C parsing routines for parsing the >>>>> >> whole decl) >>>>> > >>>>> > Yes, eventually the C frontend provides routines that can be used >>>>> > to tentatively parse declarations / types used in the function. >>>>> > >>>>> >> When C front-end is invoked with -fgimple it should probably only >>>>> >> accept functions marked as "gimple". >>>>> >> Does this sound reasonable ? >>>>> > >>>>> > I think -fgimple would only enable recognizing the __GIMPLE keyword, >>>>> > I wouldn't change all defs to GIMPLE with it. >>>>> > >>>>> > Richard. >>>>> > >>>>> >> Thanks, >>>>> >> Prathamesh >>>>> >>> >>>>> >>> In private discussion we somewhat agreed (Micha - correct me ;)) that >>>>> >>> iff the GIMPLE FE would replace the C FE function body parsing >>>>> >>> completely (re-using name lookup infrastructure of course) and iff the >>>>> >>> GIMPLE FE would emit GIMPLE directly (just NULL DECL_SAVED_TREE >>>>> >>> and a GIMPLE seq in DECL_STRUCT_FUNCTION->gimple_body) >>>>> >>> then "re-using" the C FE would be a way to greatly speed up success. >>>>> >>> >>>>> >>> The other half of the project would then be to change the pass manager >>>>> >>> to do something sensible with the produced GIMPLE as well as making >>>>> >>> our dumps parseable by the GIMPLE FE. >>>>> >>> >>>>> >>> Richard. >>>>> >>>>> >>>>> >>>>> -- >>>>> Thanks and Regards, >>>>> Prasad Ghangal >>> >>> >>> >>> -- >>> Thanks and Regards, >>> Prasad Ghangal