switch-range-to-icmp.ll 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. ; RUN: opt %s -simplifycfg -S | FileCheck %s
  2. declare i32 @f(i32)
  3. define i32 @basic(i32 %x) {
  4. ; CHECK-LABEL: @basic
  5. ; CHECK: x.off = add i32 %x, -5
  6. ; CHECK: %switch = icmp ult i32 %x.off, 3
  7. ; CHECK: br i1 %switch, label %a, label %default
  8. entry:
  9. switch i32 %x, label %default [
  10. i32 5, label %a
  11. i32 6, label %a
  12. i32 7, label %a
  13. ]
  14. default:
  15. %0 = call i32 @f(i32 0)
  16. ret i32 %0
  17. a:
  18. %1 = call i32 @f(i32 1)
  19. ret i32 %1
  20. }
  21. define i32 @unreachable(i32 %x) {
  22. ; CHECK-LABEL: @unreachable
  23. ; CHECK: x.off = add i32 %x, -5
  24. ; CHECK: %switch = icmp ult i32 %x.off, 3
  25. ; CHECK: br i1 %switch, label %a, label %b
  26. entry:
  27. switch i32 %x, label %unreachable [
  28. i32 5, label %a
  29. i32 6, label %a
  30. i32 7, label %a
  31. i32 10, label %b
  32. i32 20, label %b
  33. i32 30, label %b
  34. i32 40, label %b
  35. ]
  36. unreachable:
  37. unreachable
  38. a:
  39. %0 = call i32 @f(i32 0)
  40. ret i32 %0
  41. b:
  42. %1 = call i32 @f(i32 1)
  43. ret i32 %1
  44. }
  45. define i32 @unreachable2(i32 %x) {
  46. ; CHECK-LABEL: @unreachable2
  47. ; CHECK: x.off = add i32 %x, -5
  48. ; CHECK: %switch = icmp ult i32 %x.off, 3
  49. ; CHECK: br i1 %switch, label %a, label %b
  50. entry:
  51. ; Note: folding the most popular case destination into the default
  52. ; would prevent switch-to-icmp here.
  53. switch i32 %x, label %unreachable [
  54. i32 5, label %a
  55. i32 6, label %a
  56. i32 7, label %a
  57. i32 10, label %b
  58. i32 20, label %b
  59. ]
  60. unreachable:
  61. unreachable
  62. a:
  63. %0 = call i32 @f(i32 0)
  64. ret i32 %0
  65. b:
  66. %1 = call i32 @f(i32 1)
  67. ret i32 %1
  68. }