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: @consume(i64 addrspace(1)* %obj.relocated)
     17 ; CHECK-NEXT: @consume(i64 addrspace(1)* %obj.relocated)
     18   %obj2 = phi i64 addrspace(1)* [ %obj, %entry ]
     19   call i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 0)
     20   call void (...) @consume(i64 addrspace(1)* %obj2)
     21   call void (...) @consume(i64 addrspace(1)* %obj)
     22   ret void
     23 }
     24 
     25 declare void @some_call(i64 addrspace(1)*)
     26 
     27 ; Need to delete unreachable gc.statepoint call
     28 define void @test7() gc "statepoint-example" {
     29 ; CHECK-LABEL: test7
     30 ; CHECK-NOT: gc.statepoint
     31   ret void
     32 
     33 unreached:
     34   %obj = phi i64 addrspace(1)* [null, %unreached]
     35   call i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 0)
     36   call void (...) @consume(i64 addrspace(1)* %obj)
     37   br label %unreached
     38 }
     39 
     40 ; Need to delete unreachable gc.statepoint invoke - tested seperately given
     41 ; a correct implementation could only remove the instructions, not the block
     42 define void @test8() gc "statepoint-example" {
     43 ; CHECK-LABEL: test8
     44 ; CHECK-NOT: gc.statepoint
     45   ret void
     46 
     47 unreached:
     48   invoke i32 (void ()*, i32, i32, ...)* @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @foo, i32 0, i32 0, i32 0)
     49           to label %normal_return unwind label %exceptional_return
     50 
     51 normal_return:                                    ; preds = %entry
     52   ret void
     53 
     54 exceptional_return:                               ; preds = %entry
     55   %landing_pad4 = landingpad { i8*, i32 } personality i32 ()* undef
     56           cleanup
     57   ret void
     58 }
     59 
     60 declare void @foo()
     61 ; Bound the last check-not
     62 ; CHECK-LABEL: @foo
     63 
     64 declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...)
     65 
     66