[MachineScheduler] Ignore artificial edges when forming store chains
authorJay Foad <jay.foad@amd.com>
Thu, 19 Dec 2019 16:53:05 +0000 (16:53 +0000)
committerJay Foad <jay.foad@amd.com>
Wed, 29 Jan 2020 16:23:01 +0000 (16:23 +0000)
commit0d7bd343127ee161a01a1509effba0fdd480c9e1
treeb35614ded6ce9169a586a483b17a4e5d7a7a6f40
parent96352e0a1bda0fc04729ff90d0d576e8f366760f
[MachineScheduler] Ignore artificial edges when forming store chains

Summary:
BaseMemOpClusterMutation::apply forms store chains by looking for
control (i.e. non-data) dependencies from one mem op to another.

In the test case, clusterNeighboringMemOps successfully clusters the
loads, and then adds artificial edges to the loads' successors as
described in the comment:
      // Copy successor edges from SUa to SUb. Interleaving computation
      // dependent on SUa can prevent load combining due to register reuse.
The effect of this is that *data* dependencies from one load to a store
are copied as *artificial* dependencies from a different load to the
same store.

Then when BaseMemOpClusterMutation::apply looks at the stores, it finds
that some of them have a control dependency on a previous load, which
breaks the chains and means that the stores are not all considered part
of the same chain and won't all be clustered.

The fix is to only consider non-artificial control dependencies when
forming chains.

Subscribers: MatzeB, jvesely, nhaehnle, hiraditya, javed.absar, llvm-commits

Tags: #llvm

Differential Revision: https://reviews.llvm.org/D71717
llvm/lib/CodeGen/MachineScheduler.cpp
llvm/test/CodeGen/AMDGPU/cluster_stores.ll [new file with mode: 0644]