cppeh-catch-intrinsics-clean.ll 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. ; RUN: opt -lint -disable-output < %s
  2. ; This test is meant to prove that the verifier does not report errors for correct
  3. ; use of the llvm.eh.begincatch and llvm.eh.endcatch intrinsics.
  4. target triple = "x86_64-pc-windows-msvc"
  5. declare void @llvm.eh.begincatch(i8*, i8*)
  6. declare void @llvm.eh.endcatch()
  7. @_ZTIi = external constant i8*
  8. ; Function Attrs: uwtable
  9. define void @test_ref_clean() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
  10. entry:
  11. invoke void @_Z9may_throwv()
  12. to label %try.cont unwind label %lpad
  13. lpad: ; preds = %entry
  14. %0 = landingpad { i8*, i32 }
  15. catch i8* bitcast (i8** @_ZTIi to i8*)
  16. %exn = extractvalue { i8*, i32 } %0, 0
  17. %sel = extractvalue { i8*, i32 } %0, 1
  18. %1 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
  19. %matches = icmp eq i32 %sel, %1
  20. br i1 %matches, label %catch, label %eh.resume
  21. catch: ; preds = %lpad
  22. call void @llvm.eh.begincatch(i8* %exn, i8* null)
  23. call void @_Z10handle_intv()
  24. br label %invoke.cont2
  25. invoke.cont2: ; preds = %catch
  26. call void @llvm.eh.endcatch()
  27. br label %try.cont
  28. try.cont: ; preds = %invoke.cont2, %entry
  29. ret void
  30. eh.resume: ; preds = %catch.dispatch
  31. resume { i8*, i32 } %0
  32. }
  33. ; Function Attrs: uwtable
  34. define void @test_ref_clean_multibranch() personality i8* bitcast (i32 (...)* @__CxxFrameHandler3 to i8*) {
  35. entry:
  36. invoke void @_Z9may_throwv()
  37. to label %invoke.cont unwind label %lpad
  38. invoke.cont:
  39. invoke void @_Z9may_throwv()
  40. to label %invoke.cont unwind label %lpad1
  41. lpad: ; preds = %entry
  42. %0 = landingpad { i8*, i32 }
  43. catch i8* bitcast (i8** @_ZTIi to i8*)
  44. %exn = extractvalue { i8*, i32 } %0, 0
  45. %sel = extractvalue { i8*, i32 } %0, 1
  46. %1 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
  47. %matches = icmp eq i32 %sel, %1
  48. br i1 %matches, label %catch, label %eh.resume
  49. invoke void @_Z9may_throwv()
  50. to label %try.cont unwind label %lpad
  51. lpad1: ; preds = %entry
  52. %l1.0 = landingpad { i8*, i32 }
  53. cleanup
  54. catch i8* bitcast (i8** @_ZTIi to i8*)
  55. %exn1 = extractvalue { i8*, i32 } %l1.0, 0
  56. %sel1 = extractvalue { i8*, i32 } %l1.0, 1
  57. %l1.1 = call i32 @llvm.eh.typeid.for(i8* bitcast (i8** @_ZTIi to i8*))
  58. %matchesl1 = icmp eq i32 %sel1, %l1.1
  59. br i1 %matchesl1, label %catch, label %eh.resume
  60. catch: ; preds = %lpad, %lpad1
  61. %exn2 = phi i8* [%exn, %lpad], [%exn1, %lpad1]
  62. %sel2 = phi i32 [%sel, %lpad], [%sel1, %lpad1]
  63. call void @llvm.eh.begincatch(i8* %exn2, i8* null)
  64. call void @_Z10handle_intv()
  65. %matches1 = icmp eq i32 %sel2, 0
  66. br i1 %matches1, label %invoke.cont2, label %invoke.cont3
  67. invoke.cont2: ; preds = %catch
  68. call void @llvm.eh.endcatch()
  69. br label %try.cont
  70. invoke.cont3: ; preds = %catch
  71. call void @llvm.eh.endcatch()
  72. br label %eh.resume
  73. try.cont: ; preds = %invoke.cont2, %entry
  74. ret void
  75. eh.resume: ; preds = %catch.dispatch
  76. %lpad.val = insertvalue { i8*, i32 } undef, i32 0, 1
  77. resume { i8*, i32 } %lpad.val
  78. }
  79. declare void @_Z9may_throwv()
  80. declare i32 @__CxxFrameHandler3(...)
  81. ; Function Attrs: nounwind readnone
  82. declare i32 @llvm.eh.typeid.for(i8*)
  83. declare void @_Z10handle_intv()