switch_thread.ll 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. ; RUN: opt < %s -simplifycfg -S | \
  2. ; RUN: not grep "call void @DEAD"
  3. ; Test that we can thread a simple known condition through switch statements.
  4. declare void @foo1()
  5. declare void @foo2()
  6. declare void @DEAD()
  7. define void @test1(i32 %V) {
  8. switch i32 %V, label %A [
  9. i32 4, label %T
  10. i32 17, label %Done
  11. i32 1234, label %A
  12. ]
  13. ;; V == 4 if we get here.
  14. T: ; preds = %0
  15. call void @foo1( )
  16. ;; This switch is always statically determined.
  17. switch i32 %V, label %A2 [
  18. i32 4, label %B
  19. i32 17, label %C
  20. i32 42, label %C
  21. ]
  22. A2: ; preds = %T
  23. call void @DEAD( )
  24. call void @DEAD( )
  25. ;; always true
  26. %cond2 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
  27. br i1 %cond2, label %Done, label %C
  28. A: ; preds = %0, %0
  29. call void @foo1( )
  30. ;; always true
  31. %cond = icmp ne i32 %V, 4 ; <i1> [#uses=1]
  32. br i1 %cond, label %Done, label %C
  33. Done: ; preds = %B, %A, %A2, %0
  34. ret void
  35. B: ; preds = %T
  36. call void @foo2( )
  37. ;; always true
  38. %cond3 = icmp eq i32 %V, 4 ; <i1> [#uses=1]
  39. br i1 %cond3, label %Done, label %C
  40. C: ; preds = %B, %A, %A2, %T, %T
  41. call void @DEAD( )
  42. ret void
  43. }
  44. define void @test2(i32 %V) {
  45. switch i32 %V, label %A [
  46. i32 4, label %T
  47. i32 17, label %D
  48. i32 1234, label %E
  49. ]
  50. ;; V != 4, 17, 1234 here.
  51. A: ; preds = %0
  52. call void @foo1( )
  53. ;; This switch is always statically determined.
  54. switch i32 %V, label %E [
  55. i32 4, label %C
  56. i32 17, label %C
  57. i32 42, label %D
  58. ]
  59. ;; unreacahble.
  60. C: ; preds = %A, %A
  61. call void @DEAD( )
  62. ret void
  63. T: ; preds = %0
  64. call void @foo1( )
  65. call void @foo1( )
  66. ret void
  67. D: ; preds = %A, %0
  68. call void @foo1( )
  69. ret void
  70. E: ; preds = %A, %0
  71. ret void
  72. }