[PATCH] D24517: GVN-hoist: fix store past load dependence analysis (PR30216)
Daniel Berlin via llvm-commits
llvm-commits at lists.llvm.org
Wed Sep 14 10:04:59 PDT 2016
Yes, this is the issue where I said "it assumes certain things about
aliasing" :)
On Wed, Sep 14, 2016 at 9:04 AM, Geoff Berry <gberry at codeaurora.org> wrote:
> I don't think this is right. Consider attempting to hoist the store %p
> just before the load in the following case:
>
> store @A ; 1 = MemoryDef(LiveIn)
> load @B ; MemoryUse(LiveIn)
> store %p ; 2 = MemoryDef(1)
>
> You won't see the load as a use of store @A because it has been optimized
> to point to LiveOnEntry, so it will appear that it is safe to hoist it when
> it is not.
>
>
> On 9/13/2016 7:38 PM, Daniel Berlin wrote:
>
>
>>> I'm not sure the MemSSA will have all the links to be able to walk
>>> the WAR dependences.
>>>
>>
>> It does not.
>>
>
> Actually, you can build a walker already that will give you war dependence
> info.
>
> Here is the pseudo code for a getClobberingAccess (note that it is faster
> to build the entire aliased load set than to call this multiple times.
> Noted below what to change to do that). Note that it assumes transitivity
> in aliasing, but this is easy to fix by changing the outerworklist to also
> include store uses.
>
> Initialize OuterWorklist to be cachingWalker->getClobberingAccess(
> OriginalStore)
> while (!OuterWorklist.empty())
> CurrentStore = OuterWorklist.pop_front();
>
> // Any load that is aliased with the store must be a user of the store
> in use-optimized memoryssa
> for each User of CurrentStore:
> if (isa<MemoryUse>(User))
> UseWorklist.push_back(User)
>
> while (!UseWorklist.empty())
> CurrentAccess = UseWorklist.pop_front();
> if (StoreClobbersLoad(OriginalStore, CurrentAccess)) // This is
> instructionClobbersQuery, basically
> return CurrentAccess // If you change this to insert it into a set
> instead of returning, you can get the entire set of dominating aliased loads
>
> // Keep going up until we've gotten past the attempted hoist point
> if (!MSSA->dominates(CurrentStore, HoistPoint))
> OuterWorklist.push_back(cachingWalker->getClobberingAccess(
> CurrentStore->getDefiningAccess()))
>
>
> Note that this should check <= the number of loads than a version that
> walks all loads does.
>
>
> --
> Geoff Berry
> Employee of Qualcomm Datacenter Technologies, Inc.
> Qualcomm Datacenter Technologies, Inc. as an affiliate of Qualcomm Technologies, Inc. Qualcomm Technologies, Inc. is a member of the Code Aurora Forum, a Linux Foundation Collaborative Project.
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160914/8cc5bdac/attachment.html>
More information about the llvm-commits
mailing list