[MemorySSAUpdater] Avoid creating self-referencing MemoryDefs
authorAlexandros Lamprineas <alexandros.lamprineas@arm.com>
Tue, 11 Sep 2018 14:29:59 +0000 (14:29 +0000)
committerAlexandros Lamprineas <alexandros.lamprineas@arm.com>
Tue, 11 Sep 2018 14:29:59 +0000 (14:29 +0000)
commit96762b37e1e59ac5e1706979d59bd80b21b75665
tree896f0a18028421816f99415af3020dbd5b2b0eb7
parent4beb2f964b4d8b1017b17c19b48a3ddfdfcf1312
[MemorySSAUpdater] Avoid creating self-referencing MemoryDefs

Fix for https://bugs.llvm.org/show_bug.cgi?id=38807, which occurred
while compiling SemaTemplateInstantiate.cpp with clang and GVNHoist
enabled. In the following example:

      1=def(entry)
      /        \
2=def(1)       4=def(1)
3=def(2)       5=def(4)

When removing the MemoryDef 2=def(1) from its basic block, and just
before adding it to the end of the parent basic block, we first
replace all its uses with the defining memory access:

3=def(2) -> 3=def(1)

Then we call insertDef for adding 2=def(1) to the parent basic block,
where we replace the uses of 1=def(entry) with 2=def(1). Doing so we
create a self reference:

2=def(1) -> 2=def(2)  (bad)
3=def(1) -> 3=def(2)  (ok)
4=def(1) -> 4=def(2)  (ok)

Differential Revision: https://reviews.llvm.org/D51801

llvm-svn: 341947
llvm/lib/Analysis/MemorySSAUpdater.cpp
llvm/test/Transforms/GVNHoist/pr38807.ll [new file with mode: 0644]