invoke.ll 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139
  1. ; RUN: opt < %s -simplifycfg -S | FileCheck %s
  2. target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
  3. declare i32 @__gxx_personality_v0(...)
  4. declare void @__cxa_call_unexpected(i8*)
  5. declare void @purefn() nounwind readnone
  6. declare i32 @read_only() nounwind readonly
  7. declare i32 @nounwind_fn() nounwind
  8. declare i32 @fn()
  9. ; CHECK-LABEL: @f1(
  10. define i8* @f1() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  11. entry:
  12. ; CHECK: call void @llvm.trap()
  13. ; CHECK: unreachable
  14. %call = invoke noalias i8* undef()
  15. to label %invoke.cont unwind label %lpad
  16. invoke.cont:
  17. ret i8* %call
  18. lpad:
  19. %0 = landingpad { i8*, i32 }
  20. filter [0 x i8*] zeroinitializer
  21. %1 = extractvalue { i8*, i32 } %0, 0
  22. tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
  23. unreachable
  24. }
  25. ; CHECK-LABEL: @f2(
  26. define i8* @f2() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  27. entry:
  28. ; CHECK: call void @llvm.trap()
  29. ; CHECK: unreachable
  30. %call = invoke noalias i8* null()
  31. to label %invoke.cont unwind label %lpad
  32. invoke.cont:
  33. ret i8* %call
  34. lpad:
  35. %0 = landingpad { i8*, i32 }
  36. filter [0 x i8*] zeroinitializer
  37. %1 = extractvalue { i8*, i32 } %0, 0
  38. tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
  39. unreachable
  40. }
  41. ; CHECK-LABEL: @f3(
  42. define i32 @f3() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  43. ; CHECK-NEXT: entry
  44. entry:
  45. ; CHECK-NEXT: ret i32 3
  46. %call = invoke i32 @read_only()
  47. to label %invoke.cont unwind label %lpad
  48. invoke.cont:
  49. ret i32 3
  50. lpad:
  51. %0 = landingpad { i8*, i32 }
  52. filter [0 x i8*] zeroinitializer
  53. %1 = extractvalue { i8*, i32 } %0, 0
  54. tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
  55. unreachable
  56. }
  57. ; CHECK-LABEL: @f4(
  58. define i32 @f4() nounwind uwtable ssp personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  59. ; CHECK-NEXT: entry
  60. entry:
  61. ; CHECK-NEXT: call i32 @read_only()
  62. %call = invoke i32 @read_only()
  63. to label %invoke.cont unwind label %lpad
  64. invoke.cont:
  65. ; CHECK-NEXT: ret i32 %call
  66. ret i32 %call
  67. lpad:
  68. %0 = landingpad { i8*, i32 }
  69. filter [0 x i8*] zeroinitializer
  70. %1 = extractvalue { i8*, i32 } %0, 0
  71. tail call void @__cxa_call_unexpected(i8* %1) noreturn nounwind
  72. unreachable
  73. }
  74. ; CHECK-LABEL: @f5(
  75. define i32 @f5(i1 %cond, i8* %a, i8* %b) personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  76. entry:
  77. br i1 %cond, label %x, label %y
  78. x:
  79. ; CHECK: invoke i32 @fn()
  80. %call = invoke i32 @fn()
  81. to label %cont unwind label %lpad
  82. y:
  83. ; CHECK: call i32 @nounwind_fn()
  84. %call2 = invoke i32 @nounwind_fn()
  85. to label %cont unwind label %lpad
  86. cont:
  87. ; CHECK: phi i32
  88. ; CHECK: ret i32 %phi
  89. %phi = phi i32 [%call, %x], [%call2, %y]
  90. ret i32 %phi
  91. lpad:
  92. ; CHECK-NOT: phi
  93. %phi2 = phi i8* [%a, %x], [%b, %y]
  94. %0 = landingpad { i8*, i32 }
  95. filter [0 x i8*] zeroinitializer
  96. ; CHECK: __cxa_call_unexpected(i8* %a)
  97. tail call void @__cxa_call_unexpected(i8* %phi2) noreturn nounwind
  98. unreachable
  99. }
  100. ; CHECK-LABEL: @f6(
  101. define void @f6() personality i8* bitcast (i32 (...)* @__gxx_personality_v0 to i8*) {
  102. entry:
  103. invoke void @purefn()
  104. to label %invoke.cont1 unwind label %lpad
  105. invoke.cont1:
  106. %foo = invoke i32 @fn()
  107. to label %invoke.cont2 unwind label %lpad
  108. invoke.cont2:
  109. ret void
  110. lpad:
  111. ; CHECK-NOT: phi
  112. %tmp = phi i8* [ null, %invoke.cont1 ], [ null, %entry ]
  113. landingpad { i8*, i32 }
  114. cleanup
  115. ret void
  116. }