Home | History | Annotate | Download | only in RewriteStatepointsForGC
      1 ; RUN: opt -rewrite-statepoints-for-gc -S < %s | FileCheck %s
      2 
      3 declare void @consume(...)
      4 
      5 ; Test to make sure we destroy LCSSA's single entry phi nodes before
      6 ; running liveness
      7 define void @test6(i64 addrspace(1)* %obj) gc "statepoint-example" {
      8 ; CHECK-LABEL: @test6
      9 entry:
     10   br label %next
     11 
     12 next:
     13 ; CHECK-LABEL: next:
     14 ; CHECK-NEXT: gc.statepoint
     15 ; CHECK-NEXT: gc.relocate
     16 ; CHECK-NEXT: bitcast
     17 ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted)
     18 ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated.casted)
     19   %obj2 = phi i64 addrspace(1)* [ %obj, %entry ]
     20   call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
     21   call void (...) @consume(i64 addrspace(1)* %obj2)
     22   call void (...) @consume(i64 addrspace(1)* %obj)
     23   ret void
     24 }
     25 
     26 declare void @some_call(i64 addrspace(1)*)
     27 
     28 ; Need to delete unreachable gc.statepoint call
     29 define void @test7() gc "statepoint-example" {
     30 ; CHECK-LABEL: test7
     31 ; CHECK-NOT: gc.statepoint
     32   ret void
     33 
     34 unreached:
     35   %obj = phi i64 addrspace(1)* [null, %unreached]
     36   call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
     37   call void (...) @consume(i64 addrspace(1)* %obj)
     38   br label %unreached
     39 }
     40 
     41 ; Need to delete unreachable gc.statepoint invoke - tested seperately given
     42 ; a correct implementation could only remove the instructions, not the block
     43 define void @test8() gc "statepoint-example" personality i32 ()* undef {
     44 ; CHECK-LABEL: test8
     45 ; CHECK-NOT: gc.statepoint
     46   ret void
     47 
     48 unreached:
     49   invoke i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* @foo, i32 0, i32 0, i32 0, i32 0)
     50           to label %normal_return unwind label %exceptional_return
     51 
     52 normal_return:                                    ; preds = %entry
     53   ret void
     54 
     55 exceptional_return:                               ; preds = %entry
     56   %landing_pad4 = landingpad { i8*, i32 }
     57           cleanup
     58   ret void
     59 }
     60 
     61 declare void @foo()
     62 ; Bound the last check-not
     63 ; CHECK-LABEL: @foo
     64 
     65 declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
     66