diff options
| author | Nikita Popov <nikita.ppv@gmail.com> | 2020-01-15 22:24:15 +0100 |
|---|---|---|
| committer | Hans Wennborg <hans@chromium.org> | 2020-01-23 00:41:57 +0100 |
| commit | 7adf83beece381d153f8b4a67fa341d13f9c4ba2 (patch) | |
| tree | 6658435adebceebdac32462e62b3a36e2e43dde4 /llvm/lib | |
| parent | 050e1a3c2688f2daf03456cf94dd3ed79e8ebe7f (diff) | |
| download | bcm5719-llvm-7adf83beece381d153f8b4a67fa341d13f9c4ba2.tar.gz bcm5719-llvm-7adf83beece381d153f8b4a67fa341d13f9c4ba2.zip | |
[InstCombine] Fix worklist management in DSE (PR44552)
Fixes https://bugs.llvm.org/show_bug.cgi?id=44552. We need to make
sure that the store is reprocessed, because performing DSE may
expose more DSE opportunities.
There is a slight caveat here though: We need to make sure that we
add back the store the worklist first, because that means it will
be processed after the operands of the removed store have been
processed. This is a general bug in InstCombine worklist management
that I hope to address at some point, but for now it means we need
to do this manually rather than just returning the instruction as
changed.
Differential Revision: https://reviews.llvm.org/D72807
(cherry picked from commit 522c030aa9b1dd1881feb5a0d0fa2639b4a5feb7)
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp | 7 |
1 files changed, 5 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp index ebf9d24eecc..c288a7d8d40 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineLoadStoreAlloca.cpp @@ -1439,9 +1439,12 @@ Instruction *InstCombiner::visitStoreInst(StoreInst &SI) { if (PrevSI->isUnordered() && equivalentAddressValues(PrevSI->getOperand(1), SI.getOperand(1))) { ++NumDeadStore; - ++BBI; + // Manually add back the original store to the worklist now, so it will + // be processed after the operands of the removed store, as this may + // expose additional DSE opportunities. + Worklist.Add(&SI); eraseInstFromFunction(*PrevSI); - continue; + return nullptr; } break; } |

