[llvm-dev] Skip redundant checks in AliasSet::aliasesUnknownInst

Philip Reames via llvm-dev llvm-dev at lists.llvm.org
Wed Jan 27 14:37:35 PST 2016



On 01/27/2016 07:53 AM, Daniel Berlin wrote:
>
>
> On Wed, Jan 27, 2016 at 1:27 AM, Roman Gareev <gareevroman at gmail.com 
> <mailto:gareevroman at gmail.com>> wrote:
>
>     Thank you for the idea! Could you please explain it?
>
>
> Which part are you having trouble with, so i know where to concetrate?
>
>     If I’m not
>     mistaken, you advise to insert the unknown insts of an every AS from
>     AliasSetTracker::add(const AliasSetTracker &AST) into a smallptrset
>     and consequently append it to merged alias sets from
>     AliasSetTracker::findAliasSetForUnknownInst.
>
>
> Well, no. This is not the only place duplication can occur, because 
> the merging of unknownInsts can occur through findAliasSetForPointer 
> as well, if that AS has unknown instructions.
>
>
> See below.
>
>     I think that Philip
>     proposed something similar to your approach in
>     https://llvm.org/bugs/show_bug.cgi?id=23077.
>
>
> You reported that you are finding duplicates on the unknown inst list.
I don't see this in the bug report?
>
> The duplicates occur because we are not de-duplicating the unknowninst 
> lists attached to each AS when we merge them.
Danny, I think your analysis is incorrect. If we're merging two 
AliasSets, we have to consider where AliasSets can come from.  Each 
instruction initially ends up in exactly one AliasSet.  As a result, 
when we're merging two ASTs (which covered different loops/instructions 
by definition), we should never see the same instruction twice when 
merging AliasSets.

However, using a set to represent the unknown insts would still be 
useful.  In particular, it would give us a fastpath for determining if a 
particular unknown instruction was already in an alias set.  If we 
explicitly merged AliasSets from different ASTs (i.e. add all unknown at 
once to a single AliasSet, and then merge if needed), this would give us 
a fast way to avoid redundant aliasing checks when looking for things 
which need merged.
>
> If you look at the code in mergeSetIn (used by both 
> findAliasSetForPointer and findAliasSetForUnknownInst) you can see 
> when we merge AS's,  we simply append the list of unknowninsts from 
> one AS into the "destination" AS, without ever checking *whether that 
> destination AS already contains any of the same instructions on the 
> unknowninst list*.
>
> So things end up on the unknowninst lists multiple times.
>
> There are many ways to solve this:
>
> 1. Don't use lists at all for unknowninsts for each AS, use SmallSets 
> or SmallPtrSets instead.   Then any normal merging will deduplicate 
> them for you.
> or
> 2. When merging AS's, deduplicate the unknown inst list by temporarily 
> storing it in a set.
>
>
> #2 assumes that "merging AS's" is the only place that is causing 
> duplicates.
>
>
>     2016-01-24 22:44 GMT+05:00 Daniel Berlin <dberlin at dberlin.org
>     <mailto:dberlin at dberlin.org>>:
>     > It sounds like UnknownInsts should really be a SmallSet,
>     SmallPtrSet, or
>     > DenseSet (if you can't do the others).
>     >
>     > Otherwise, even with your patch, we are still wasting time
>     traversing and
>     > copying and .... the unknown instructions.
>     >
>     > If that doesn't work, I suspect the way you get dupes is through
>     mergeSetIn,
>     > so you also could probably just change:
>     >
>     > 00061   } else if (ASHadUnknownInsts) {
>     > 00062     UnknownInsts.insert(UnknownInsts.end(),
>     AS.UnknownInsts.begin(),
>     > AS.UnknownInsts.end());
>     > 00063     AS.UnknownInsts.clear();
>     > 00064   }
>     >
>     >
>     >
>     > You could insert the current unknown insts into a smallptrset,
>     and then only
>     > append them to UnknownInsts if they aren't in the set.
>     >
>     > This should remove your dupes.
>     >
>     >
>     >
>     > On Sun, Jan 24, 2016 at 5:28 AM, Roman Gareev via llvm-dev
>     > <llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>> wrote:
>     >>
>     >> Dear llvm contributors,
>     >>
>     >> Could you please advise me how to skip
>     >> checks, which are performed in AliasSet::aliasesUnknownInst, of
>     >> unknown instructions from different alias sets of an alias set
>     tracker
>     >> that is a parameter of ‘AliasSetTracker::add(const AliasSetTracker
>     >> &AST)’?
>     >>
>     >> If this wasn’t available at the moment and someone could review
>     me, I
>     >> would try to implement it. A temporary patch can be found attached
>     >> (for example, ViewedInst can become a second parameter of
>     >> AliasSetTracker::addUnknown ). It
>     >> passes the LLVM regression tests and helps to reduce the runtime of
>     >> 'opt -basicaa -licm out.opt.ll’ from 130ms to 67ms and the
>     runtime of
>     >> 'opt -basicaa -licm out.opt2.ll’ from 117ms to 62ms (out.opt.ll and
>     >> out.opt2.ll can be found on the following link
>     >> https://llvm.org/bugs/show_bug.cgi?id=23077).
>     >>
>     >> Thank you for the attention!
>     >>
>     >> --
>     >>                                     Cheers, Roman Gareev.
>     >>
>     >> _______________________________________________
>     >> LLVM Developers mailing list
>     >> llvm-dev at lists.llvm.org <mailto:llvm-dev at lists.llvm.org>
>     >> http://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-dev
>     >>
>     >
>
>
>
>     --
>                                         Cheers, Roman Gareev.
>
>

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20160127/e4a38436/attachment.html>


More information about the llvm-dev mailing list