On Tue, Jul 19, 2016 at 10:09 PM, Prasad Ghangal <prasad.ghan...@gmail.com> wrote: > On 19 July 2016 at 11:04, Richard Biener <richard.guent...@gmail.com> wrote: >> On July 18, 2016 11:05:58 PM GMT+02:00, David Malcolm <dmalc...@redhat.com> >> wrote: >>>On Tue, 2016-07-19 at 00:52 +0530, Prasad Ghangal wrote: >>>> On 19 July 2016 at 00:25, Richard Biener <richard.guent...@gmail.com> >>>> wrote: >>>> > 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. >>>> > >>>> >>>> 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} >>> >>>What is the number? I'm wondering if it's somehow been lexed as a >>>decimal ".1" i.e. if the "." is somehow being treated as part of the >>>CPP_NUMBER. >> > > Yes, the token '.1' is treated as CPP_NUMBER > >> Ah, possible... >> >>>FWIW, I find hacking in calls to "inform" very useful for seeing what >>>each token is (assuming that caret printing isn't disabled). >>> >>> (gdb) call inform ($3->location, "") >>> (gdb) call inform ($4->location, "") >>> (gdb) call inform ($5 >>>->location, "") >>> >>>etc >>> >>>BTW, does it have to be '.' as the SSA_NAME separator? Could it be a >>>different character e.g. '@' or something else that's non-legal in C? >> >> It doesn't have to be '.', but sth visually not too disturbing would be >> nice. If we don't go with '.' We can as well try to parse the SSA version >> from i_1, leaving the ambiguity with it being a valid C identifier. >> > > As special characters are not valid in C, I am using 'a..1' as syntax > for ssa name. For parsing I am using > + lhs.value = make_ssa_name_fn (cfun, > + lookup_name (c_parser_peek_token > (parser)->value), > + NULL); > Now for passing ssa name into __PHI, how can we lookup for particular ssa > name. > Or is there other better method to do it?
Note that with this you need to preserve SSA versions as used in the source (the 1 in a..1). If you can do that (see below) the way to lookup an SSA name is simply calling 'ssa_name (version)' with version being an integer with the version number. make_ssa_name will simply allocate the next available SSA version so you'll need to add an interface that allows you allocation of a specific SSA version. Like with sth similar to Index: gcc/tree-ssanames.c =================================================================== --- gcc/tree-ssanames.c (revision 238512) +++ gcc/tree-ssanames.c (working copy) @@ -255,7 +255,7 @@ used without a preceding definition). */ tree -make_ssa_name_fn (struct function *fn, tree var, gimple *stmt) +make_ssa_name_fn (struct function *fn, tree var, gimple *stmt, int version) { tree t; use_operand_p imm; @@ -265,8 +265,17 @@ || TREE_CODE (var) == RESULT_DECL || (TYPE_P (var) && is_gimple_reg_type (var))); + if (version != 0) + { + t = make_node (SSA_NAME); + SSA_NAME_VERSION (t) = version; + vec_safe_grow_cleared (SSANAMES (fn), version + 1); + gcc_assert ((*SSANAMES (fn))[version] == NULL); + (*SSANAMES (fn))[version] = t; + ssa_name_nodes_created++; + } /* If our free list has an element, then use it. */ - if (!vec_safe_is_empty (FREE_SSANAMES (fn))) + else if (!vec_safe_is_empty (FREE_SSANAMES (fn))) { t = FREE_SSANAMES (fn)->pop (); ssa_name_nodes_reused++; Index: gcc/tree-ssanames.h =================================================================== --- gcc/tree-ssanames.h (revision 237253) +++ gcc/tree-ssanames.h (working copy) @@ -79,7 +79,7 @@ extern void init_ssanames (struct function *, int); extern void fini_ssanames (struct function *); extern void ssanames_print_statistics (void); -extern tree make_ssa_name_fn (struct function *, tree, gimple *); +extern tree make_ssa_name_fn (struct function *, tree, gimple *, int); extern void release_ssa_name_fn (struct function *, tree); extern bool get_ptr_info_alignment (struct ptr_info_def *, unsigned int *, unsigned int *); where you can then do sth like ssaname = ssa_name (version); if (!ssaname) ssaname = make_ssa_name_fn (cfun, lookup_name (...), NULL, version); to either lookup an existing or allocate a new SSA name of the desired version. Just for some bike-shedding, I don't like using '..' too much ;) Richard. > >> Richard. >> >>>Dave >> >>