[PATCH] D25601: DAGCombiner: fix use-after-free when merging consecutive stores

Nicolai Hähnle via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 3 07:34:25 PDT 2016


On 03.11.2016 14:52, Nirav Davé wrote:
> It does reduce merges in the context of D14834 which was my worry. It's
> not clear if it's preferable to store merges as far as we can or give up
> immediately, but perhaps that's better folded into D14834 anyways. Given
> your explanation that's an issue with the SDNode recycler and not some
> other issue in the DAGCombiner, my concerns are put to rest.
>
> That said, it seems like we should replace EverChanged with STMerged
> which I think is the actual condition we are checking.
>
>     for (;;) {
>       SmallVector<MemOpLink, 8> StoreNodes;
>       bool Changed = MergeConsecutiveStores(ST, StoreNodes);
>       if (!Changed) break;
>       if (any_of(StoreNodes,
>                  [ST](const MemOpLink &Link) { return Link.MemNode ==
> ST; }))
>         STMerged = true;
>     }
>
>     if (STMerged)
>       return SDValue(N, 0);
>   }

That makes sense to me, though I'm simplifying it to return directly out 
of the loop. Thank you for the review!

Nicolai

> On Thu, Nov 3, 2016 at 9:21 AM, Nicolai Hähnle <nhaehnle at gmail.com
> <mailto:nhaehnle at gmail.com>> wrote:
>
>     nhaehnle added a comment.
>
>     This doesn't reduce the number of merges. The patch has 0 changes in
>     any of the test/CodeGen tests across all backends, and I don't have
>     any out-of-tree tests with changes either. There is no real
>     functional change.
>
>     Even before this patch, the code satisfied: The store nodes that are
>     deleted for the merge are exactly a prefix of the StoreNodes vector.
>     The patch (a) truncates the StoreNodes vector to that prefix and (b)
>     passes the vector out so that we can safely decide whether ST was
>     deleted without implicitly relying on the behaviour of the SDNode
>     recycler.
>
>     Look, I'll do you one better and do a llvm-lit test/CodeGen run with
>     the following change in a debug build:
>
>       if (any_of(StoreNodes,
>                  [ST](const MemOpLink &Link) { return Link.MemNode ==
>     ST; })) {
>         assert(ST->getOpcode() == ISD::DELETED_NODE);
>         break;
>       }
>
>       assert(ST->getOpcode() != ISD::DELETED_NODE);
>
>     Of course the assertions re-introduce the problematic reliance on
>     the recycler behaviour, but the point is that neither assertion ever
>     triggers on any of the in-tree CodeGen tests.
>
>
>     https://reviews.llvm.org/D25601 <https://reviews.llvm.org/D25601>
>
>
>
>


More information about the llvm-commits mailing list