statepoint.ll 3.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. ; RUN: opt -S %s -verify | FileCheck %s
  2. declare void @use(...)
  3. declare i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(i32, i32, i32)
  4. declare i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(i32, i32, i32)
  5. declare i32 @llvm.experimental.gc.statepoint.p0f_isVoidf(i64, i32, void ()*, i32, i32, ...)
  6. declare i32 @"personality_function"()
  7. ;; Basic usage
  8. define i64 addrspace(1)* @test1(i8 addrspace(1)* %arg) gc "statepoint-example" {
  9. entry:
  10. %cast = bitcast i8 addrspace(1)* %arg to i64 addrspace(1)*
  11. %safepoint_token = call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* undef, i32 0, i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 10, i32 0, i8 addrspace(1)* %arg, i64 addrspace(1)* %cast, i8 addrspace(1)* %arg, i8 addrspace(1)* %arg)
  12. %reloc = call i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(i32 %safepoint_token, i32 12, i32 13)
  13. ;; It is perfectly legal to relocate the same value multiple times...
  14. %reloc2 = call i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(i32 %safepoint_token, i32 12, i32 13)
  15. %reloc3 = call i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(i32 %safepoint_token, i32 13, i32 12)
  16. ret i64 addrspace(1)* %reloc
  17. ; CHECK-LABEL: test1
  18. ; CHECK: statepoint
  19. ; CHECK: gc.relocate
  20. ; CHECK: gc.relocate
  21. ; CHECK: gc.relocate
  22. ; CHECK: ret i64 addrspace(1)* %reloc
  23. }
  24. ; This test catches two cases where the verifier was too strict:
  25. ; 1) A base doesn't need to be relocated if it's never used again
  26. ; 2) A value can be replaced by one which is known equal. This
  27. ; means a potentially derived pointer can be known base and that
  28. ; we can't check that derived pointer are never bases.
  29. define void @test2(i8 addrspace(1)* %arg, i64 addrspace(1)* %arg2) gc "statepoint-example" {
  30. entry:
  31. %cast = bitcast i8 addrspace(1)* %arg to i64 addrspace(1)*
  32. %c = icmp eq i64 addrspace(1)* %cast, %arg2
  33. br i1 %c, label %equal, label %notequal
  34. notequal:
  35. ret void
  36. equal:
  37. %safepoint_token = call i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* undef, i32 0, i32 0, i32 0, i32 5, i32 0, i32 0, i32 0, i32 10, i32 0, i8 addrspace(1)* %arg, i64 addrspace(1)* %cast, i8 addrspace(1)* %arg, i8 addrspace(1)* %arg)
  38. %reloc = call i64 addrspace(1)* @llvm.experimental.gc.relocate.p1i64(i32 %safepoint_token, i32 12, i32 13)
  39. call void undef(i64 addrspace(1)* %reloc)
  40. ret void
  41. ; CHECK-LABEL: test2
  42. ; CHECK-LABEL: equal
  43. ; CHECK: statepoint
  44. ; CHECK-NEXT: %reloc = call
  45. ; CHECK-NEXT: call
  46. ; CHECK-NEXT: ret voi
  47. }
  48. ; Basic test for invoke statepoints
  49. define i8 addrspace(1)* @test3(i8 addrspace(1)* %obj, i8 addrspace(1)* %obj1) gc "statepoint-example" personality i32 ()* @"personality_function" {
  50. ; CHECK-LABEL: test3
  51. entry:
  52. ; CHECK-LABEL: entry
  53. ; CHECK: statepoint
  54. %0 = invoke i32 (i64, i32, void ()*, i32, i32, ...) @llvm.experimental.gc.statepoint.p0f_isVoidf(i64 0, i32 0, void ()* undef, i32 0, i32 0, i32 0, i32 5, i32 0, i32 -1, i32 0, i32 0, i32 0, i8 addrspace(1)* %obj, i8 addrspace(1)* %obj1)
  55. to label %normal_dest unwind label %exceptional_return
  56. normal_dest:
  57. ; CHECK-LABEL: normal_dest:
  58. ; CHECK: gc.relocate
  59. ; CHECK: gc.relocate
  60. ; CHECK: ret
  61. %obj.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(i32 %0, i32 12, i32 12)
  62. %obj1.relocated = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(i32 %0, i32 12, i32 12)
  63. ret i8 addrspace(1)* %obj.relocated
  64. exceptional_return:
  65. ; CHECK-LABEL: exceptional_return
  66. ; CHECK: gc.relocate
  67. ; CHECK: gc.relocate
  68. %landing_pad = landingpad { i8*, i32 }
  69. cleanup
  70. %relocate_token = extractvalue { i8*, i32 } %landing_pad, 1
  71. %obj.relocated1 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(i32 %relocate_token, i32 12, i32 12)
  72. %obj1.relocated1 = call coldcc i8 addrspace(1)* @llvm.experimental.gc.relocate.p1i8(i32 %relocate_token, i32 12, i32 12)
  73. ret i8 addrspace(1)* %obj1.relocated1
  74. }