narrow-switch.ll 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. target datalayout = "e-m:o-p:32:32-f64:32:64-v64:32:64-v128:32:128-a:0:32-n32-S32"
  3. ; CHECK-LABEL: define i32 @positive1
  4. ; CHECK: switch i32
  5. ; CHECK: i32 10, label
  6. ; CHECK: i32 100, label
  7. ; CHECK: i32 1001, label
  8. define i32 @positive1(i64 %a) {
  9. entry:
  10. %and = and i64 %a, 4294967295
  11. switch i64 %and, label %sw.default [
  12. i64 10, label %return
  13. i64 100, label %sw.bb1
  14. i64 1001, label %sw.bb2
  15. ]
  16. sw.bb1:
  17. br label %return
  18. sw.bb2:
  19. br label %return
  20. sw.default:
  21. br label %return
  22. return:
  23. %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
  24. ret i32 %retval.0
  25. }
  26. ; CHECK-LABEL: define i32 @negative1
  27. ; CHECK: switch i32
  28. ; CHECK: i32 -10, label
  29. ; CHECK: i32 -100, label
  30. ; CHECK: i32 -1001, label
  31. define i32 @negative1(i64 %a) {
  32. entry:
  33. %or = or i64 %a, -4294967296
  34. switch i64 %or, label %sw.default [
  35. i64 -10, label %return
  36. i64 -100, label %sw.bb1
  37. i64 -1001, label %sw.bb2
  38. ]
  39. sw.bb1:
  40. br label %return
  41. sw.bb2:
  42. br label %return
  43. sw.default:
  44. br label %return
  45. return:
  46. %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
  47. ret i32 %retval.0
  48. }
  49. ; Make sure truncating a constant int larger than 64-bit doesn't trigger an
  50. ; assertion.
  51. ; CHECK-LABEL: define i32 @trunc72to68
  52. ; CHECK: switch i68
  53. ; CHECK: i68 10, label
  54. ; CHECK: i68 100, label
  55. ; CHECK: i68 1001, label
  56. define i32 @trunc72to68(i72 %a) {
  57. entry:
  58. %and = and i72 %a, 295147905179352825855
  59. switch i72 %and, label %sw.default [
  60. i72 10, label %return
  61. i72 100, label %sw.bb1
  62. i72 1001, label %sw.bb2
  63. ]
  64. sw.bb1:
  65. br label %return
  66. sw.bb2:
  67. br label %return
  68. sw.default:
  69. br label %return
  70. return:
  71. %retval.0 = phi i32 [ 24, %sw.default ], [ 123, %sw.bb2 ], [ 213, %sw.bb1 ], [ 231, %entry ]
  72. ret i32 %retval.0
  73. }
  74. ; Make sure to avoid assertion crashes and use the type before
  75. ; truncation to generate the sub constant expressions that leads
  76. ; to the recomputed condition.
  77. ;
  78. ; CHECK-LABEL: @trunc64to59
  79. ; CHECK: switch i59
  80. ; CHECK: i59 0, label
  81. ; CHECK: i59 18717182647723699, label
  82. define void @trunc64to59(i64 %a) {
  83. entry:
  84. %tmp0 = and i64 %a, 15
  85. %tmp1 = mul i64 %tmp0, -6425668444178048401
  86. %tmp2 = add i64 %tmp1, 5170979678563097242
  87. %tmp3 = mul i64 %tmp2, 1627972535142754813
  88. switch i64 %tmp3, label %sw.default [
  89. i64 847514119312061490, label %sw.bb1
  90. i64 866231301959785189, label %sw.bb2
  91. ]
  92. sw.bb1:
  93. br label %sw.default
  94. sw.bb2:
  95. br label %sw.default
  96. sw.default:
  97. ret void
  98. }