minmax-fold.ll 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. ; RUN: opt -S -instcombine < %s | FileCheck %s
  2. ; CHECK-LABEL: @t1
  3. ; CHECK-NEXT: icmp
  4. ; CHECK-NEXT: select
  5. ; CHECK-NEXT: sext
  6. define i64 @t1(i32 %a) {
  7. ; This is the canonical form for a type-changing min/max.
  8. %1 = icmp slt i32 %a, 5
  9. %2 = select i1 %1, i32 %a, i32 5
  10. %3 = sext i32 %2 to i64
  11. ret i64 %3
  12. }
  13. ; CHECK-LABEL: @t2
  14. ; CHECK-NEXT: icmp
  15. ; CHECK-NEXT: select
  16. ; CHECK-NEXT: sext
  17. define i64 @t2(i32 %a) {
  18. ; Check this is converted into canonical form, as above.
  19. %1 = icmp slt i32 %a, 5
  20. %2 = sext i32 %a to i64
  21. %3 = select i1 %1, i64 %2, i64 5
  22. ret i64 %3
  23. }
  24. ; CHECK-LABEL: @t3
  25. ; CHECK-NEXT: icmp
  26. ; CHECK-NEXT: select
  27. ; CHECK-NEXT: zext
  28. define i64 @t3(i32 %a) {
  29. ; Same as @t2, with flipped operands and zext instead of sext.
  30. %1 = icmp ult i32 %a, 5
  31. %2 = zext i32 %a to i64
  32. %3 = select i1 %1, i64 5, i64 %2
  33. ret i64 %3
  34. }
  35. ; CHECK-LABEL: @t4
  36. ; CHECK-NEXT: icmp
  37. ; CHECK-NEXT: select
  38. ; CHECK-NEXT: trunc
  39. define i32 @t4(i64 %a) {
  40. ; Same again, with trunc.
  41. %1 = icmp slt i64 %a, 5
  42. %2 = trunc i64 %a to i32
  43. %3 = select i1 %1, i32 %2, i32 5
  44. ret i32 %3
  45. }
  46. ; CHECK-LABEL: @t5
  47. ; CHECK-NEXT: icmp
  48. ; CHECK-NEXT: zext
  49. ; CHECK-NEXT: select
  50. define i64 @t5(i32 %a) {
  51. ; Same as @t3, but with mismatched signedness between icmp and zext.
  52. ; InstCombine should leave this alone.
  53. %1 = icmp slt i32 %a, 5
  54. %2 = zext i32 %a to i64
  55. %3 = select i1 %1, i64 5, i64 %2
  56. ret i64 %3
  57. }
  58. ; CHECK-LABEL: @t6
  59. ; CHECK-NEXT: icmp
  60. ; CHECK-NEXT: select
  61. ; CHECK-NEXT: sitofp
  62. define float @t6(i32 %a) {
  63. %1 = icmp slt i32 %a, 0
  64. %2 = select i1 %1, i32 %a, i32 0
  65. %3 = sitofp i32 %2 to float
  66. ret float %3
  67. }
  68. ; CHECK-LABEL: @t7
  69. ; CHECK-NEXT: icmp
  70. ; CHECK-NEXT: select
  71. ; CHECK-NEXT: trunc
  72. define i16 @t7(i32 %a) {
  73. %1 = icmp slt i32 %a, -32768
  74. %2 = trunc i32 %a to i16
  75. %3 = select i1 %1, i16 %2, i16 -32768
  76. ret i16 %3
  77. }
  78. ; Just check for no infinite loop. InstSimplify liked to
  79. ; "simplify" -32767 by removing all the sign bits,
  80. ; which led to a canonicalization fight between different
  81. ; parts of instcombine.
  82. define i32 @t8(i64 %a, i32 %b) {
  83. %1 = icmp slt i64 %a, -32767
  84. %2 = select i1 %1, i64 %a, i64 -32767
  85. %3 = trunc i64 %2 to i32
  86. %4 = icmp slt i32 %b, 42
  87. %5 = select i1 %4, i32 42, i32 %3
  88. %6 = icmp ne i32 %5, %b
  89. %7 = zext i1 %6 to i32
  90. ret i32 %7
  91. }
  92. ; Ensure this doesn't get converted to a min/max.
  93. ; CHECK-LABEL: @t9
  94. ; CHECK-NEXT: icmp
  95. ; CHECK-NEXT: sext
  96. ; CHECK-NEXT: 4294967295
  97. ; CHECK-NEXT: ret
  98. define i64 @t9(i32 %a) {
  99. %1 = icmp sgt i32 %a, -1
  100. %2 = sext i32 %a to i64
  101. %3 = select i1 %1, i64 %2, i64 4294967295
  102. ret i64 %3
  103. }