UnreachableEliminate.ll 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. ; RUN: opt < %s -simplifycfg -S | FileCheck %s
  2. define void @test1(i1 %C, i1* %BP) {
  3. ; CHECK-LABEL: @test1(
  4. ; CHECK: entry:
  5. ; CHECK-NEXT: ret void
  6. entry:
  7. br i1 %C, label %T, label %F
  8. T:
  9. store i1 %C, i1* %BP
  10. unreachable
  11. F:
  12. ret void
  13. }
  14. define void @test2() personality i32 (...)* @__gxx_personality_v0 {
  15. ; CHECK-LABEL: @test2(
  16. ; CHECK: entry:
  17. ; CHECK-NEXT: call void @test2()
  18. ; CHECK-NEXT: ret void
  19. entry:
  20. invoke void @test2( )
  21. to label %N unwind label %U
  22. U:
  23. %res = landingpad { i8* }
  24. cleanup
  25. unreachable
  26. N:
  27. ret void
  28. }
  29. declare i32 @__gxx_personality_v0(...)
  30. define i32 @test3(i32 %v) {
  31. ; CHECK-LABEL: @test3(
  32. ; CHECK: entry:
  33. ; CHECK-NEXT: [[CMP:%[A-Za-z0-9]+]] = icmp eq i32 %v, 2
  34. ; CHECK-NEXT: select i1 [[CMP]], i32 2, i32 1
  35. ; CHECK-NEXT: ret
  36. entry:
  37. switch i32 %v, label %default [
  38. i32 1, label %U
  39. i32 2, label %T
  40. ]
  41. default:
  42. ret i32 1
  43. U:
  44. unreachable
  45. T:
  46. ret i32 2
  47. }
  48. ;; We can either convert the following control-flow to a select or remove the
  49. ;; unreachable control flow because of the undef store of null. Make sure we do
  50. ;; the latter.
  51. define void @test5(i1 %cond, i8* %ptr) {
  52. ; CHECK-LABEL: test5
  53. ; CHECK: entry:
  54. ; CHECK-NOT: select
  55. ; CHECK: store i8 2, i8* %ptr
  56. ; CHECK: ret
  57. entry:
  58. br i1 %cond, label %bb1, label %bb3
  59. bb3:
  60. br label %bb2
  61. bb1:
  62. br label %bb2
  63. bb2:
  64. %ptr.2 = phi i8* [ %ptr, %bb3 ], [ null, %bb1 ]
  65. store i8 2, i8* %ptr.2, align 8
  66. ret void
  67. }
  68. ; CHECK-LABEL: test6
  69. ; CHECK: entry:
  70. ; CHECK-NOT: select
  71. ; CHECK: store i8 2, i8* %ptr
  72. ; CHECK: ret
  73. define void @test6(i1 %cond, i8* %ptr) {
  74. entry:
  75. br i1 %cond, label %bb1, label %bb2
  76. bb1:
  77. br label %bb2
  78. bb2:
  79. %ptr.2 = phi i8* [ %ptr, %entry ], [ null, %bb1 ]
  80. store i8 2, i8* %ptr.2, align 8
  81. ret void
  82. }