icmp-logical.ll 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172
  1. ; RUN: opt -instcombine -S -o - %s | FileCheck %s
  2. define i1 @masked_and_notallzeroes(i32 %A) {
  3. ; CHECK-LABEL: @masked_and_notallzeroes
  4. ; CHECK: [[MASK:%.*]] = and i32 %A, 7
  5. ; CHECK: icmp ne i32 [[MASK]], 0
  6. ; CHECK-NOT: and i32 %A, 39
  7. ; CHECK: ret i1
  8. %mask1 = and i32 %A, 7
  9. %tst1 = icmp ne i32 %mask1, 0
  10. %mask2 = and i32 %A, 39
  11. %tst2 = icmp ne i32 %mask2, 0
  12. %res = and i1 %tst1, %tst2
  13. ret i1 %res
  14. }
  15. define i1 @masked_or_allzeroes(i32 %A) {
  16. ; CHECK-LABEL: @masked_or_allzeroes
  17. ; CHECK: [[MASK:%.*]] = and i32 %A, 7
  18. ; CHECK: icmp eq i32 [[MASK]], 0
  19. ; CHECK-NOT: and i32 %A, 39
  20. ; CHECK: ret i1
  21. %mask1 = and i32 %A, 7
  22. %tst1 = icmp eq i32 %mask1, 0
  23. %mask2 = and i32 %A, 39
  24. %tst2 = icmp eq i32 %mask2, 0
  25. %res = or i1 %tst1, %tst2
  26. ret i1 %res
  27. }
  28. define i1 @masked_and_notallones(i32 %A) {
  29. ; CHECK-LABEL: @masked_and_notallones
  30. ; CHECK: [[MASK:%.*]] = and i32 %A, 7
  31. ; CHECK: icmp ne i32 [[MASK]], 7
  32. ; CHECK-NOT: and i32 %A, 39
  33. ; CHECK: ret i1
  34. %mask1 = and i32 %A, 7
  35. %tst1 = icmp ne i32 %mask1, 7
  36. %mask2 = and i32 %A, 39
  37. %tst2 = icmp ne i32 %mask2, 39
  38. %res = and i1 %tst1, %tst2
  39. ret i1 %res
  40. }
  41. define i1 @masked_or_allones(i32 %A) {
  42. ; CHECK-LABEL: @masked_or_allones
  43. ; CHECK: [[MASK:%.*]] = and i32 %A, 7
  44. ; CHECK: icmp eq i32 [[MASK]], 7
  45. ; CHECK-NOT: and i32 %A, 39
  46. ; CHECK: ret i1
  47. %mask1 = and i32 %A, 7
  48. %tst1 = icmp eq i32 %mask1, 7
  49. %mask2 = and i32 %A, 39
  50. %tst2 = icmp eq i32 %mask2, 39
  51. %res = or i1 %tst1, %tst2
  52. ret i1 %res
  53. }
  54. define i1 @masked_and_notA(i32 %A) {
  55. ; CHECK-LABEL: @masked_and_notA
  56. ; CHECK: [[MASK:%.*]] = and i32 %A, 39
  57. ; CHECK: icmp ne i32 [[MASK]], %A
  58. ; CHECK-NOT: and i32 %A, 7
  59. ; CHECK: ret i1
  60. %mask1 = and i32 %A, 7
  61. %tst1 = icmp ne i32 %mask1, %A
  62. %mask2 = and i32 %A, 39
  63. %tst2 = icmp ne i32 %mask2, %A
  64. %res = and i1 %tst1, %tst2
  65. ret i1 %res
  66. }
  67. define i1 @masked_or_A(i32 %A) {
  68. ; CHECK-LABEL: @masked_or_A
  69. ; CHECK: [[MASK:%.*]] = and i32 %A, 39
  70. ; CHECK: icmp eq i32 [[MASK]], %A
  71. ; CHECK-NOT: and i32 %A, 7
  72. ; CHECK: ret i1
  73. %mask1 = and i32 %A, 7
  74. %tst1 = icmp eq i32 %mask1, %A
  75. %mask2 = and i32 %A, 39
  76. %tst2 = icmp eq i32 %mask2, %A
  77. %res = or i1 %tst1, %tst2
  78. ret i1 %res
  79. }
  80. define i1 @masked_or_allzeroes_notoptimised(i32 %A) {
  81. ; CHECK-LABEL: @masked_or_allzeroes_notoptimised
  82. ; CHECK: [[MASK:%.*]] = and i32 %A, 15
  83. ; CHECK: icmp eq i32 [[MASK]], 0
  84. ; CHECK: [[MASK:%.*]] = and i32 %A, 39
  85. ; CHECK: icmp eq i32 [[MASK]], 0
  86. ; CHECK: ret i1
  87. %mask1 = and i32 %A, 15
  88. %tst1 = icmp eq i32 %mask1, 0
  89. %mask2 = and i32 %A, 39
  90. %tst2 = icmp eq i32 %mask2, 0
  91. %res = or i1 %tst1, %tst2
  92. ret i1 %res
  93. }
  94. define i1 @nomask_lhs(i32 %in) {
  95. ; CHECK-LABEL: @nomask_lhs
  96. ; CHECK: [[MASK:%.*]] = and i32 %in, 1
  97. ; CHECK: icmp eq i32 [[MASK]], 0
  98. ; CHECK-NOT: icmp
  99. ; CHECK: ret i1
  100. %tst1 = icmp eq i32 %in, 0
  101. %masked = and i32 %in, 1
  102. %tst2 = icmp eq i32 %masked, 0
  103. %val = or i1 %tst1, %tst2
  104. ret i1 %val
  105. }
  106. define i1 @nomask_rhs(i32 %in) {
  107. ; CHECK-LABEL: @nomask_rhs
  108. ; CHECK: [[MASK:%.*]] = and i32 %in, 1
  109. ; CHECK: icmp eq i32 [[MASK]], 0
  110. ; CHECK-NOT: icmp
  111. ; CHECK: ret i1
  112. %masked = and i32 %in, 1
  113. %tst1 = icmp eq i32 %masked, 0
  114. %tst2 = icmp eq i32 %in, 0
  115. %val = or i1 %tst1, %tst2
  116. ret i1 %val
  117. }
  118. define i1 @fold_mask_cmps_to_false(i32 %x) {
  119. ; CHECK-LABEL: @fold_mask_cmps_to_false
  120. ; CHECK: ret i1 false
  121. %1 = and i32 %x, 2147483647
  122. %2 = icmp eq i32 %1, 0
  123. %3 = icmp eq i32 %x, 2147483647
  124. %4 = and i1 %3, %2
  125. ret i1 %4
  126. }
  127. define i1 @fold_mask_cmps_to_true(i32 %x) {
  128. ; CHECK-LABEL: @fold_mask_cmps_to_true
  129. ; CHECK: ret i1 true
  130. %1 = and i32 %x, 2147483647
  131. %2 = icmp ne i32 %1, 0
  132. %3 = icmp ne i32 %x, 2147483647
  133. %4 = or i1 %3, %2
  134. ret i1 %4
  135. }