diff options
author | Nikita Popov <npopov@redhat.com> | 2022-05-30 15:37:46 +0200 |
---|---|---|
committer | Tom Stellard <tstellar@redhat.com> | 2022-06-03 06:27:20 -0700 |
commit | 99b5eb2d3a61b55a61849cebabf1d5d66b4a13c4 (patch) | |
tree | f5f9d96ef4db4dcb3e56eb77dc84604f97f4b1ba | |
parent | 885724c60cdc4b3fb221830d43e2ecd79ace9ce1 (diff) | |
download | llvm-99b5eb2d3a61b55a61849cebabf1d5d66b4a13c4.zip llvm-99b5eb2d3a61b55a61849cebabf1d5d66b4a13c4.tar.gz llvm-99b5eb2d3a61b55a61849cebabf1d5d66b4a13c4.tar.bz2 |
[Local] Don't remove invoke of non-willreturn function
The code was only checking for memory side-effects, but not for
divergence side-effects. Replace this with a generic check.
(cherry picked from commit 2e101cca690645d63ae4de1eb7b0e11d322448fd)
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 2 | ||||
-rw-r--r-- | llvm/test/Transforms/SimplifyCFG/invoke.ll | 1 |
2 files changed, 2 insertions, 1 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 9a10535..1c350a2 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -2350,7 +2350,7 @@ static bool markAliveBlocks(Function &F, changeToUnreachable(II, false, DTU); Changed = true; } else if (II->doesNotThrow() && canSimplifyInvokeNoUnwind(&F)) { - if (II->use_empty() && II->onlyReadsMemory()) { + if (II->use_empty() && !II->mayHaveSideEffects()) { // jump to the normal destination branch. BasicBlock *NormalDestBB = II->getNormalDest(); BasicBlock *UnwindDestBB = II->getUnwindDest(); diff --git a/llvm/test/Transforms/SimplifyCFG/invoke.ll b/llvm/test/Transforms/SimplifyCFG/invoke.ll index db10fa3..175a2c6 100644 --- a/llvm/test/Transforms/SimplifyCFG/invoke.ll +++ b/llvm/test/Transforms/SimplifyCFG/invoke.ll @@ -83,6 +83,7 @@ lpad: define i32 @invoke_readonly_may_not_return() nounwind personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) { ; CHECK-LABEL: @invoke_readonly_may_not_return( ; CHECK-NEXT: entry: +; CHECK-NEXT: [[CALL:%.*]] = call i32 @readonly() ; CHECK-NEXT: ret i32 3 ; entry: |