[PATCH] D7864: This patch introduces MemorySSA, a virtual SSA form for memory.Details on what it looks like are in MemorySSA.h

Daniel Berlin via llvm-commits llvm-commits at lists.llvm.org
Thu Jan 7 18:29:35 PST 2016


Finding minimal vertex separators is np-hard in general.

However, if we can prove the ssa graph for memoryssa (which is a single-phi
world) is chordal, which i'm pretty sure it should be, we can find the
minimal vertex separators in linear time:
http://www.sciencedirect.com/science/article/pii/S0166218X98001231

I'm pretty sure with a little modification, you can play the same games to
find the property you are wanting.



On Thu, Jan 7, 2016 at 5:25 PM, Hal Finkel <hfinkel at anl.gov> wrote:

>
> ------------------------------
>
> *From: *"Daniel Berlin" <dberlin at dberlin.org>
> *To: *reviews+D7864+public+020798531ef64731 at reviews.llvm.org
> *Cc: *"Nick Lewycky" <nlewycky at google.com>, "Hal Finkel" <hfinkel at anl.gov>,
> anemet at apple.com, "Pete Cooper" <peter_cooper at apple.com>, "vikram
> tarikere" <vikram.tarikere at gmail.com>, "FĂ©lix Cloutier" <felixcca at yahoo.ca>,
> "David Majnemer" <david.majnemer at gmail.com>, "James Molloy" <
> james.molloy at arm.com>, "Philip Reames" <listmail at philipreames.com>,
> "Sanjoy Das" <sanjoy at playingwithpointers.com>, "llvm-commits" <
> llvm-commits at lists.llvm.org>
> *Sent: *Thursday, January 7, 2016 6:52:57 PM
> *Subject: *Re: [PATCH] D7864: This patch introduces MemorySSA, a virtual
> SSA form for memory.Details on what it looks like are in MemorySSA.h
>
>
>
>
> On Thu, Jan 7, 2016 at 4:48 PM, Daniel Berlin <dberlin at dberlin.org> wrote:
>
>>
>>
>> On Thu, Jan 7, 2016 at 4:27 PM, Hal Finkel <hfinkel at anl.gov> wrote:
>>
>>> hfinkel added inline comments.
>>>
>>> ================
>>> Comment at: lib/Transforms/Utils/MemorySSA.cpp:1124
>>> @@ +1123,3 @@
>>> +  auto CurrAccessPair = UpwardsBFSWalkAccess(StartingAccess, Prev, Q);
>>> +  // Either we will have found something that conflicts with us, or we
>>> will have
>>> +  // hit the liveOnEntry. Check for liveOnEntry.
>>> ----------------
>>> This algorithm in getClobberingMemoryAccess does not seem correct.
>>
>>
>>
>>> If we have this:
>>>
>>>      [ entry ]
>>>          |
>>>         ...
>>>          |
>>>      (clobbering access - a)
>>>         ...
>>>     /          \
>>>   ...         (clobbering access - b)
>>>    |              |
>>>   ...           ....
>>>    \              /
>>>           ...
>>>    (starting access)
>>>
>>> UpwardsBFSWalkAccess seems to walk upward until it finds its first
>>> clobbering access, and returns that when found. In the case above, if we
>>> find clobbering access (b) first, then we're okay, because we'll pick some
>>> dominating def farther down the path which is on all paths to both
>>> dominating accesses.
>>
>>
>>> But, if we hit clobbering access (a) first, then we'll accept that
>>> (incorrectly) as the new final access, because it dominates the original.
>>> However, not all paths to all aliasing defs terminate (or pass through)
>>> that access.
>>>
>>
>>
>> So, note, in the above case,  there *must* be a memory phi in the block
>> of starting access, merging the two memory accesses. We should say that is
>> the clobbering access.
>>
>>
>> But you are correct, that this version, in the middle of refactoring, did
>> not finish this rule correctly. The original algorithm only walked past a
>> phi if all paths away from the phi reached the same clobbering access.
>>
>
> That makes sense, thanks!
>
>
>> This one should do the same.
>>
> Yep, looks the same in this regard.
>
>
> (You can see this in the upwardsdfswalk code that got removed:
>
> Indeed; the version from April recursed on phis to enforce this condition.
>
>
>
>   // All the phi arguments should reach the same point if we can bypass
> -        // this phi.  The alternative is that they hit this phi node,
> which
> -        // means we can skip this argument.
> -        if (FirstDef && (CurrentPair.first != PHIPair.first &&
> -                         FirstDef != CurrentPair.first)) {
> -          ModifyingAccess = CurrAccess;
> -          break;
> -        } else if (!FirstDef) {
> -          FirstDef = CurrentPair.first;
> )
>
>
>
>
>>
>>
>>>   [entry]
>>>     |
>>>   .....
>>>   (clobbering access - b)
>>>    |
>>>   ....   ________________________________
>>>     \   /                                                               |
>>>      (x)                                                               |
>>>    ......                                                               |
>>>       |                                                                 |
>>>       |    ______________________                 |
>>>        \   /                                        |                   |
>>>   (starting access)                        |                   |
>>>        ...                                           |
>>>  |
>>>    (clobbering access - a)              |                   |
>>>       ...                                            |
>>>  |
>>>       | |                                            |
>>>  |
>>>       | |______________________|                   |
>>>       |
>>> |
>>>       |_________________________________|
>>>
>>>
>>
>> Again, we will have a memory phi node here, and we will say the phi node
>> is the clobbering access. We will walk one step from the phi, hit a, and
>> say "we have a clobbering access."
>>
>
> and by here i mean, you will have a memoryphi node in the block of
> startingaccess, and we should say that is the clobbering node.
>
>
>
> Yep.
>
> Out of curiosity, is there an efficient algorithm to solve the problem
> optimally? I suppose I could phrase it like this: Given some digraph G, a
> vertex S, and a set of verticies F, compute the set of vertex seperators
> between S and F, or more specifically, the vertex separator between S and F
> that has the largest distance from S.
>
> Thanks again,
> Hal
>
>
>
>
>
> --
> Hal Finkel
> Assistant Computational Scientist
> Leadership Computing Facility
> Argonne National Laboratory
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160107/40d7668f/attachment.html>


More information about the llvm-commits mailing list