ffs-1.ll 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134
  1. ; Test that the ffs* library call simplifier works correctly.
  2. ;
  3. ; RUN: opt < %s -instcombine -S | FileCheck %s
  4. ; RUN: opt < %s -mtriple i386-pc-linux -instcombine -S | FileCheck %s -check-prefix=CHECK-LINUX
  5. target datalayout = "e-p:32:32:32-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:32:64-f32:32:32-f64:32:64-v64:64:64-v128:128:128-a0:0:64-f80:128:128"
  6. declare i32 @ffs(i32)
  7. declare i32 @ffsl(i32)
  8. declare i32 @ffsll(i64)
  9. ; Check ffs(0) -> 0.
  10. define i32 @test_simplify1() {
  11. ; CHECK-LABEL: @test_simplify1(
  12. %ret = call i32 @ffs(i32 0)
  13. ret i32 %ret
  14. ; CHECK-NEXT: ret i32 0
  15. }
  16. define i32 @test_simplify2() {
  17. ; CHECK-LINUX-LABEL: @test_simplify2(
  18. %ret = call i32 @ffsl(i32 0)
  19. ret i32 %ret
  20. ; CHECK-LINUX-NEXT: ret i32 0
  21. }
  22. define i32 @test_simplify3() {
  23. ; CHECK-LINUX-LABEL: @test_simplify3(
  24. %ret = call i32 @ffsll(i64 0)
  25. ret i32 %ret
  26. ; CHECK-LINUX-NEXT: ret i32 0
  27. }
  28. ; Check ffs(c) -> cttz(c) + 1, where 'c' is a constant.
  29. define i32 @test_simplify4() {
  30. ; CHECK-LABEL: @test_simplify4(
  31. %ret = call i32 @ffs(i32 1)
  32. ret i32 %ret
  33. ; CHECK-NEXT: ret i32 1
  34. }
  35. define i32 @test_simplify5() {
  36. ; CHECK-LABEL: @test_simplify5(
  37. %ret = call i32 @ffs(i32 2048)
  38. ret i32 %ret
  39. ; CHECK-NEXT: ret i32 12
  40. }
  41. define i32 @test_simplify6() {
  42. ; CHECK-LABEL: @test_simplify6(
  43. %ret = call i32 @ffs(i32 65536)
  44. ret i32 %ret
  45. ; CHECK-NEXT: ret i32 17
  46. }
  47. define i32 @test_simplify7() {
  48. ; CHECK-LINUX-LABEL: @test_simplify7(
  49. %ret = call i32 @ffsl(i32 65536)
  50. ret i32 %ret
  51. ; CHECK-LINUX-NEXT: ret i32 17
  52. }
  53. define i32 @test_simplify8() {
  54. ; CHECK-LINUX-LABEL: @test_simplify8(
  55. %ret = call i32 @ffsll(i64 1024)
  56. ret i32 %ret
  57. ; CHECK-LINUX-NEXT: ret i32 11
  58. }
  59. define i32 @test_simplify9() {
  60. ; CHECK-LINUX-LABEL: @test_simplify9(
  61. %ret = call i32 @ffsll(i64 65536)
  62. ret i32 %ret
  63. ; CHECK-LINUX-NEXT: ret i32 17
  64. }
  65. define i32 @test_simplify10() {
  66. ; CHECK-LINUX-LABEL: @test_simplify10(
  67. %ret = call i32 @ffsll(i64 17179869184)
  68. ret i32 %ret
  69. ; CHECK-LINUX-NEXT: ret i32 35
  70. }
  71. define i32 @test_simplify11() {
  72. ; CHECK-LINUX-LABEL: @test_simplify11(
  73. %ret = call i32 @ffsll(i64 281474976710656)
  74. ret i32 %ret
  75. ; CHECK-LINUX-NEXT: ret i32 49
  76. }
  77. define i32 @test_simplify12() {
  78. ; CHECK-LINUX-LABEL: @test_simplify12(
  79. %ret = call i32 @ffsll(i64 1152921504606846976)
  80. ret i32 %ret
  81. ; CHECK-LINUX-NEXT: ret i32 61
  82. }
  83. ; Check ffs(x) -> x != 0 ? (i32)llvm.cttz(x) + 1 : 0.
  84. define i32 @test_simplify13(i32 %x) {
  85. ; CHECK-LABEL: @test_simplify13(
  86. %ret = call i32 @ffs(i32 %x)
  87. ; CHECK-NEXT: [[CTTZ:%[a-z0-9]+]] = call i32 @llvm.cttz.i32(i32 %x, i1 false)
  88. ; CHECK-NEXT: [[INC:%[a-z0-9]+]] = add nuw nsw i32 [[CTTZ]], 1
  89. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %x, 0
  90. ; CHECK-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[INC]], i32 0
  91. ret i32 %ret
  92. ; CHECK-NEXT: ret i32 [[RET]]
  93. }
  94. define i32 @test_simplify14(i32 %x) {
  95. ; CHECK-LINUX-LABEL: @test_simplify14(
  96. %ret = call i32 @ffsl(i32 %x)
  97. ; CHECK-LINUX-NEXT: [[CTTZ:%[a-z0-9]+]] = call i32 @llvm.cttz.i32(i32 %x, i1 false)
  98. ; CHECK-LINUX-NEXT: [[INC:%[a-z0-9]+]] = add nuw nsw i32 [[CTTZ]], 1
  99. ; CHECK-LINUX-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i32 %x, 0
  100. ; CHECK-LINUX-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[INC]], i32 0
  101. ret i32 %ret
  102. ; CHECK-LINUX-NEXT: ret i32 [[RET]]
  103. }
  104. define i32 @test_simplify15(i64 %x) {
  105. ; CHECK-LINUX-LABEL: @test_simplify15(
  106. %ret = call i32 @ffsll(i64 %x)
  107. ; CHECK-LINUX-NEXT: [[CTTZ:%[a-z0-9]+]] = call i64 @llvm.cttz.i64(i64 %x, i1 false)
  108. ; CHECK-LINUX-NEXT: [[INC:%[a-z0-9]+]] = add nuw nsw i64 [[CTTZ]], 1
  109. ; CHECK-LINUX-NEXT: [[TRUNC:%[a-z0-9]+]] = trunc i64 [[INC]] to i32
  110. ; CHECK-LINUX-NEXT: [[CMP:%[a-z0-9]+]] = icmp ne i64 %x, 0
  111. ; CHECK-LINUX-NEXT: [[RET:%[a-z0-9]+]] = select i1 [[CMP]], i32 [[TRUNC]], i32 0
  112. ret i32 %ret
  113. ; CHECK-LINUX-NEXT: ret i32 [[RET]]
  114. }