diff options
author | Amara Emerson <aemerson@apple.com> | 2018-10-11 14:51:11 +0000 |
---|---|---|
committer | Amara Emerson <aemerson@apple.com> | 2018-10-11 14:51:11 +0000 |
commit | 54f60255a2ee960776cc3aa4a6a9340fc8a2ea7f (patch) | |
tree | dccf215b777a1119f52e3cc730b9c5f9d734cb50 /llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | |
parent | 7d2f783e7d08c1f6cb162250c828cf6d54108802 (diff) | |
download | bcm5719-llvm-54f60255a2ee960776cc3aa4a6a9340fc8a2ea7f.tar.gz bcm5719-llvm-54f60255a2ee960776cc3aa4a6a9340fc8a2ea7f.zip |
[InstCombine] Fix SimplifyLibCalls erasing an instruction while IC still had references to it.
InstCombine keeps a worklist and assumes that optimizations don't
eraseFromParent() the instruction, which SimplifyLibCalls violates. This change
adds a new callback to SimplifyLibCalls to let clients specify their own hander
for erasing actions.
Differential Revision: https://reviews.llvm.org/D52729
llvm-svn: 344251
Diffstat (limited to 'llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp')
-rw-r--r-- | llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp index 4e404933a22..714c6176884 100644 --- a/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp +++ b/llvm/lib/Transforms/InstCombine/InstCombineCalls.cpp @@ -3960,7 +3960,11 @@ Instruction *InstCombiner::tryOptimizeCall(CallInst *CI) { auto InstCombineRAUW = [this](Instruction *From, Value *With) { replaceInstUsesWith(*From, With); }; - LibCallSimplifier Simplifier(DL, &TLI, ORE, InstCombineRAUW); + auto InstCombineErase = [this](Instruction *I) { + eraseInstFromFunction(*I); + }; + LibCallSimplifier Simplifier(DL, &TLI, ORE, InstCombineRAUW, + InstCombineErase); if (Value *With = Simplifier.optimizeCall(CI)) { ++NumSimplified; return CI->use_empty() ? CI : replaceInstUsesWith(*CI, With); |