56 lines
1022 B
LLVM
56 lines
1022 B
LLVM
; 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 }
|
|
|
|
; Check that the store is hoisted.
|
|
; CHECK-LABEL: define void @fun(
|
|
; CHECK: store
|
|
; CHECK-NOT: store
|
|
|
|
define void @fun() {
|
|
entry:
|
|
br label %if.then
|
|
|
|
if.then: ; preds = %entry
|
|
br i1 undef, label %sw0, label %sw1
|
|
|
|
sw0:
|
|
store i32 1, i32* @G
|
|
unreachable
|
|
|
|
sw1:
|
|
store i32 1, i32* @G
|
|
ret void
|
|
}
|