2004-11-27-SetCCForCastLargerAndConstant.ll 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192
  1. ; This test case tests the InstructionCombining optimization that
  2. ; reduces things like:
  3. ; %Y = sext i8 %X to i32
  4. ; %C = icmp ult i32 %Y, 1024
  5. ; to
  6. ; %C = i1 true
  7. ; It includes test cases for different constant values, signedness of the
  8. ; cast operands, and types of setCC operators. In all cases, the cast should
  9. ; be eliminated. In many cases the setCC is also eliminated based on the
  10. ; constant value and the range of the casted value.
  11. ;
  12. ; RUN: opt < %s -instcombine -S | FileCheck %s
  13. ; END.
  14. define i1 @lt_signed_to_large_unsigned(i8 %SB) {
  15. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  16. %C = icmp ult i32 %Y, 1024 ; <i1> [#uses=1]
  17. ret i1 %C
  18. ; CHECK: %C1 = icmp sgt i8 %SB, -1
  19. ; CHECK: ret i1 %C1
  20. }
  21. define i1 @lt_signed_to_large_signed(i8 %SB) {
  22. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  23. %C = icmp slt i32 %Y, 1024 ; <i1> [#uses=1]
  24. ret i1 %C
  25. ; CHECK: ret i1 true
  26. }
  27. define i1 @lt_signed_to_large_negative(i8 %SB) {
  28. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  29. %C = icmp slt i32 %Y, -1024 ; <i1> [#uses=1]
  30. ret i1 %C
  31. ; CHECK: ret i1 false
  32. }
  33. define i1 @lt_signed_to_small_unsigned(i8 %SB) {
  34. %Y = sext i8 %SB to i32
  35. %C = icmp ult i32 %Y, 17
  36. ret i1 %C
  37. ; CHECK: %C = icmp ult i8 %SB, 17
  38. ; CHECK: ret i1 %C
  39. }
  40. define i1 @lt_signed_to_small_signed(i8 %SB) {
  41. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  42. %C = icmp slt i32 %Y, 17 ; <i1> [#uses=1]
  43. ret i1 %C
  44. ; CHECK: %C = icmp slt i8 %SB, 17
  45. ; CHECK: ret i1 %C
  46. }
  47. define i1 @lt_signed_to_small_negative(i8 %SB) {
  48. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  49. %C = icmp slt i32 %Y, -17 ; <i1> [#uses=1]
  50. ret i1 %C
  51. ; CHECK: %C = icmp slt i8 %SB, -17
  52. ; CHECK: ret i1 %C
  53. }
  54. define i1 @lt_unsigned_to_large_unsigned(i8 %SB) {
  55. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  56. %C = icmp ult i32 %Y, 1024 ; <i1> [#uses=1]
  57. ret i1 %C
  58. ; CHECK: ret i1 true
  59. }
  60. define i1 @lt_unsigned_to_large_signed(i8 %SB) {
  61. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  62. %C = icmp slt i32 %Y, 1024 ; <i1> [#uses=1]
  63. ret i1 %C
  64. ; CHECK: ret i1 true
  65. }
  66. define i1 @lt_unsigned_to_large_negative(i8 %SB) {
  67. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  68. %C = icmp slt i32 %Y, -1024 ; <i1> [#uses=1]
  69. ret i1 %C
  70. ; CHECK: ret i1 false
  71. }
  72. define i1 @lt_unsigned_to_small_unsigned(i8 %SB) {
  73. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  74. %C = icmp ult i32 %Y, 17 ; <i1> [#uses=1]
  75. ret i1 %C
  76. ; CHECK: %C = icmp ult i8 %SB, 17
  77. ; CHECK: ret i1 %C
  78. }
  79. define i1 @lt_unsigned_to_small_signed(i8 %SB) {
  80. %Y = zext i8 %SB to i32
  81. %C = icmp slt i32 %Y, 17
  82. ret i1 %C
  83. ; CHECK: %C = icmp ult i8 %SB, 17
  84. ; CHECK: ret i1 %C
  85. }
  86. define i1 @lt_unsigned_to_small_negative(i8 %SB) {
  87. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  88. %C = icmp slt i32 %Y, -17 ; <i1> [#uses=1]
  89. ret i1 %C
  90. ; CHECK: ret i1 false
  91. }
  92. define i1 @gt_signed_to_large_unsigned(i8 %SB) {
  93. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  94. %C = icmp ugt i32 %Y, 1024 ; <i1> [#uses=1]
  95. ret i1 %C
  96. ; CHECK: %C = icmp slt i8 %SB, 0
  97. ; CHECK: ret i1 %C
  98. }
  99. define i1 @gt_signed_to_large_signed(i8 %SB) {
  100. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  101. %C = icmp sgt i32 %Y, 1024 ; <i1> [#uses=1]
  102. ret i1 %C
  103. ; CHECK: ret i1 false
  104. }
  105. define i1 @gt_signed_to_large_negative(i8 %SB) {
  106. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  107. %C = icmp sgt i32 %Y, -1024 ; <i1> [#uses=1]
  108. ret i1 %C
  109. ; CHECK: ret i1 true
  110. }
  111. define i1 @gt_signed_to_small_unsigned(i8 %SB) {
  112. %Y = sext i8 %SB to i32
  113. %C = icmp ugt i32 %Y, 17
  114. ret i1 %C
  115. ; CHECK: %C = icmp ugt i8 %SB, 17
  116. ; CHECK: ret i1 %C
  117. }
  118. define i1 @gt_signed_to_small_signed(i8 %SB) {
  119. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  120. %C = icmp sgt i32 %Y, 17 ; <i1> [#uses=1]
  121. ret i1 %C
  122. ; CHECK: %C = icmp sgt i8 %SB, 17
  123. ; CHECK: ret i1 %C
  124. }
  125. define i1 @gt_signed_to_small_negative(i8 %SB) {
  126. %Y = sext i8 %SB to i32 ; <i32> [#uses=1]
  127. %C = icmp sgt i32 %Y, -17 ; <i1> [#uses=1]
  128. ret i1 %C
  129. ; CHECK: %C = icmp sgt i8 %SB, -17
  130. ; CHECK: ret i1 %C
  131. }
  132. define i1 @gt_unsigned_to_large_unsigned(i8 %SB) {
  133. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  134. %C = icmp ugt i32 %Y, 1024 ; <i1> [#uses=1]
  135. ret i1 %C
  136. ; CHECK: ret i1 false
  137. }
  138. define i1 @gt_unsigned_to_large_signed(i8 %SB) {
  139. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  140. %C = icmp sgt i32 %Y, 1024 ; <i1> [#uses=1]
  141. ret i1 %C
  142. ; CHECK: ret i1 false
  143. }
  144. define i1 @gt_unsigned_to_large_negative(i8 %SB) {
  145. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  146. %C = icmp sgt i32 %Y, -1024 ; <i1> [#uses=1]
  147. ret i1 %C
  148. ; CHECK: ret i1 true
  149. }
  150. define i1 @gt_unsigned_to_small_unsigned(i8 %SB) {
  151. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  152. %C = icmp ugt i32 %Y, 17 ; <i1> [#uses=1]
  153. ret i1 %C
  154. ; CHECK: %C = icmp ugt i8 %SB, 17
  155. ; CHECK: ret i1 %C
  156. }
  157. define i1 @gt_unsigned_to_small_signed(i8 %SB) {
  158. %Y = zext i8 %SB to i32
  159. %C = icmp sgt i32 %Y, 17
  160. ret i1 %C
  161. ; CHECK: %C = icmp ugt i8 %SB, 17
  162. ; CHECK: ret i1 %C
  163. }
  164. define i1 @gt_unsigned_to_small_negative(i8 %SB) {
  165. %Y = zext i8 %SB to i32 ; <i32> [#uses=1]
  166. %C = icmp sgt i32 %Y, -17 ; <i1> [#uses=1]
  167. ret i1 %C
  168. ; CHECK: ret i1 true
  169. }