Home | History | Annotate | Download | only in RewriteStatepointsForGC
      1 ; Test that we can correctly handle vectors of pointers in statepoint 
      2 ; rewriting.  Currently, we scalarize, but that's an implementation detail.
      3 ; RUN: opt %s -rewrite-statepoints-for-gc -S | FileCheck  %s
      4 
      5 ; A non-vector relocation for comparison
      6 define i64 addrspace(1)* @test(i64 addrspace(1)* %obj) gc "statepoint-example" {
      7 ; CHECK-LABEL: test
      8 ; CHECK: gc.statepoint
      9 ; CHECK-NEXT: gc.relocate
     10 ; CHECK-NEXT: ret i64 addrspace(1)* %obj.relocated
     11 entry:
     12   %safepoint_token = call i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @do_safepoint, i32 0, i32 0, i32 0)
     13   ret i64 addrspace(1)* %obj
     14 }
     15 
     16 ; A base vector from a argument
     17 define <2 x i64 addrspace(1)*> @test2(<2 x i64 addrspace(1)*> %obj) gc "statepoint-example" {
     18 ; CHECK-LABEL: test2
     19 ; CHECK: extractelement
     20 ; CHECK-NEXT: extractelement
     21 ; CHECK-NEXT: gc.statepoint
     22 ; CHECK-NEXT: gc.relocate
     23 ; CHECK-NEXT: gc.relocate
     24 ; CHECK-NEXT: insertelement
     25 ; CHECK-NEXT: insertelement
     26 ; CHECK-NEXT: ret <2 x i64 addrspace(1)*> %5
     27 entry:
     28   %safepoint_token = call i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @do_safepoint, i32 0, i32 0, i32 0)
     29   ret <2 x i64 addrspace(1)*> %obj
     30 }
     31 
     32 ; A base vector from a load
     33 define <2 x i64 addrspace(1)*> @test3(<2 x i64 addrspace(1)*>* %ptr) gc "statepoint-example" {
     34 ; CHECK-LABEL: test3
     35 ; CHECK: load
     36 ; CHECK-NEXT: extractelement
     37 ; CHECK-NEXT: extractelement
     38 ; CHECK-NEXT: gc.statepoint
     39 ; CHECK-NEXT: gc.relocate
     40 ; CHECK-NEXT: gc.relocate
     41 ; CHECK-NEXT: insertelement
     42 ; CHECK-NEXT: insertelement
     43 ; CHECK-NEXT: ret <2 x i64 addrspace(1)*> %5
     44 entry:
     45   %obj = load <2 x i64 addrspace(1)*>, <2 x i64 addrspace(1)*>* %ptr
     46   %safepoint_token = call i32 (void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @do_safepoint, i32 0, i32 0, i32 0)
     47   ret <2 x i64 addrspace(1)*> %obj
     48 }
     49 
     50 declare i32 @fake_personality_function()
     51 
     52 ; When a statepoint is an invoke rather than a call
     53 define <2 x i64 addrspace(1)*> @test4(<2 x i64 addrspace(1)*>* %ptr) gc "statepoint-example" {
     54 ; CHECK-LABEL: test4
     55 ; CHECK: load
     56 ; CHECK-NEXT: extractelement
     57 ; CHECK-NEXT: extractelement
     58 ; CHECK-NEXT: gc.statepoint
     59 entry:
     60   %obj = load <2 x i64 addrspace(1)*>, <2 x i64 addrspace(1)*>* %ptr
     61   invoke i32 (void ()*, i32, i32, ...)* @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()* @do_safepoint, i32 0, i32 0, i32 0)
     62           to label %normal_return unwind label %exceptional_return
     63 
     64 ; CHECK-LABEL: normal_return:
     65 ; CHECK: gc.relocate
     66 ; CHECK-NEXT: gc.relocate
     67 ; CHECK-NEXT: insertelement
     68 ; CHECK-NEXT: insertelement
     69 ; CHECK-NEXT: ret <2 x i64 addrspace(1)*> %6
     70 normal_return:                                    ; preds = %entry
     71   ret <2 x i64 addrspace(1)*> %obj
     72 
     73 ; CHECK-LABEL: exceptional_return:
     74 ; CHECK: gc.relocate
     75 ; CHECK-NEXT: gc.relocate
     76 ; CHECK-NEXT: insertelement
     77 ; CHECK-NEXT: insertelement
     78 ; CHECK-NEXT: ret <2 x i64 addrspace(1)*> %10
     79 exceptional_return:                               ; preds = %entry
     80   %landing_pad4 = landingpad { i8*, i32 } personality i32 ()* @fake_personality_function
     81           cleanup
     82   ret <2 x i64 addrspace(1)*> %obj
     83 }
     84 
     85 declare void @do_safepoint()
     86 
     87 declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(void ()*, i32, i32, ...)
     88