reference, declarationdefinition
definition → references, declarations, derived classes, virtual overrides
reference to multiple definitions → definitions
unreferenced
    1
    2
    3
    4
    5
    6
    7
    8
    9
   10
   11
   12
   13
   14
   15
   16
   17
   18
   19
   20
   21
   22
   23
   24
   25
   26
   27
   28
   29
   30
   31
   32
   33
   34
   35
   36
   37
   38
   39
   40
   41
   42
   43
   44
   45
   46
   47
   48
   49
   50
   51
   52
   53
   54
   55
   56
   57
   58
   59
   60
   61
   62
   63
   64
   65
   66
   67
   68
   69
   70
   71
   72
   73
   74
   75
   76
   77
   78
   79
   80
   81
   82
   83
   84
   85
   86
   87
   88
   89
   90
   91
   92
   93
   94
   95
   96
   97
   98
   99
  100
  101
  102
  103
  104
  105
  106
  107
  108
  109
  110
  111
  112
  113
  114
  115
  116
  117
  118
  119
  120
  121
  122
  123
  124
  125
  126
  127
  128
  129
  130
  131
  132
  133
  134
  135
  136
  137
  138
; RUN: opt < %s -S -rewrite-statepoints-for-gc | FileCheck %s
; RUN: opt < %s -S -passes=rewrite-statepoints-for-gc | FileCheck %s

declare i64 addrspace(1)* @some_call(i64 addrspace(1)*)
declare i32 @personality_function()

define i64 addrspace(1)* @test_basic(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
; CHECK-LABEL: entry:
entry:
  ; CHECK: invoke
  ; CHECK: statepoint
  ; CHECK: some_call
  %ret_val = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
               to label %normal_return unwind label %exceptional_return

; CHECK-LABEL: normal_return:
; CHECK: gc.result
; CHECK: ret i64

normal_return:
  ret i64 addrspace(1)* %ret_val

; CHECK-LABEL: exceptional_return:
; CHECK: landingpad
; CHECK: ret i64

exceptional_return:
  %landing_pad4 = landingpad token
          cleanup
  ret i64 addrspace(1)* %obj1
}

declare <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*>)

define <4 x i64 addrspace(1)*> @test_basic_vector(<4 x i64 addrspace(1)*> %objs, <4 x i64 addrspace(1)*> %objs1) gc "statepoint-example" personality i32 ()* @personality_function {
; CHECK-LABEL: @test_basic_vector
entry:
; CHECK: invoke{{.*}}llvm.experimental.gc.statepoint{{.*}}some_vector_call
  %ret_val = invoke <4 x i64 addrspace(1)*> @some_vector_call(<4 x i64 addrspace(1)*> %objs)
               to label %normal_return unwind label %exceptional_return

; CHECK-LABEL: normal_return:
; CHECK: gc.result
; CHECK: ret <4 x i64 addrspace(1)*>

normal_return:
  ret <4 x i64 addrspace(1)*> %ret_val

; CHECK-LABEL: exceptional_return:
; CHECK: landingpad
; CHECK: ret <4 x i64 addrspace(1)*>

exceptional_return:
  %landing_pad4 = landingpad token
          cleanup
  ret <4 x i64 addrspace(1)*> %objs1
}

define i64 addrspace(1)* @test_two_invokes(i64 addrspace(1)* %obj, i64 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @personality_function {
; CHECK-LABEL: entry:
entry:
  ; CHECK: invoke 
  ; CHECK: statepoint
  ; CHECK: some_call
  %ret_val1 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
               to label %second_invoke unwind label %exceptional_return

; CHECK-LABEL: second_invoke:
second_invoke:
  ; CHECK: invoke
  ; CHECK: statepoint
  ; CHECK: some_call
  %ret_val2 = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %ret_val1)
                to label %normal_return unwind label %exceptional_return

; CHECK-LABEL: normal_return:
normal_return:
  ; CHECK: gc.result
  ; CHECK: ret i64
  ret i64 addrspace(1)* %ret_val2

; CHECK: exceptional_return:
; CHECK: ret i64

exceptional_return:
  %landing_pad4 = landingpad token
          cleanup
  ret i64 addrspace(1)* %obj1
}

define i64 addrspace(1)* @test_phi_node(i1 %cond, i64 addrspace(1)* %obj) gc "statepoint-example" personality i32 ()* @personality_function {
; CHECK-LABEL: @test_phi_node
; CHECK-LABEL: entry:
entry:
  br i1 %cond, label %left, label %right

left:
  %ret_val_left = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
                    to label %merge unwind label %exceptional_return

right:
  %ret_val_right = invoke i64 addrspace(1)* @some_call(i64 addrspace(1)* %obj)
                     to label %merge unwind label %exceptional_return

; CHECK: merge[[A:[0-9]]]:
; CHECK: gc.result
; CHECK: br label %[[with_phi:merge[0-9]*]]

; CHECK: merge[[B:[0-9]]]:
; CHECK: gc.result
; CHECK: br label %[[with_phi]]

; CHECK: [[with_phi]]:
; CHECK: phi
; CHECK: ret i64 addrspace(1)* %ret_val
merge:
  %ret_val = phi i64 addrspace(1)* [%ret_val_left, %left], [%ret_val_right, %right]
  ret i64 addrspace(1)* %ret_val

; CHECK-LABEL: exceptional_return:
; CHECK: ret i64 addrspace(1)*

exceptional_return:
  %landing_pad4 = landingpad token
          cleanup
  ret i64 addrspace(1)* %obj
}

declare void @do_safepoint()
define void @gc.safepoint_poll() {
; CHECK-LABEL: gc.safepoint_poll
; CHECK-LABEL: entry
; CHECK-NEXT: do_safepoint
; CHECK-NEXT: ret void 
entry:
  call void @do_safepoint()
  ret void
}