forked from OSchip/llvm-project
Handle UnreachableInst in isGuaranteedToTransferExecutionToSuccessor
A block with an UnreachableInst does not transfer execution to a successor. The problem was exposed by GVN-hoist. This patch fixes bug 32153. Patch by Aditya Kumar. Differential Revision: https://reviews.llvm.org/D30667 llvm-svn: 297254
This commit is contained in:
parent
b6ddd7a437
commit
4a4d245b19
|
@ -3781,6 +3781,8 @@ bool llvm::isGuaranteedToTransferExecutionToSuccessor(const Instruction *I) {
|
|||
return false;
|
||||
if (isa<ReturnInst>(I))
|
||||
return false;
|
||||
if (isa<UnreachableInst>(I))
|
||||
return false;
|
||||
|
||||
// Calls can throw, or contain an infinite loop, or kill the process.
|
||||
if (auto CS = ImmutableCallSite(I)) {
|
||||
|
|
|
@ -0,0 +1,34 @@
|
|||
; RUN: opt -S -gvn-hoist < %s | FileCheck %s
|
||||
|
||||
%struct.__jmp_buf_tag = type { [8 x i64], i32 }
|
||||
|
||||
; Check that hoisting only happens when the expression is very busy.
|
||||
; CHECK: store
|
||||
; CHECK: store
|
||||
|
||||
@test_exit_buf = global %struct.__jmp_buf_tag zeroinitializer
|
||||
@G = global i32 0
|
||||
|
||||
define void @test_command(i32 %c1) {
|
||||
entry:
|
||||
switch i32 %c1, label %exit [
|
||||
i32 0, label %sw0
|
||||
i32 1, label %sw1
|
||||
]
|
||||
|
||||
sw0:
|
||||
store i32 1, i32* @G
|
||||
br label %exit
|
||||
|
||||
sw1:
|
||||
store i32 1, i32* @G
|
||||
br label %exit
|
||||
|
||||
exit:
|
||||
call void @longjmp(%struct.__jmp_buf_tag* @test_exit_buf, i32 1) #0
|
||||
unreachable
|
||||
}
|
||||
|
||||
declare void @longjmp(%struct.__jmp_buf_tag*, i32) #0
|
||||
|
||||
attributes #0 = { noreturn nounwind }
|
Loading…
Reference in New Issue