| ; 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 |
| } |