duplicate-landingpad.ll 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  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 @fn()
  5. ; CHECK-LABEL: @test1
  6. define void @test1() personality i32 (...)* @__gxx_personality_v0 {
  7. entry:
  8. ; CHECK-LABEL: entry:
  9. ; CHECK: to label %invoke2 unwind label %lpad2
  10. invoke void @fn()
  11. to label %invoke2 unwind label %lpad1
  12. invoke2:
  13. ; CHECK-LABEL: invoke2:
  14. ; CHECK: to label %invoke.cont unwind label %lpad2
  15. invoke void @fn()
  16. to label %invoke.cont unwind label %lpad2
  17. invoke.cont:
  18. ret void
  19. lpad1:
  20. %exn = landingpad {i8*, i32}
  21. cleanup
  22. br label %shared_resume
  23. lpad2:
  24. ; CHECK-LABEL: lpad2:
  25. ; CHECK: landingpad { i8*, i32 }
  26. ; CHECK-NEXT: cleanup
  27. ; CHECK-NEXT: call void @fn()
  28. ; CHECK-NEXT: ret void
  29. %exn2 = landingpad {i8*, i32}
  30. cleanup
  31. br label %shared_resume
  32. shared_resume:
  33. call void @fn()
  34. ret void
  35. }
  36. ; Don't trigger if blocks aren't the same/empty
  37. define void @neg1() personality i32 (...)* @__gxx_personality_v0 {
  38. ; CHECK-LABEL: @neg1
  39. entry:
  40. ; CHECK-LABEL: entry:
  41. ; CHECK: to label %invoke2 unwind label %lpad1
  42. invoke void @fn()
  43. to label %invoke2 unwind label %lpad1
  44. invoke2:
  45. ; CHECK-LABEL: invoke2:
  46. ; CHECK: to label %invoke.cont unwind label %lpad2
  47. invoke void @fn()
  48. to label %invoke.cont unwind label %lpad2
  49. invoke.cont:
  50. ret void
  51. lpad1:
  52. %exn = landingpad {i8*, i32}
  53. filter [0 x i8*] zeroinitializer
  54. call void @fn()
  55. br label %shared_resume
  56. lpad2:
  57. %exn2 = landingpad {i8*, i32}
  58. cleanup
  59. br label %shared_resume
  60. shared_resume:
  61. call void @fn()
  62. ret void
  63. }
  64. ; Should not trigger when the landing pads are not the exact same
  65. define void @neg2() personality i32 (...)* @__gxx_personality_v0 {
  66. ; CHECK-LABEL: @neg2
  67. entry:
  68. ; CHECK-LABEL: entry:
  69. ; CHECK: to label %invoke2 unwind label %lpad1
  70. invoke void @fn()
  71. to label %invoke2 unwind label %lpad1
  72. invoke2:
  73. ; CHECK-LABEL: invoke2:
  74. ; CHECK: to label %invoke.cont unwind label %lpad2
  75. invoke void @fn()
  76. to label %invoke.cont unwind label %lpad2
  77. invoke.cont:
  78. ret void
  79. lpad1:
  80. %exn = landingpad {i8*, i32}
  81. filter [0 x i8*] zeroinitializer
  82. br label %shared_resume
  83. lpad2:
  84. %exn2 = landingpad {i8*, i32}
  85. cleanup
  86. br label %shared_resume
  87. shared_resume:
  88. call void @fn()
  89. ret void
  90. }