icmp-shr.ll 8.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. target datalayout = "e-p:64:64:64-p1:16:16:16-p2:32:32:32-p3:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
  3. ; CHECK-LABEL: @lshr_eq_msb_low_last_zero
  4. ; CHECK-NEXT: icmp ugt i8 %a, 6
  5. define i1 @lshr_eq_msb_low_last_zero(i8 %a) {
  6. %shr = lshr i8 127, %a
  7. %cmp = icmp eq i8 %shr, 0
  8. ret i1 %cmp
  9. }
  10. ; CHECK-LABEL: @ashr_eq_msb_low_second_zero
  11. ; CHECK-NEXT: icmp ugt i8 %a, 6
  12. define i1 @ashr_eq_msb_low_second_zero(i8 %a) {
  13. %shr = ashr i8 127, %a
  14. %cmp = icmp eq i8 %shr, 0
  15. ret i1 %cmp
  16. }
  17. ; CHECK-LABEL: @lshr_ne_msb_low_last_zero
  18. ; CHECK-NEXT: icmp ult i8 %a, 7
  19. define i1 @lshr_ne_msb_low_last_zero(i8 %a) {
  20. %shr = lshr i8 127, %a
  21. %cmp = icmp ne i8 %shr, 0
  22. ret i1 %cmp
  23. }
  24. ; CHECK-LABEL: @ashr_ne_msb_low_second_zero
  25. ; CHECK-NEXT: icmp ult i8 %a, 7
  26. define i1 @ashr_ne_msb_low_second_zero(i8 %a) {
  27. %shr = ashr i8 127, %a
  28. %cmp = icmp ne i8 %shr, 0
  29. ret i1 %cmp
  30. }
  31. ; CHECK-LABEL: @ashr_eq_both_equal
  32. ; CHECK-NEXT: icmp eq i8 %a, 0
  33. define i1 @ashr_eq_both_equal(i8 %a) {
  34. %shr = ashr i8 128, %a
  35. %cmp = icmp eq i8 %shr, 128
  36. ret i1 %cmp
  37. }
  38. ; CHECK-LABEL: @ashr_ne_both_equal
  39. ; CHECK-NEXT: icmp ne i8 %a, 0
  40. define i1 @ashr_ne_both_equal(i8 %a) {
  41. %shr = ashr i8 128, %a
  42. %cmp = icmp ne i8 %shr, 128
  43. ret i1 %cmp
  44. }
  45. ; CHECK-LABEL: @lshr_eq_both_equal
  46. ; CHECK-NEXT: icmp eq i8 %a, 0
  47. define i1 @lshr_eq_both_equal(i8 %a) {
  48. %shr = lshr i8 127, %a
  49. %cmp = icmp eq i8 %shr, 127
  50. ret i1 %cmp
  51. }
  52. ; CHECK-LABEL: @lshr_ne_both_equal
  53. ; CHECK-NEXT: icmp ne i8 %a, 0
  54. define i1 @lshr_ne_both_equal(i8 %a) {
  55. %shr = lshr i8 127, %a
  56. %cmp = icmp ne i8 %shr, 127
  57. ret i1 %cmp
  58. }
  59. ; CHECK-LABEL: @exact_ashr_eq_both_equal
  60. ; CHECK-NEXT: icmp eq i8 %a, 0
  61. define i1 @exact_ashr_eq_both_equal(i8 %a) {
  62. %shr = ashr exact i8 128, %a
  63. %cmp = icmp eq i8 %shr, 128
  64. ret i1 %cmp
  65. }
  66. ; CHECK-LABEL: @exact_ashr_ne_both_equal
  67. ; CHECK-NEXT: icmp ne i8 %a, 0
  68. define i1 @exact_ashr_ne_both_equal(i8 %a) {
  69. %shr = ashr exact i8 128, %a
  70. %cmp = icmp ne i8 %shr, 128
  71. ret i1 %cmp
  72. }
  73. ; CHECK-LABEL: @exact_lshr_eq_both_equal
  74. ; CHECK-NEXT: icmp eq i8 %a, 0
  75. define i1 @exact_lshr_eq_both_equal(i8 %a) {
  76. %shr = lshr exact i8 126, %a
  77. %cmp = icmp eq i8 %shr, 126
  78. ret i1 %cmp
  79. }
  80. ; CHECK-LABEL: @exact_lshr_ne_both_equal
  81. ; CHECK-NEXT: icmp ne i8 %a, 0
  82. define i1 @exact_lshr_ne_both_equal(i8 %a) {
  83. %shr = lshr exact i8 126, %a
  84. %cmp = icmp ne i8 %shr, 126
  85. ret i1 %cmp
  86. }
  87. ; CHECK-LABEL: @exact_lshr_eq_opposite_msb
  88. ; CHECK-NEXT: icmp eq i8 %a, 7
  89. define i1 @exact_lshr_eq_opposite_msb(i8 %a) {
  90. %shr = lshr exact i8 -128, %a
  91. %cmp = icmp eq i8 %shr, 1
  92. ret i1 %cmp
  93. }
  94. ; CHECK-LABEL: @lshr_eq_opposite_msb
  95. ; CHECK-NEXT: icmp eq i8 %a, 7
  96. define i1 @lshr_eq_opposite_msb(i8 %a) {
  97. %shr = lshr i8 -128, %a
  98. %cmp = icmp eq i8 %shr, 1
  99. ret i1 %cmp
  100. }
  101. ; CHECK-LABEL: @exact_lshr_ne_opposite_msb
  102. ; CHECK-NEXT: icmp ne i8 %a, 7
  103. define i1 @exact_lshr_ne_opposite_msb(i8 %a) {
  104. %shr = lshr exact i8 -128, %a
  105. %cmp = icmp ne i8 %shr, 1
  106. ret i1 %cmp
  107. }
  108. ; CHECK-LABEL: @lshr_ne_opposite_msb
  109. ; CHECK-NEXT: icmp ne i8 %a, 7
  110. define i1 @lshr_ne_opposite_msb(i8 %a) {
  111. %shr = lshr i8 -128, %a
  112. %cmp = icmp ne i8 %shr, 1
  113. ret i1 %cmp
  114. }
  115. ; CHECK-LABEL: @exact_ashr_eq
  116. ; CHECK-NEXT: icmp eq i8 %a, 7
  117. define i1 @exact_ashr_eq(i8 %a) {
  118. %shr = ashr exact i8 -128, %a
  119. %cmp = icmp eq i8 %shr, -1
  120. ret i1 %cmp
  121. }
  122. ; CHECK-LABEL: @exact_ashr_ne
  123. ; CHECK-NEXT: icmp ne i8 %a, 7
  124. define i1 @exact_ashr_ne(i8 %a) {
  125. %shr = ashr exact i8 -128, %a
  126. %cmp = icmp ne i8 %shr, -1
  127. ret i1 %cmp
  128. }
  129. ; CHECK-LABEL: @exact_lshr_eq
  130. ; CHECK-NEXT: icmp eq i8 %a, 2
  131. define i1 @exact_lshr_eq(i8 %a) {
  132. %shr = lshr exact i8 4, %a
  133. %cmp = icmp eq i8 %shr, 1
  134. ret i1 %cmp
  135. }
  136. ; CHECK-LABEL: @exact_lshr_ne
  137. ; CHECK-NEXT: icmp ne i8 %a, 2
  138. define i1 @exact_lshr_ne(i8 %a) {
  139. %shr = lshr exact i8 4, %a
  140. %cmp = icmp ne i8 %shr, 1
  141. ret i1 %cmp
  142. }
  143. ; CHECK-LABEL: @nonexact_ashr_eq
  144. ; CHECK-NEXT: icmp eq i8 %a, 7
  145. define i1 @nonexact_ashr_eq(i8 %a) {
  146. %shr = ashr i8 -128, %a
  147. %cmp = icmp eq i8 %shr, -1
  148. ret i1 %cmp
  149. }
  150. ; CHECK-LABEL: @nonexact_ashr_ne
  151. ; CHECK-NEXT: icmp ne i8 %a, 7
  152. define i1 @nonexact_ashr_ne(i8 %a) {
  153. %shr = ashr i8 -128, %a
  154. %cmp = icmp ne i8 %shr, -1
  155. ret i1 %cmp
  156. }
  157. ; CHECK-LABEL: @nonexact_lshr_eq
  158. ; CHECK-NEXT: icmp eq i8 %a, 2
  159. define i1 @nonexact_lshr_eq(i8 %a) {
  160. %shr = lshr i8 4, %a
  161. %cmp = icmp eq i8 %shr, 1
  162. ret i1 %cmp
  163. }
  164. ; CHECK-LABEL: @nonexact_lshr_ne
  165. ; CHECK-NEXT: icmp ne i8 %a, 2
  166. define i1 @nonexact_lshr_ne(i8 %a) {
  167. %shr = lshr i8 4, %a
  168. %cmp = icmp ne i8 %shr, 1
  169. ret i1 %cmp
  170. }
  171. ; CHECK-LABEL: @exact_lshr_eq_exactdiv
  172. ; CHECK-NEXT: icmp eq i8 %a, 4
  173. define i1 @exact_lshr_eq_exactdiv(i8 %a) {
  174. %shr = lshr exact i8 80, %a
  175. %cmp = icmp eq i8 %shr, 5
  176. ret i1 %cmp
  177. }
  178. ; CHECK-LABEL: @exact_lshr_ne_exactdiv
  179. ; CHECK-NEXT: icmp ne i8 %a, 4
  180. define i1 @exact_lshr_ne_exactdiv(i8 %a) {
  181. %shr = lshr exact i8 80, %a
  182. %cmp = icmp ne i8 %shr, 5
  183. ret i1 %cmp
  184. }
  185. ; CHECK-LABEL: @nonexact_lshr_eq_exactdiv
  186. ; CHECK-NEXT: icmp eq i8 %a, 4
  187. define i1 @nonexact_lshr_eq_exactdiv(i8 %a) {
  188. %shr = lshr i8 80, %a
  189. %cmp = icmp eq i8 %shr, 5
  190. ret i1 %cmp
  191. }
  192. ; CHECK-LABEL: @nonexact_lshr_ne_exactdiv
  193. ; CHECK-NEXT: icmp ne i8 %a, 4
  194. define i1 @nonexact_lshr_ne_exactdiv(i8 %a) {
  195. %shr = lshr i8 80, %a
  196. %cmp = icmp ne i8 %shr, 5
  197. ret i1 %cmp
  198. }
  199. ; CHECK-LABEL: @exact_ashr_eq_exactdiv
  200. ; CHECK-NEXT: icmp eq i8 %a, 4
  201. define i1 @exact_ashr_eq_exactdiv(i8 %a) {
  202. %shr = ashr exact i8 -80, %a
  203. %cmp = icmp eq i8 %shr, -5
  204. ret i1 %cmp
  205. }
  206. ; CHECK-LABEL: @exact_ashr_ne_exactdiv
  207. ; CHECK-NEXT: icmp ne i8 %a, 4
  208. define i1 @exact_ashr_ne_exactdiv(i8 %a) {
  209. %shr = ashr exact i8 -80, %a
  210. %cmp = icmp ne i8 %shr, -5
  211. ret i1 %cmp
  212. }
  213. ; CHECK-LABEL: @nonexact_ashr_eq_exactdiv
  214. ; CHECK-NEXT: icmp eq i8 %a, 4
  215. define i1 @nonexact_ashr_eq_exactdiv(i8 %a) {
  216. %shr = ashr i8 -80, %a
  217. %cmp = icmp eq i8 %shr, -5
  218. ret i1 %cmp
  219. }
  220. ; CHECK-LABEL: @nonexact_ashr_ne_exactdiv
  221. ; CHECK-NEXT: icmp ne i8 %a, 4
  222. define i1 @nonexact_ashr_ne_exactdiv(i8 %a) {
  223. %shr = ashr i8 -80, %a
  224. %cmp = icmp ne i8 %shr, -5
  225. ret i1 %cmp
  226. }
  227. ; CHECK-LABEL: @exact_lshr_eq_noexactdiv
  228. ; CHECK-NEXT: ret i1 false
  229. define i1 @exact_lshr_eq_noexactdiv(i8 %a) {
  230. %shr = lshr exact i8 80, %a
  231. %cmp = icmp eq i8 %shr, 31
  232. ret i1 %cmp
  233. }
  234. ; CHECK-LABEL: @exact_lshr_ne_noexactdiv
  235. ; CHECK-NEXT: ret i1 true
  236. define i1 @exact_lshr_ne_noexactdiv(i8 %a) {
  237. %shr = lshr exact i8 80, %a
  238. %cmp = icmp ne i8 %shr, 31
  239. ret i1 %cmp
  240. }
  241. ; CHECK-LABEL: @nonexact_lshr_eq_noexactdiv
  242. ; CHECK-NEXT: ret i1 false
  243. define i1 @nonexact_lshr_eq_noexactdiv(i8 %a) {
  244. %shr = lshr i8 80, %a
  245. %cmp = icmp eq i8 %shr, 31
  246. ret i1 %cmp
  247. }
  248. ; CHECK-LABEL: @nonexact_lshr_ne_noexactdiv
  249. ; CHECK-NEXT: ret i1 true
  250. define i1 @nonexact_lshr_ne_noexactdiv(i8 %a) {
  251. %shr = lshr i8 80, %a
  252. %cmp = icmp ne i8 %shr, 31
  253. ret i1 %cmp
  254. }
  255. ; CHECK-LABEL: @exact_ashr_eq_noexactdiv
  256. ; CHECK-NEXT: ret i1 false
  257. define i1 @exact_ashr_eq_noexactdiv(i8 %a) {
  258. %shr = ashr exact i8 -80, %a
  259. %cmp = icmp eq i8 %shr, -31
  260. ret i1 %cmp
  261. }
  262. ; CHECK-LABEL: @exact_ashr_ne_noexactdiv
  263. ; CHECK-NEXT: ret i1 true
  264. define i1 @exact_ashr_ne_noexactdiv(i8 %a) {
  265. %shr = ashr exact i8 -80, %a
  266. %cmp = icmp ne i8 %shr, -31
  267. ret i1 %cmp
  268. }
  269. ; CHECK-LABEL: @nonexact_ashr_eq_noexactdiv
  270. ; CHECK-NEXT: ret i1 false
  271. define i1 @nonexact_ashr_eq_noexactdiv(i8 %a) {
  272. %shr = ashr i8 -80, %a
  273. %cmp = icmp eq i8 %shr, -31
  274. ret i1 %cmp
  275. }
  276. ; CHECK-LABEL: @nonexact_ashr_ne_noexactdiv
  277. ; CHECK-NEXT: ret i1 true
  278. define i1 @nonexact_ashr_ne_noexactdiv(i8 %a) {
  279. %shr = ashr i8 -80, %a
  280. %cmp = icmp ne i8 %shr, -31
  281. ret i1 %cmp
  282. }
  283. ; CHECK-LABEL: @nonexact_lshr_eq_noexactlog
  284. ; CHECK-NEXT: ret i1 false
  285. define i1 @nonexact_lshr_eq_noexactlog(i8 %a) {
  286. %shr = lshr i8 90, %a
  287. %cmp = icmp eq i8 %shr, 30
  288. ret i1 %cmp
  289. }
  290. ; CHECK-LABEL: @nonexact_lshr_ne_noexactlog
  291. ; CHECK-NEXT: ret i1 true
  292. define i1 @nonexact_lshr_ne_noexactlog(i8 %a) {
  293. %shr = lshr i8 90, %a
  294. %cmp = icmp ne i8 %shr, 30
  295. ret i1 %cmp
  296. }
  297. ; CHECK-LABEL: @nonexact_ashr_eq_noexactlog
  298. ; CHECK-NEXT: ret i1 false
  299. define i1 @nonexact_ashr_eq_noexactlog(i8 %a) {
  300. %shr = ashr i8 -90, %a
  301. %cmp = icmp eq i8 %shr, -30
  302. ret i1 %cmp
  303. }
  304. ; CHECK-LABEL: @nonexact_ashr_ne_noexactlog
  305. ; CHECK-NEXT: ret i1 true
  306. define i1 @nonexact_ashr_ne_noexactlog(i8 %a) {
  307. %shr = ashr i8 -90, %a
  308. %cmp = icmp ne i8 %shr, -30
  309. ret i1 %cmp
  310. }
  311. ; Don't try to fold the entire body of function @PR20945 into a
  312. ; single `ret i1 true` statement.
  313. ; If %B is equal to 1, then this function would return false.
  314. ; As a consequence, the instruction combiner is not allowed to fold %cmp
  315. ; to 'true'. Instead, it should replace %cmp with a simpler comparison
  316. ; between %B and 1.
  317. ; CHECK-LABEL: @PR20945(
  318. ; CHECK: icmp ne i32 %B, 1
  319. define i1 @PR20945(i32 %B) {
  320. %shr = ashr i32 -9, %B
  321. %cmp = icmp ne i32 %shr, -5
  322. ret i1 %cmp
  323. }
  324. ; CHECK-LABEL: @PR21222
  325. ; CHECK: icmp eq i32 %B, 6
  326. define i1 @PR21222(i32 %B) {
  327. %shr = ashr i32 -93, %B
  328. %cmp = icmp eq i32 %shr, -2
  329. ret i1 %cmp
  330. }