On Fri, Sep 4, 2020 at 4:36 PM Erick Ochoa <erick.oc...@theobroma-systems.com> wrote: > > > > On 04/09/2020 15:19, Richard Biener wrote: > > On Fri, Sep 4, 2020 at 10:13 AM Erick Ochoa > > <erick.oc...@theobroma-systems.com> wrote: > >> > >> > >> > >> On 03/09/2020 12:19, Richard Biener wrote: > >>> On Thu, Sep 3, 2020 at 10:58 AM Jakub Jelinek via Gcc <gcc@gcc.gnu.org> > >>> wrote: > >>>> > >>>> On Thu, Sep 03, 2020 at 10:22:52AM +0200, Erick Ochoa wrote: > >>>>> So, I am just wondering is there an interface where I could do something > >>>>> like: > >>>>> > >>>>> ``` > >>>>> // vars is the field in pt_solution of type bitmap > >>>>> EXECUTE_IF_SET_IN_BITMAP (vars, 0, uid, bi) > >>>>> { > >>>>> // uid is set > >>>>> tree pointed_to = get_tree_with_uid(uid); > >>>>> } > >>>>> ``` > >>>> > >>>> There is not. > >>> > >>> And there cannot be since the solution includes UIDs of > >>> decls that are "fake" and thus never really existed. > >> > >> Hi Richard and Jakub, > >> > >> thanks, I was looking for why get_tree_with_uid might be a somewhat bad > >> idea. > >> > >> I am thinking about representing an alias set similarly to the > >> pt_solution. Instead of having bits set in position of points-to > >> variables UIDs, I was thinking about having bits set in position of > >> may-alias variables' UIDs. I think an interface similar to the one I > >> described can provide a good mechanism of jumping to different aliases, > >> but I do agree that HEAP variables and shadow_variables (and perhaps > >> other fake variables) might not be a good idea to keep in the interface > >> to avoid jumping to trees which do not represent something in gimple. > >> > >> Richard, you mentioned in another e-mail that I might want to provide > >> the alias-sets from IPA-PTA to another pass in a similar way to > >> ipa_escape_pt. I think using a structure similar to pt_solution for > >> may-alias solution is a good idea. Again, the bitmap to aliasing > >> variables in UIDs. However, I think for this solution to be general I > >> need several of these structs not just one. Ideally one per candidate > >> alias-set, at most one per variable. > > > > Sure, you need one per alias-set. Indeed you might want to work > > with bitmaps of varinfo IDs first when computing alias-sets > > since ... > > Yes, that's what I've been doing :) > > >>> > >>> I think you need to first get a set of candidates you want to > >>> transform (to limit the work done below), then use the > >>> internal points-to solutions and compute alias sets for this > >>> set plus the points-to solution this alias-set aliases. > > >>> You can then keep the candidate -> alias-set ID -> points-to > >>> relation (thus candidates should not be "all variables" for > >>> efficiency reasons). > >> > >> I think I can use a relatively simple heuristic: start by looking at > >> malloc statements and obtain the alias-sets for variables which hold > >> malloc's return values. This should address most efficiency concerns. > >> > >> So, I'm thinking about the following: > >> > >> * obtain variables which hold the result of malloc. These are the > >> initial candidates. > > > > ... those would be the is_heapvar ones. Since you can probably > > only handle the case where all pointers either only point to a > > single allocation sites result and nothing else or not to it that case > > looks special and thus easy anyway. > > I did a git grep and is_heapvar is gone. But, I believe that I still > collect these variables as quickly as possible. I iterate over the call > graph and if I find malloc, then I just look at the callers and collect > the lhs. This lhs corresponds to the "decl" in the varinfo_t struct. > > I then just iterate over the variables in varmap to find matching lhs > with the decl and computing alias sets by looking at the intersection of > pt_solution. This seems to work well. I still need to find out whether > they escape, but it should be simple to do so from here. > > > > >> * for initial candidates compute alias-sets as bitmaps where only "real" > >> decl UIDs are set. Compute this just before the end of IPA-PTA. > >> * for each alias_set: > >> for each alias: > >> map[alias->decl] = alias_set > >> * Use this map and the alias-sets bitmaps in pass just after IPA-PTA. > >> * Potentially use something similar to get_tree_with_uid but that is > >> only valid for trees which are keys in the map. > > > > Hmm, isn't this more than you need? Given a set of candidates C > > you try to form alias-sets so that all members of an alias set A > > are members of C, they are layout-compatible and not member > > of another alias-set. Plus no member escapes and all pointers > > you can track may only point to a subset of a single alias-set. > > Yes? I'm not really sure what you are trying to say here. Can you please > elaborate more on "this" in the sentence "isn't this more than you need?". > > I think I need a way that given some tree (which I know is in > candidates) I can refer to its alias set. Since the given set of > candidates might have more than 1 opportunity for transformation (i.e. > computing the alias-sets for all c in C yields two distinct alias sets > A_0 = {c_0, c_1, ... c_x}, A_1 = {c_x+1, ... c_y} ) I need a way of > referring to these distinct alias sets. Here, I was hoping to refer to > alias sets by the members of the sets themselves. > > c_0 -> A_0 > c_1 -> A_0 > ... > c_x+1 -> A_1 > c_x+2 -> A_1 > > The get_tree_with_uid interface is more of a quick way to find out if > they are layout compatible. Because if we have a bitmap... > > for a in A_0: > for b in A_0: > tree_a = get_tree_with_uid(a) > tree_b = get_tree_with_uid(b) > if (!layout_compatible(tree_a, tree_b)) return false;
Hmm, I thought you'd maybe do the following when you need to merge two alias sets: if (!layout_compatible (pick-one-from-A1, pick-one-from-A2)) mark result as alias-set of non-eligible vars so you'd end up with alias-sets that only contain layout compatible members or are marked as containing non-(no longer-)candidates only. You can then continue by walking / remembering the "good" alias-sets only. Richard. > > > > > From the above C is what constrains the size of your sets and > > the mapping. > > > >> Does this sound reasonable? > >> > >>> > >>> Richard. > >>> > >>>> Jakub > >>>>