select.ll 43 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564
  1. ; RUN: opt < %s -instcombine -S | FileCheck %s
  2. ; This test makes sure that these instructions are properly eliminated.
  3. ; PR1822
  4. target datalayout = "e-p:64:64-p1:16:16-p2:32:32:32-p3:64:64:64"
  5. define i32 @test1(i32 %A, i32 %B) {
  6. %C = select i1 false, i32 %A, i32 %B
  7. ret i32 %C
  8. ; CHECK-LABEL: @test1(
  9. ; CHECK: ret i32 %B
  10. }
  11. define i32 @test2(i32 %A, i32 %B) {
  12. %C = select i1 true, i32 %A, i32 %B
  13. ret i32 %C
  14. ; CHECK-LABEL: @test2(
  15. ; CHECK: ret i32 %A
  16. }
  17. define i32 @test3(i1 %C, i32 %I) {
  18. ; V = I
  19. %V = select i1 %C, i32 %I, i32 %I
  20. ret i32 %V
  21. ; CHECK-LABEL: @test3(
  22. ; CHECK: ret i32 %I
  23. }
  24. define i1 @test4(i1 %C) {
  25. ; V = C
  26. %V = select i1 %C, i1 true, i1 false
  27. ret i1 %V
  28. ; CHECK-LABEL: @test4(
  29. ; CHECK: ret i1 %C
  30. }
  31. define i1 @test5(i1 %C) {
  32. ; V = !C
  33. %V = select i1 %C, i1 false, i1 true
  34. ret i1 %V
  35. ; CHECK-LABEL: @test5(
  36. ; CHECK: xor i1 %C, true
  37. ; CHECK: ret i1
  38. }
  39. define i32 @test6(i1 %C) {
  40. ; V = cast C to int
  41. %V = select i1 %C, i32 1, i32 0
  42. ret i32 %V
  43. ; CHECK-LABEL: @test6(
  44. ; CHECK: %V = zext i1 %C to i32
  45. ; CHECK: ret i32 %V
  46. }
  47. define i1 @test7(i1 %C, i1 %X) {
  48. ; R = or C, X
  49. %R = select i1 %C, i1 true, i1 %X
  50. ret i1 %R
  51. ; CHECK-LABEL: @test7(
  52. ; CHECK: %R = or i1 %C, %X
  53. ; CHECK: ret i1 %R
  54. }
  55. define i1 @test8(i1 %C, i1 %X) {
  56. ; R = and C, X
  57. %R = select i1 %C, i1 %X, i1 false
  58. ret i1 %R
  59. ; CHECK-LABEL: @test8(
  60. ; CHECK: %R = and i1 %C, %X
  61. ; CHECK: ret i1 %R
  62. }
  63. define i1 @test9(i1 %C, i1 %X) {
  64. ; R = and !C, X
  65. %R = select i1 %C, i1 false, i1 %X
  66. ret i1 %R
  67. ; CHECK-LABEL: @test9(
  68. ; CHECK: xor i1 %C, true
  69. ; CHECK: %R = and i1
  70. ; CHECK: ret i1 %R
  71. }
  72. define i1 @test10(i1 %C, i1 %X) {
  73. ; R = or !C, X
  74. %R = select i1 %C, i1 %X, i1 true
  75. ret i1 %R
  76. ; CHECK-LABEL: @test10(
  77. ; CHECK: xor i1 %C, true
  78. ; CHECK: %R = or i1
  79. ; CHECK: ret i1 %R
  80. }
  81. define i32 @test11(i32 %a) {
  82. %C = icmp eq i32 %a, 0
  83. %R = select i1 %C, i32 0, i32 1
  84. ret i32 %R
  85. ; CHECK-LABEL: @test11(
  86. ; CHECK: icmp ne i32 %a, 0
  87. ; CHECK: %R = zext i1
  88. ; CHECK: ret i32 %R
  89. }
  90. define i32 @test12(i1 %cond, i32 %a) {
  91. %b = or i32 %a, 1
  92. %c = select i1 %cond, i32 %b, i32 %a
  93. ret i32 %c
  94. ; CHECK-LABEL: @test12(
  95. ; CHECK: %b = zext i1 %cond to i32
  96. ; CHECK: %c = or i32 %b, %a
  97. ; CHECK: ret i32 %c
  98. }
  99. define i32 @test12a(i1 %cond, i32 %a) {
  100. %b = ashr i32 %a, 1
  101. %c = select i1 %cond, i32 %b, i32 %a
  102. ret i32 %c
  103. ; CHECK-LABEL: @test12a(
  104. ; CHECK: %b = zext i1 %cond to i32
  105. ; CHECK: %c = ashr i32 %a, %b
  106. ; CHECK: ret i32 %c
  107. }
  108. define i32 @test12b(i1 %cond, i32 %a) {
  109. %b = ashr i32 %a, 1
  110. %c = select i1 %cond, i32 %a, i32 %b
  111. ret i32 %c
  112. ; CHECK-LABEL: @test12b(
  113. ; CHECK: zext i1 %cond to i32
  114. ; CHECK: %b = xor i32
  115. ; CHECK: %c = ashr i32 %a, %b
  116. ; CHECK: ret i32 %c
  117. }
  118. define i32 @test13(i32 %a, i32 %b) {
  119. %C = icmp eq i32 %a, %b
  120. %V = select i1 %C, i32 %a, i32 %b
  121. ret i32 %V
  122. ; CHECK-LABEL: @test13(
  123. ; CHECK: ret i32 %b
  124. }
  125. define i32 @test13a(i32 %a, i32 %b) {
  126. %C = icmp ne i32 %a, %b
  127. %V = select i1 %C, i32 %a, i32 %b
  128. ret i32 %V
  129. ; CHECK-LABEL: @test13a(
  130. ; CHECK: ret i32 %a
  131. }
  132. define i32 @test13b(i32 %a, i32 %b) {
  133. %C = icmp eq i32 %a, %b
  134. %V = select i1 %C, i32 %b, i32 %a
  135. ret i32 %V
  136. ; CHECK-LABEL: @test13b(
  137. ; CHECK: ret i32 %a
  138. }
  139. define i1 @test14a(i1 %C, i32 %X) {
  140. %V = select i1 %C, i32 %X, i32 0
  141. ; (X < 1) | !C
  142. %R = icmp slt i32 %V, 1
  143. ret i1 %R
  144. ; CHECK-LABEL: @test14a(
  145. ; CHECK: icmp slt i32 %X, 1
  146. ; CHECK: xor i1 %C, true
  147. ; CHECK: or i1
  148. ; CHECK: ret i1 %R
  149. }
  150. define i1 @test14b(i1 %C, i32 %X) {
  151. %V = select i1 %C, i32 0, i32 %X
  152. ; (X < 1) | C
  153. %R = icmp slt i32 %V, 1
  154. ret i1 %R
  155. ; CHECK-LABEL: @test14b(
  156. ; CHECK: icmp slt i32 %X, 1
  157. ; CHECK: or i1
  158. ; CHECK: ret i1 %R
  159. }
  160. ;; Code sequence for (X & 16) ? 16 : 0
  161. define i32 @test15a(i32 %X) {
  162. %t1 = and i32 %X, 16
  163. %t2 = icmp eq i32 %t1, 0
  164. %t3 = select i1 %t2, i32 0, i32 16
  165. ret i32 %t3
  166. ; CHECK-LABEL: @test15a(
  167. ; CHECK: %t1 = and i32 %X, 16
  168. ; CHECK: ret i32 %t1
  169. }
  170. ;; Code sequence for (X & 32) ? 0 : 24
  171. define i32 @test15b(i32 %X) {
  172. %t1 = and i32 %X, 32
  173. %t2 = icmp eq i32 %t1, 0
  174. %t3 = select i1 %t2, i32 32, i32 0
  175. ret i32 %t3
  176. ; CHECK-LABEL: @test15b(
  177. ; CHECK: %t1 = and i32 %X, 32
  178. ; CHECK: xor i32 %t1, 32
  179. ; CHECK: ret i32
  180. }
  181. ;; Alternate code sequence for (X & 16) ? 16 : 0
  182. define i32 @test15c(i32 %X) {
  183. %t1 = and i32 %X, 16
  184. %t2 = icmp eq i32 %t1, 16
  185. %t3 = select i1 %t2, i32 16, i32 0
  186. ret i32 %t3
  187. ; CHECK-LABEL: @test15c(
  188. ; CHECK: %t1 = and i32 %X, 16
  189. ; CHECK: ret i32 %t1
  190. }
  191. ;; Alternate code sequence for (X & 16) ? 16 : 0
  192. define i32 @test15d(i32 %X) {
  193. %t1 = and i32 %X, 16
  194. %t2 = icmp ne i32 %t1, 0
  195. %t3 = select i1 %t2, i32 16, i32 0
  196. ret i32 %t3
  197. ; CHECK-LABEL: @test15d(
  198. ; CHECK: %t1 = and i32 %X, 16
  199. ; CHECK: ret i32 %t1
  200. }
  201. ;; (a & 128) ? 256 : 0
  202. define i32 @test15e(i32 %X) {
  203. %t1 = and i32 %X, 128
  204. %t2 = icmp ne i32 %t1, 0
  205. %t3 = select i1 %t2, i32 256, i32 0
  206. ret i32 %t3
  207. ; CHECK-LABEL: @test15e(
  208. ; CHECK: %t1 = shl i32 %X, 1
  209. ; CHECK: and i32 %t1, 256
  210. ; CHECK: ret i32
  211. }
  212. ;; (a & 128) ? 0 : 256
  213. define i32 @test15f(i32 %X) {
  214. %t1 = and i32 %X, 128
  215. %t2 = icmp ne i32 %t1, 0
  216. %t3 = select i1 %t2, i32 0, i32 256
  217. ret i32 %t3
  218. ; CHECK-LABEL: @test15f(
  219. ; CHECK: %t1 = shl i32 %X, 1
  220. ; CHECK: and i32 %t1, 256
  221. ; CHECK: xor i32 %{{.*}}, 256
  222. ; CHECK: ret i32
  223. }
  224. ;; (a & 8) ? -1 : -9
  225. define i32 @test15g(i32 %X) {
  226. %t1 = and i32 %X, 8
  227. %t2 = icmp ne i32 %t1, 0
  228. %t3 = select i1 %t2, i32 -1, i32 -9
  229. ret i32 %t3
  230. ; CHECK-LABEL: @test15g(
  231. ; CHECK-NEXT: %1 = or i32 %X, -9
  232. ; CHECK-NEXT: ret i32 %1
  233. }
  234. ;; (a & 8) ? -9 : -1
  235. define i32 @test15h(i32 %X) {
  236. %t1 = and i32 %X, 8
  237. %t2 = icmp ne i32 %t1, 0
  238. %t3 = select i1 %t2, i32 -9, i32 -1
  239. ret i32 %t3
  240. ; CHECK-LABEL: @test15h(
  241. ; CHECK-NEXT: %1 = or i32 %X, -9
  242. ; CHECK-NEXT: %2 = xor i32 %1, 8
  243. ; CHECK-NEXT: ret i32 %2
  244. }
  245. ;; (a & 2) ? 577 : 1089
  246. define i32 @test15i(i32 %X) {
  247. %t1 = and i32 %X, 2
  248. %t2 = icmp ne i32 %t1, 0
  249. %t3 = select i1 %t2, i32 577, i32 1089
  250. ret i32 %t3
  251. ; CHECK-LABEL: @test15i(
  252. ; CHECK-NEXT: %t1 = shl i32 %X, 8
  253. ; CHECK-NEXT: %1 = and i32 %t1, 512
  254. ; CHECK-NEXT: %2 = xor i32 %1, 512
  255. ; CHECK-NEXT: %3 = add nuw nsw i32 %2, 577
  256. ; CHECK-NEXT: ret i32 %3
  257. }
  258. ;; (a & 2) ? 1089 : 577
  259. define i32 @test15j(i32 %X) {
  260. %t1 = and i32 %X, 2
  261. %t2 = icmp ne i32 %t1, 0
  262. %t3 = select i1 %t2, i32 1089, i32 577
  263. ret i32 %t3
  264. ; CHECK-LABEL: @test15j(
  265. ; CHECK-NEXT: %t1 = shl i32 %X, 8
  266. ; CHECK-NEXT: %1 = and i32 %t1, 512
  267. ; CHECK-NEXT: %2 = add nuw nsw i32 %1, 577
  268. ; CHECK-NEXT: ret i32 %2
  269. }
  270. define i32 @test16(i1 %C, i32* %P) {
  271. %P2 = select i1 %C, i32* %P, i32* null
  272. %V = load i32, i32* %P2
  273. ret i32 %V
  274. ; CHECK-LABEL: @test16(
  275. ; CHECK-NEXT: %V = load i32, i32* %P
  276. ; CHECK: ret i32 %V
  277. }
  278. ;; It may be legal to load from a null address in a non-zero address space
  279. define i32 @test16_neg(i1 %C, i32 addrspace(1)* %P) {
  280. %P2 = select i1 %C, i32 addrspace(1)* %P, i32 addrspace(1)* null
  281. %V = load i32, i32 addrspace(1)* %P2
  282. ret i32 %V
  283. ; CHECK-LABEL: @test16_neg
  284. ; CHECK-NEXT: %P2 = select i1 %C, i32 addrspace(1)* %P, i32 addrspace(1)* null
  285. ; CHECK-NEXT: %V = load i32, i32 addrspace(1)* %P2
  286. ; CHECK: ret i32 %V
  287. }
  288. define i32 @test16_neg2(i1 %C, i32 addrspace(1)* %P) {
  289. %P2 = select i1 %C, i32 addrspace(1)* null, i32 addrspace(1)* %P
  290. %V = load i32, i32 addrspace(1)* %P2
  291. ret i32 %V
  292. ; CHECK-LABEL: @test16_neg2
  293. ; CHECK-NEXT: %P2 = select i1 %C, i32 addrspace(1)* null, i32 addrspace(1)* %P
  294. ; CHECK-NEXT: %V = load i32, i32 addrspace(1)* %P2
  295. ; CHECK: ret i32 %V
  296. }
  297. define i1 @test17(i32* %X, i1 %C) {
  298. %R = select i1 %C, i32* %X, i32* null
  299. %RV = icmp eq i32* %R, null
  300. ret i1 %RV
  301. ; CHECK-LABEL: @test17(
  302. ; CHECK: icmp eq i32* %X, null
  303. ; CHECK: xor i1 %C, true
  304. ; CHECK: %RV = or i1
  305. ; CHECK: ret i1 %RV
  306. }
  307. define i32 @test18(i32 %X, i32 %Y, i1 %C) {
  308. %R = select i1 %C, i32 %X, i32 0
  309. %V = sdiv i32 %Y, %R
  310. ret i32 %V
  311. ; CHECK-LABEL: @test18(
  312. ; CHECK: %V = sdiv i32 %Y, %X
  313. ; CHECK: ret i32 %V
  314. }
  315. define i32 @test19(i32 %x) {
  316. %tmp = icmp ugt i32 %x, 2147483647
  317. %retval = select i1 %tmp, i32 -1, i32 0
  318. ret i32 %retval
  319. ; CHECK-LABEL: @test19(
  320. ; CHECK-NEXT: ashr i32 %x, 31
  321. ; CHECK-NEXT: ret i32
  322. }
  323. define i32 @test20(i32 %x) {
  324. %tmp = icmp slt i32 %x, 0
  325. %retval = select i1 %tmp, i32 -1, i32 0
  326. ret i32 %retval
  327. ; CHECK-LABEL: @test20(
  328. ; CHECK-NEXT: ashr i32 %x, 31
  329. ; CHECK-NEXT: ret i32
  330. }
  331. define i64 @test21(i32 %x) {
  332. %tmp = icmp slt i32 %x, 0
  333. %retval = select i1 %tmp, i64 -1, i64 0
  334. ret i64 %retval
  335. ; CHECK-LABEL: @test21(
  336. ; CHECK-NEXT: ashr i32 %x, 31
  337. ; CHECK-NEXT: sext i32
  338. ; CHECK-NEXT: ret i64
  339. }
  340. define i16 @test22(i32 %x) {
  341. %tmp = icmp slt i32 %x, 0
  342. %retval = select i1 %tmp, i16 -1, i16 0
  343. ret i16 %retval
  344. ; CHECK-LABEL: @test22(
  345. ; CHECK-NEXT: ashr i32 %x, 31
  346. ; CHECK-NEXT: trunc i32
  347. ; CHECK-NEXT: ret i16
  348. }
  349. define i1 @test23(i1 %a, i1 %b) {
  350. %c = select i1 %a, i1 %b, i1 %a
  351. ret i1 %c
  352. ; CHECK-LABEL: @test23(
  353. ; CHECK-NEXT: %c = and i1 %a, %b
  354. ; CHECK-NEXT: ret i1 %c
  355. }
  356. define i1 @test24(i1 %a, i1 %b) {
  357. %c = select i1 %a, i1 %a, i1 %b
  358. ret i1 %c
  359. ; CHECK-LABEL: @test24(
  360. ; CHECK-NEXT: %c = or i1 %a, %b
  361. ; CHECK-NEXT: ret i1 %c
  362. }
  363. define i32 @test25(i1 %c) {
  364. entry:
  365. br i1 %c, label %jump, label %ret
  366. jump:
  367. br label %ret
  368. ret:
  369. %a = phi i1 [true, %jump], [false, %entry]
  370. %b = select i1 %a, i32 10, i32 20
  371. ret i32 %b
  372. ; CHECK-LABEL: @test25(
  373. ; CHECK: %a = phi i32 [ 10, %jump ], [ 20, %entry ]
  374. ; CHECK-NEXT: ret i32 %a
  375. }
  376. define i32 @test26(i1 %cond) {
  377. entry:
  378. br i1 %cond, label %jump, label %ret
  379. jump:
  380. %c = or i1 false, false
  381. br label %ret
  382. ret:
  383. %a = phi i1 [true, %entry], [%c, %jump]
  384. %b = select i1 %a, i32 20, i32 10
  385. ret i32 %b
  386. ; CHECK-LABEL: @test26(
  387. ; CHECK: %a = phi i32 [ 20, %entry ], [ 10, %jump ]
  388. ; CHECK-NEXT: ret i32 %a
  389. }
  390. define i32 @test27(i1 %c, i32 %A, i32 %B) {
  391. entry:
  392. br i1 %c, label %jump, label %ret
  393. jump:
  394. br label %ret
  395. ret:
  396. %a = phi i1 [true, %jump], [false, %entry]
  397. %b = select i1 %a, i32 %A, i32 %B
  398. ret i32 %b
  399. ; CHECK-LABEL: @test27(
  400. ; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ]
  401. ; CHECK-NEXT: ret i32 %a
  402. }
  403. define i32 @test28(i1 %cond, i32 %A, i32 %B) {
  404. entry:
  405. br i1 %cond, label %jump, label %ret
  406. jump:
  407. br label %ret
  408. ret:
  409. %c = phi i32 [%A, %jump], [%B, %entry]
  410. %a = phi i1 [true, %jump], [false, %entry]
  411. %b = select i1 %a, i32 %A, i32 %c
  412. ret i32 %b
  413. ; CHECK-LABEL: @test28(
  414. ; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ]
  415. ; CHECK-NEXT: ret i32 %a
  416. }
  417. define i32 @test29(i1 %cond, i32 %A, i32 %B) {
  418. entry:
  419. br i1 %cond, label %jump, label %ret
  420. jump:
  421. br label %ret
  422. ret:
  423. %c = phi i32 [%A, %jump], [%B, %entry]
  424. %a = phi i1 [true, %jump], [false, %entry]
  425. br label %next
  426. next:
  427. %b = select i1 %a, i32 %A, i32 %c
  428. ret i32 %b
  429. ; CHECK-LABEL: @test29(
  430. ; CHECK: %a = phi i32 [ %A, %jump ], [ %B, %entry ]
  431. ; CHECK: ret i32 %a
  432. }
  433. ; SMAX(SMAX(x, y), x) -> SMAX(x, y)
  434. define i32 @test30(i32 %x, i32 %y) {
  435. %cmp = icmp sgt i32 %x, %y
  436. %cond = select i1 %cmp, i32 %x, i32 %y
  437. %cmp5 = icmp sgt i32 %cond, %x
  438. %retval = select i1 %cmp5, i32 %cond, i32 %x
  439. ret i32 %retval
  440. ; CHECK-LABEL: @test30(
  441. ; CHECK: ret i32 %cond
  442. }
  443. ; UMAX(UMAX(x, y), x) -> UMAX(x, y)
  444. define i32 @test31(i32 %x, i32 %y) {
  445. %cmp = icmp ugt i32 %x, %y
  446. %cond = select i1 %cmp, i32 %x, i32 %y
  447. %cmp5 = icmp ugt i32 %cond, %x
  448. %retval = select i1 %cmp5, i32 %cond, i32 %x
  449. ret i32 %retval
  450. ; CHECK-LABEL: @test31(
  451. ; CHECK: ret i32 %cond
  452. }
  453. ; SMIN(SMIN(x, y), x) -> SMIN(x, y)
  454. define i32 @test32(i32 %x, i32 %y) {
  455. %cmp = icmp sgt i32 %x, %y
  456. %cond = select i1 %cmp, i32 %y, i32 %x
  457. %cmp5 = icmp sgt i32 %cond, %x
  458. %retval = select i1 %cmp5, i32 %x, i32 %cond
  459. ret i32 %retval
  460. ; CHECK-LABEL: @test32(
  461. ; CHECK: ret i32 %cond
  462. }
  463. ; MAX(MIN(x, y), x) -> x
  464. define i32 @test33(i32 %x, i32 %y) {
  465. %cmp = icmp sgt i32 %x, %y
  466. %cond = select i1 %cmp, i32 %y, i32 %x
  467. %cmp5 = icmp sgt i32 %cond, %x
  468. %retval = select i1 %cmp5, i32 %cond, i32 %x
  469. ret i32 %retval
  470. ; CHECK-LABEL: @test33(
  471. ; CHECK: ret i32 %x
  472. }
  473. ; MIN(MAX(x, y), x) -> x
  474. define i32 @test34(i32 %x, i32 %y) {
  475. %cmp = icmp sgt i32 %x, %y
  476. %cond = select i1 %cmp, i32 %x, i32 %y
  477. %cmp5 = icmp sgt i32 %cond, %x
  478. %retval = select i1 %cmp5, i32 %x, i32 %cond
  479. ret i32 %retval
  480. ; CHECK-LABEL: @test34(
  481. ; CHECK: ret i32 %x
  482. }
  483. define i32 @test35(i32 %x) {
  484. %cmp = icmp sge i32 %x, 0
  485. %cond = select i1 %cmp, i32 60, i32 100
  486. ret i32 %cond
  487. ; CHECK-LABEL: @test35(
  488. ; CHECK: ashr i32 %x, 31
  489. ; CHECK: and i32 {{.*}}, 40
  490. ; CHECK: add nuw nsw i32 {{.*}}, 60
  491. ; CHECK: ret
  492. }
  493. define i32 @test36(i32 %x) {
  494. %cmp = icmp slt i32 %x, 0
  495. %cond = select i1 %cmp, i32 60, i32 100
  496. ret i32 %cond
  497. ; CHECK-LABEL: @test36(
  498. ; CHECK: ashr i32 %x, 31
  499. ; CHECK: and i32 {{.*}}, -40
  500. ; CHECK: add nsw i32 {{.*}}, 100
  501. ; CHECK: ret
  502. }
  503. define i32 @test37(i32 %x) {
  504. %cmp = icmp sgt i32 %x, -1
  505. %cond = select i1 %cmp, i32 1, i32 -1
  506. ret i32 %cond
  507. ; CHECK-LABEL: @test37(
  508. ; CHECK: ashr i32 %x, 31
  509. ; CHECK: or i32 {{.*}}, 1
  510. ; CHECK: ret
  511. }
  512. define i1 @test38(i1 %cond) {
  513. %zero = alloca i32
  514. %one = alloca i32
  515. %ptr = select i1 %cond, i32* %zero, i32* %one
  516. %isnull = icmp eq i32* %ptr, null
  517. ret i1 %isnull
  518. ; CHECK-LABEL: @test38(
  519. ; CHECK: ret i1 false
  520. }
  521. define i1 @test39(i1 %cond, double %x) {
  522. %s = select i1 %cond, double %x, double 0x7FF0000000000000 ; RHS = +infty
  523. %cmp = fcmp ule double %x, %s
  524. ret i1 %cmp
  525. ; CHECK-LABEL: @test39(
  526. ; CHECK: ret i1 true
  527. }
  528. define i1 @test40(i1 %cond) {
  529. %a = alloca i32
  530. %b = alloca i32
  531. %c = alloca i32
  532. %s = select i1 %cond, i32* %a, i32* %b
  533. %r = icmp eq i32* %s, %c
  534. ret i1 %r
  535. ; CHECK-LABEL: @test40(
  536. ; CHECK: ret i1 false
  537. }
  538. define i32 @test41(i1 %cond, i32 %x, i32 %y) {
  539. %z = and i32 %x, %y
  540. %s = select i1 %cond, i32 %y, i32 %z
  541. %r = and i32 %x, %s
  542. ret i32 %r
  543. ; CHECK-LABEL: @test41(
  544. ; CHECK-NEXT: and i32 %x, %y
  545. ; CHECK-NEXT: ret i32
  546. }
  547. define i32 @test42(i32 %x, i32 %y) {
  548. %b = add i32 %y, -1
  549. %cond = icmp eq i32 %x, 0
  550. %c = select i1 %cond, i32 %b, i32 %y
  551. ret i32 %c
  552. ; CHECK-LABEL: @test42(
  553. ; CHECK-NEXT: %cond = icmp eq i32 %x, 0
  554. ; CHECK-NEXT: %b = sext i1 %cond to i32
  555. ; CHECK-NEXT: %c = add i32 %b, %y
  556. ; CHECK-NEXT: ret i32 %c
  557. }
  558. define i64 @test43(i32 %a) nounwind {
  559. %a_ext = sext i32 %a to i64
  560. %is_a_nonnegative = icmp sgt i32 %a, -1
  561. %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 0
  562. ret i64 %max
  563. ; CHECK-LABEL: @test43(
  564. ; CHECK-NEXT: %a_ext = sext i32 %a to i64
  565. ; CHECK-NEXT: %is_a_nonnegative = icmp slt i64 %a_ext, 0
  566. ; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 0, i64 %a_ext
  567. ; CHECK-NEXT: ret i64 %max
  568. }
  569. define i64 @test44(i32 %a) nounwind {
  570. %a_ext = sext i32 %a to i64
  571. %is_a_nonpositive = icmp slt i32 %a, 1
  572. %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 0
  573. ret i64 %min
  574. ; CHECK-LABEL: @test44(
  575. ; CHECK-NEXT: %a_ext = sext i32 %a to i64
  576. ; CHECK-NEXT: %is_a_nonpositive = icmp sgt i64 %a_ext, 0
  577. ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 0, i64 %a_ext
  578. ; CHECK-NEXT: ret i64 %min
  579. }
  580. define i64 @test45(i32 %a) nounwind {
  581. %a_ext = zext i32 %a to i64
  582. %is_a_nonnegative = icmp ugt i32 %a, 2
  583. %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 3
  584. ret i64 %max
  585. ; CHECK-LABEL: @test45(
  586. ; CHECK-NEXT: %a_ext = zext i32 %a to i64
  587. ; CHECK-NEXT: %is_a_nonnegative = icmp ult i64 %a_ext, 3
  588. ; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 3, i64 %a_ext
  589. ; CHECK-NEXT: ret i64 %max
  590. }
  591. define i64 @test46(i32 %a) nounwind {
  592. %a_ext = zext i32 %a to i64
  593. %is_a_nonpositive = icmp ult i32 %a, 3
  594. %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
  595. ret i64 %min
  596. ; CHECK-LABEL: @test46(
  597. ; CHECK-NEXT: %a_ext = zext i32 %a to i64
  598. ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
  599. ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
  600. ; CHECK-NEXT: ret i64 %min
  601. }
  602. define i64 @test47(i32 %a) nounwind {
  603. %a_ext = sext i32 %a to i64
  604. %is_a_nonnegative = icmp ugt i32 %a, 2
  605. %max = select i1 %is_a_nonnegative, i64 %a_ext, i64 3
  606. ret i64 %max
  607. ; CHECK-LABEL: @test47(
  608. ; CHECK-NEXT: %a_ext = sext i32 %a to i64
  609. ; CHECK-NEXT: %is_a_nonnegative = icmp ult i64 %a_ext, 3
  610. ; CHECK-NEXT: %max = select i1 %is_a_nonnegative, i64 3, i64 %a_ext
  611. ; CHECK-NEXT: ret i64 %max
  612. }
  613. define i64 @test48(i32 %a) nounwind {
  614. %a_ext = sext i32 %a to i64
  615. %is_a_nonpositive = icmp ult i32 %a, 3
  616. %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
  617. ret i64 %min
  618. ; CHECK-LABEL: @test48(
  619. ; CHECK-NEXT: %a_ext = sext i32 %a to i64
  620. ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
  621. ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
  622. ; CHECK-NEXT: ret i64 %min
  623. }
  624. define i64 @test49(i32 %a) nounwind {
  625. %a_ext = sext i32 %a to i64
  626. %is_a_nonpositive = icmp ult i32 %a, 3
  627. %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
  628. ret i64 %min
  629. ; CHECK-LABEL: @test49(
  630. ; CHECK-NEXT: %a_ext = sext i32 %a to i64
  631. ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
  632. ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
  633. ; CHECK-NEXT: ret i64 %min
  634. }
  635. define i64 @test50(i32 %a) nounwind {
  636. %is_a_nonpositive = icmp ult i32 %a, 3
  637. %a_ext = sext i32 %a to i64
  638. %min = select i1 %is_a_nonpositive, i64 2, i64 %a_ext
  639. ret i64 %min
  640. ; CHECK-LABEL: @test50(
  641. ; CHECK-NEXT: %a_ext = sext i32 %a to i64
  642. ; CHECK-NEXT: %is_a_nonpositive = icmp ugt i64 %a_ext, 2
  643. ; CHECK-NEXT: %min = select i1 %is_a_nonpositive, i64 %a_ext, i64 2
  644. ; CHECK-NEXT: ret i64 %min
  645. }
  646. ; PR8994
  647. ; This select instruction can't be eliminated because trying to do so would
  648. ; change the number of vector elements. This used to assert.
  649. define i48 @test51(<3 x i1> %icmp, <3 x i16> %tmp) {
  650. ; CHECK-LABEL: @test51(
  651. %select = select <3 x i1> %icmp, <3 x i16> zeroinitializer, <3 x i16> %tmp
  652. ; CHECK: select <3 x i1>
  653. %tmp2 = bitcast <3 x i16> %select to i48
  654. ret i48 %tmp2
  655. }
  656. ; PR8575
  657. define i32 @test52(i32 %n, i32 %m) nounwind {
  658. ; CHECK-LABEL: @test52(
  659. %cmp = icmp sgt i32 %n, %m
  660. %. = select i1 %cmp, i32 1, i32 3
  661. %add = add nsw i32 %., 3
  662. %storemerge = select i1 %cmp, i32 %., i32 %add
  663. ; CHECK: select i1 %cmp, i32 1, i32 6
  664. ret i32 %storemerge
  665. }
  666. ; PR9454
  667. define i32 @test53(i32 %x) nounwind {
  668. %and = and i32 %x, 2
  669. %cmp = icmp eq i32 %and, %x
  670. %sel = select i1 %cmp, i32 2, i32 1
  671. ret i32 %sel
  672. ; CHECK-LABEL: @test53(
  673. ; CHECK: select i1 %cmp
  674. ; CHECK: ret
  675. }
  676. define i32 @test54(i32 %X, i32 %Y) {
  677. %A = ashr exact i32 %X, %Y
  678. %B = icmp eq i32 %A, 0
  679. %C = select i1 %B, i32 %A, i32 1
  680. ret i32 %C
  681. ; CHECK-LABEL: @test54(
  682. ; CHECK-NOT: ashr
  683. ; CHECK-NOT: select
  684. ; CHECK: icmp ne i32 %X, 0
  685. ; CHECK: zext
  686. ; CHECK: ret
  687. }
  688. define i1 @test55(i1 %X, i32 %Y, i32 %Z) {
  689. %A = ashr exact i32 %Y, %Z
  690. %B = select i1 %X, i32 %Y, i32 %A
  691. %C = icmp eq i32 %B, 0
  692. ret i1 %C
  693. ; CHECK-LABEL: @test55(
  694. ; CHECK-NOT: ashr
  695. ; CHECK-NOT: select
  696. ; CHECK: icmp eq
  697. ; CHECK: ret i1
  698. }
  699. define i32 @test56(i16 %x) nounwind {
  700. %tobool = icmp eq i16 %x, 0
  701. %conv = zext i16 %x to i32
  702. %cond = select i1 %tobool, i32 0, i32 %conv
  703. ret i32 %cond
  704. ; CHECK-LABEL: @test56(
  705. ; CHECK-NEXT: zext
  706. ; CHECK-NEXT: ret
  707. }
  708. define i32 @test57(i32 %x, i32 %y) nounwind {
  709. %and = and i32 %x, %y
  710. %tobool = icmp eq i32 %x, 0
  711. %.and = select i1 %tobool, i32 0, i32 %and
  712. ret i32 %.and
  713. ; CHECK-LABEL: @test57(
  714. ; CHECK-NEXT: and i32 %x, %y
  715. ; CHECK-NEXT: ret
  716. }
  717. define i32 @test58(i16 %x) nounwind {
  718. %tobool = icmp ne i16 %x, 1
  719. %conv = zext i16 %x to i32
  720. %cond = select i1 %tobool, i32 %conv, i32 1
  721. ret i32 %cond
  722. ; CHECK-LABEL: @test58(
  723. ; CHECK-NEXT: zext
  724. ; CHECK-NEXT: ret
  725. }
  726. define i32 @test59(i32 %x, i32 %y) nounwind {
  727. %and = and i32 %x, %y
  728. %tobool = icmp ne i32 %x, %y
  729. %.and = select i1 %tobool, i32 %and, i32 %y
  730. ret i32 %.and
  731. ; CHECK-LABEL: @test59(
  732. ; CHECK-NEXT: and i32 %x, %y
  733. ; CHECK-NEXT: ret
  734. }
  735. define i1 @test60(i32 %x, i1* %y) nounwind {
  736. %cmp = icmp eq i32 %x, 0
  737. %load = load i1, i1* %y, align 1
  738. %cmp1 = icmp slt i32 %x, 1
  739. %sel = select i1 %cmp, i1 %load, i1 %cmp1
  740. ret i1 %sel
  741. ; CHECK-LABEL: @test60(
  742. ; CHECK: select
  743. }
  744. @glbl = constant i32 10
  745. define i32 @test61(i32* %ptr) {
  746. %A = load i32, i32* %ptr
  747. %B = icmp eq i32* %ptr, @glbl
  748. %C = select i1 %B, i32 %A, i32 10
  749. ret i32 %C
  750. ; CHECK-LABEL: @test61(
  751. ; CHECK: ret i32 10
  752. }
  753. define i1 @test62(i1 %A, i1 %B) {
  754. %not = xor i1 %A, true
  755. %C = select i1 %A, i1 %not, i1 %B
  756. ret i1 %C
  757. ; CHECK-LABEL: @test62(
  758. ; CHECK: %not = xor i1 %A, true
  759. ; CHECK: %C = and i1 %not, %B
  760. ; CHECK: ret i1 %C
  761. }
  762. define i1 @test63(i1 %A, i1 %B) {
  763. %not = xor i1 %A, true
  764. %C = select i1 %A, i1 %B, i1 %not
  765. ret i1 %C
  766. ; CHECK-LABEL: @test63(
  767. ; CHECK: %not = xor i1 %A, true
  768. ; CHECK: %C = or i1 %B, %not
  769. ; CHECK: ret i1 %C
  770. }
  771. ; PR14131
  772. define void @test64(i32 %p, i16 %b) noreturn nounwind {
  773. entry:
  774. %p.addr.0.insert.mask = and i32 %p, -65536
  775. %conv2 = and i32 %p, 65535
  776. br i1 undef, label %lor.rhs, label %lor.end
  777. lor.rhs:
  778. %p.addr.0.extract.trunc = trunc i32 %p.addr.0.insert.mask to i16
  779. %phitmp = zext i16 %p.addr.0.extract.trunc to i32
  780. br label %lor.end
  781. lor.end:
  782. %t.1 = phi i32 [ 0, %entry ], [ %phitmp, %lor.rhs ]
  783. %conv6 = zext i16 %b to i32
  784. %div = udiv i32 %conv6, %t.1
  785. %tobool8 = icmp eq i32 %div, 0
  786. %cmp = icmp eq i32 %t.1, 0
  787. %cmp12 = icmp ult i32 %conv2, 2
  788. %cmp.sink = select i1 %tobool8, i1 %cmp12, i1 %cmp
  789. br i1 %cmp.sink, label %cond.end17, label %cond.false16
  790. cond.false16:
  791. br label %cond.end17
  792. cond.end17:
  793. br label %while.body
  794. while.body:
  795. br label %while.body
  796. ; CHECK-LABEL: @test64(
  797. ; CHECK-NOT: select
  798. }
  799. ; CHECK-LABEL: @select_icmp_eq_and_1_0_or_2(
  800. ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 %x, 1
  801. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], 2
  802. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y
  803. ; CHECK-NEXT: ret i32 [[OR]]
  804. define i32 @select_icmp_eq_and_1_0_or_2(i32 %x, i32 %y) {
  805. %and = and i32 %x, 1
  806. %cmp = icmp eq i32 %and, 0
  807. %or = or i32 %y, 2
  808. %select = select i1 %cmp, i32 %y, i32 %or
  809. ret i32 %select
  810. }
  811. ; CHECK-LABEL: @select_icmp_eq_and_32_0_or_8(
  812. ; CHECK-NEXT: [[LSHR:%[a-z0-9]+]] = lshr i32 %x, 2
  813. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[LSHR]], 8
  814. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y
  815. ; CHECK-NEXT: ret i32 [[OR]]
  816. define i32 @select_icmp_eq_and_32_0_or_8(i32 %x, i32 %y) {
  817. %and = and i32 %x, 32
  818. %cmp = icmp eq i32 %and, 0
  819. %or = or i32 %y, 8
  820. %select = select i1 %cmp, i32 %y, i32 %or
  821. ret i32 %select
  822. }
  823. ; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_4096(
  824. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 4096
  825. ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 4096
  826. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
  827. ; CHECK-NEXT: ret i32 [[OR]]
  828. define i32 @select_icmp_ne_0_and_4096_or_4096(i32 %x, i32 %y) {
  829. %and = and i32 %x, 4096
  830. %cmp = icmp ne i32 0, %and
  831. %or = or i32 %y, 4096
  832. %select = select i1 %cmp, i32 %y, i32 %or
  833. ret i32 %select
  834. }
  835. ; CHECK-LABEL: @select_icmp_eq_and_4096_0_or_4096(
  836. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 4096
  837. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[AND]], %y
  838. ; CHECK-NEXT: ret i32 [[OR]]
  839. define i32 @select_icmp_eq_and_4096_0_or_4096(i32 %x, i32 %y) {
  840. %and = and i32 %x, 4096
  841. %cmp = icmp eq i32 %and, 0
  842. %or = or i32 %y, 4096
  843. %select = select i1 %cmp, i32 %y, i32 %or
  844. ret i32 %select
  845. }
  846. ; CHECK-LABEL: @select_icmp_eq_0_and_1_or_1(
  847. ; CHECK-NEXT: [[TRUNC:%.+]] = trunc i64 %x to i32
  848. ; CHECK-NEXT: [[AND:%.+]] = and i32 [[TRUNC]], 1
  849. ; CHECK-NEXT: [[OR:%.+]] = or i32 [[XOR]], %y
  850. ; CHECK-NEXT: ret i32 [[OR]]
  851. define i32 @select_icmp_eq_0_and_1_or_1(i64 %x, i32 %y) {
  852. %and = and i64 %x, 1
  853. %cmp = icmp eq i64 %and, 0
  854. %or = or i32 %y, 1
  855. %select = select i1 %cmp, i32 %y, i32 %or
  856. ret i32 %select
  857. }
  858. ; CHECK-LABEL: @select_icmp_ne_0_and_4096_or_32(
  859. ; CHECK-NEXT: [[LSHR:%[a-z0-9]+]] = lshr i32 %x, 7
  860. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[LSHR]], 32
  861. ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 32
  862. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
  863. ; CHECK-NEXT: ret i32 [[OR]]
  864. define i32 @select_icmp_ne_0_and_4096_or_32(i32 %x, i32 %y) {
  865. %and = and i32 %x, 4096
  866. %cmp = icmp ne i32 0, %and
  867. %or = or i32 %y, 32
  868. %select = select i1 %cmp, i32 %y, i32 %or
  869. ret i32 %select
  870. }
  871. ; CHECK-LABEL: @select_icmp_ne_0_and_32_or_4096(
  872. ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl i32 %x, 7
  873. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 [[SHL]], 4096
  874. ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[AND]], 4096
  875. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
  876. ; CHECK-NEXT: ret i32 [[OR]]
  877. define i32 @select_icmp_ne_0_and_32_or_4096(i32 %x, i32 %y) {
  878. %and = and i32 %x, 32
  879. %cmp = icmp ne i32 0, %and
  880. %or = or i32 %y, 4096
  881. %select = select i1 %cmp, i32 %y, i32 %or
  882. ret i32 %select
  883. }
  884. ; CHECK-LABEL: @select_icmp_ne_0_and_1073741824_or_8(
  885. ; CHECK-NEXT: [[LSHR:%.+]] = lshr i32 %x, 27
  886. ; CHECK-NEXT: [[TRUNC:%.+]] = trunc i32 [[LSHR]] to i8
  887. ; CHECK-NEXT: [[AND:%.+]] = and i8 [[TRUNC]], 8
  888. ; CHECK-NEXT: [[XOR:%.+]] = xor i8 [[AND]], 8
  889. ; CHECK-NEXT: [[OR:%.+]] = or i8 [[XOR]], %y
  890. ; CHECK-NEXT: ret i8 [[OR]]
  891. define i8 @select_icmp_ne_0_and_1073741824_or_8(i32 %x, i8 %y) {
  892. %and = and i32 %x, 1073741824
  893. %cmp = icmp ne i32 0, %and
  894. %or = or i8 %y, 8
  895. %select = select i1 %cmp, i8 %y, i8 %or
  896. ret i8 %select
  897. }
  898. ; CHECK-LABEL: @select_icmp_ne_0_and_8_or_1073741824(
  899. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i8 %x, 8
  900. ; CHECK-NEXT: [[ZEXT:%[a-z0-9]+]] = zext i8 [[AND]] to i32
  901. ; CHECK-NEXT: [[SHL:%[a-z0-9]+]] = shl nuw nsw i32 [[ZEXT]], 27
  902. ; CHECK-NEXT: [[XOR:%[a-z0-9]+]] = xor i32 [[SHL]], 1073741824
  903. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 [[XOR]], %y
  904. ; CHECK-NEXT: ret i32 [[OR]]
  905. define i32 @select_icmp_ne_0_and_8_or_1073741824(i8 %x, i32 %y) {
  906. %and = and i8 %x, 8
  907. %cmp = icmp ne i8 0, %and
  908. %or = or i32 %y, 1073741824
  909. %select = select i1 %cmp, i32 %y, i32 %or
  910. ret i32 %select
  911. }
  912. ; We can't combine here, because the cmp is scalar and the or vector.
  913. ; Just make sure we don't assert.
  914. define <2 x i32> @select_icmp_eq_and_1_0_or_vector_of_2s(i32 %x, <2 x i32> %y) {
  915. %and = and i32 %x, 1
  916. %cmp = icmp eq i32 %and, 0
  917. %or = or <2 x i32> %y, <i32 2, i32 2>
  918. %select = select i1 %cmp, <2 x i32> %y, <2 x i32> %or
  919. ret <2 x i32> %select
  920. }
  921. ; CHECK-LABEL: @select_icmp_and_8_ne_0_xor_8(
  922. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, -9
  923. ; CHECK-NEXT: ret i32 [[AND]]
  924. define i32 @select_icmp_and_8_ne_0_xor_8(i32 %x) {
  925. %and = and i32 %x, 8
  926. %cmp = icmp eq i32 %and, 0
  927. %xor = xor i32 %x, 8
  928. %x.xor = select i1 %cmp, i32 %x, i32 %xor
  929. ret i32 %x.xor
  930. }
  931. ; CHECK-LABEL: @select_icmp_and_8_eq_0_xor_8(
  932. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, 8
  933. ; CHECK-NEXT: ret i32 [[OR]]
  934. define i32 @select_icmp_and_8_eq_0_xor_8(i32 %x) {
  935. %and = and i32 %x, 8
  936. %cmp = icmp eq i32 %and, 0
  937. %xor = xor i32 %x, 8
  938. %xor.x = select i1 %cmp, i32 %xor, i32 %x
  939. ret i32 %xor.x
  940. }
  941. ; CHECK-LABEL: @select_icmp_x_and_8_eq_0_y_xor_8(
  942. ; CHECK: select i1 %cmp, i64 %y, i64 %xor
  943. define i64 @select_icmp_x_and_8_eq_0_y_xor_8(i32 %x, i64 %y) {
  944. %and = and i32 %x, 8
  945. %cmp = icmp eq i32 %and, 0
  946. %xor = xor i64 %y, 8
  947. %y.xor = select i1 %cmp, i64 %y, i64 %xor
  948. ret i64 %y.xor
  949. }
  950. ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_xor_8(
  951. ; CHECK: select i1 %cmp, i64 %xor, i64 %y
  952. define i64 @select_icmp_x_and_8_ne_0_y_xor_8(i32 %x, i64 %y) {
  953. %and = and i32 %x, 8
  954. %cmp = icmp eq i32 %and, 0
  955. %xor = xor i64 %y, 8
  956. %xor.y = select i1 %cmp, i64 %xor, i64 %y
  957. ret i64 %xor.y
  958. }
  959. ; CHECK-LABEL: @select_icmp_x_and_8_ne_0_y_or_8(
  960. ; CHECK: xor i64 %1, 8
  961. ; CHECK: or i64 %2, %y
  962. define i64 @select_icmp_x_and_8_ne_0_y_or_8(i32 %x, i64 %y) {
  963. %and = and i32 %x, 8
  964. %cmp = icmp eq i32 %and, 0
  965. %or = or i64 %y, 8
  966. %or.y = select i1 %cmp, i64 %or, i64 %y
  967. ret i64 %or.y
  968. }
  969. ; CHECK-LABEL: @select_icmp_and_2147483648_ne_0_xor_2147483648(
  970. ; CHECK-NEXT: [[AND:%[a-z0-9]+]] = and i32 %x, 2147483647
  971. ; CHECK-NEXT: ret i32 [[AND]]
  972. define i32 @select_icmp_and_2147483648_ne_0_xor_2147483648(i32 %x) {
  973. %and = and i32 %x, 2147483648
  974. %cmp = icmp eq i32 %and, 0
  975. %xor = xor i32 %x, 2147483648
  976. %x.xor = select i1 %cmp, i32 %x, i32 %xor
  977. ret i32 %x.xor
  978. }
  979. ; CHECK-LABEL: @select_icmp_and_2147483648_eq_0_xor_2147483648(
  980. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, -2147483648
  981. ; CHECK-NEXT: ret i32 [[OR]]
  982. define i32 @select_icmp_and_2147483648_eq_0_xor_2147483648(i32 %x) {
  983. %and = and i32 %x, 2147483648
  984. %cmp = icmp eq i32 %and, 0
  985. %xor = xor i32 %x, 2147483648
  986. %xor.x = select i1 %cmp, i32 %xor, i32 %x
  987. ret i32 %xor.x
  988. }
  989. ; CHECK-LABEL: @select_icmp_x_and_2147483648_ne_0_or_2147483648(
  990. ; CHECK-NEXT: [[OR:%[a-z0-9]+]] = or i32 %x, -2147483648
  991. ; CHECK-NEXT: ret i32 [[OR]]
  992. define i32 @select_icmp_x_and_2147483648_ne_0_or_2147483648(i32 %x) {
  993. %and = and i32 %x, 2147483648
  994. %cmp = icmp eq i32 %and, 0
  995. %or = or i32 %x, 2147483648
  996. %or.x = select i1 %cmp, i32 %or, i32 %x
  997. ret i32 %or.x
  998. }
  999. define i32 @test65(i64 %x) {
  1000. %1 = and i64 %x, 16
  1001. %2 = icmp ne i64 %1, 0
  1002. %3 = select i1 %2, i32 40, i32 42
  1003. ret i32 %3
  1004. ; CHECK-LABEL: @test65(
  1005. ; CHECK: %[[TRUNC:.*]] = trunc i64 %x to i32
  1006. ; CHECK: %[[LSHR:.*]] = lshr i32 %[[TRUNC]], 3
  1007. ; CHECK: %[[AND:.*]] = and i32 %[[LSHR]], 2
  1008. ; CHECK: %[[XOR:.*]] = xor i32 %[[AND]], 42
  1009. ; CHECK: ret i32 %[[XOR]]
  1010. }
  1011. define i32 @test66(i64 %x) {
  1012. %1 = and i64 %x, 4294967296
  1013. %2 = icmp ne i64 %1, 0
  1014. %3 = select i1 %2, i32 40, i32 42
  1015. ret i32 %3
  1016. ; CHECK-LABEL: @test66(
  1017. ; CHECK: select
  1018. }
  1019. define i32 @test67(i16 %x) {
  1020. %1 = and i16 %x, 4
  1021. %2 = icmp ne i16 %1, 0
  1022. %3 = select i1 %2, i32 40, i32 42
  1023. ret i32 %3
  1024. ; CHECK-LABEL: @test67(
  1025. ; CHECK: and i16 %x, 4
  1026. ; CHECK: zext i16 %1 to i32
  1027. ; CHECK: lshr exact i32 %2, 1
  1028. ; CHECK: xor i32 %3, 42
  1029. }
  1030. ; SMIN(SMIN(X, 11), 92) -> SMIN(X, 11)
  1031. define i32 @test68(i32 %x) {
  1032. entry:
  1033. %cmp = icmp slt i32 11, %x
  1034. %cond = select i1 %cmp, i32 11, i32 %x
  1035. %cmp3 = icmp slt i32 92, %cond
  1036. %retval = select i1 %cmp3, i32 92, i32 %cond
  1037. ret i32 %retval
  1038. ; CHECK-LABEL: @test68(
  1039. ; CHECK: ret i32 %cond
  1040. }
  1041. ; MIN(MIN(X, 24), 83) -> MIN(X, 24)
  1042. define i32 @test69(i32 %x) {
  1043. entry:
  1044. %cmp = icmp ult i32 24, %x
  1045. %cond = select i1 %cmp, i32 24, i32 %x
  1046. %cmp3 = icmp ult i32 83, %cond
  1047. %retval = select i1 %cmp3, i32 83, i32 %cond
  1048. ret i32 %retval
  1049. ; CHECK-LABEL: @test69(
  1050. ; CHECK: ret i32 %cond
  1051. }
  1052. ; SMAX(SMAX(X, 75), 36) -> SMAX(X, 75)
  1053. define i32 @test70(i32 %x) {
  1054. entry:
  1055. %cmp = icmp slt i32 %x, 75
  1056. %cond = select i1 %cmp, i32 75, i32 %x
  1057. %cmp3 = icmp slt i32 %cond, 36
  1058. %retval = select i1 %cmp3, i32 36, i32 %cond
  1059. ret i32 %retval
  1060. ; CHECK-LABEL: @test70(
  1061. ; CHECK: ret i32 %cond
  1062. }
  1063. ; MAX(MAX(X, 68), 47) -> MAX(X, 68)
  1064. define i32 @test71(i32 %x) {
  1065. entry:
  1066. %cmp = icmp ult i32 %x, 68
  1067. %cond = select i1 %cmp, i32 68, i32 %x
  1068. %cmp3 = icmp ult i32 %cond, 47
  1069. %retval = select i1 %cmp3, i32 47, i32 %cond
  1070. ret i32 %retval
  1071. ; CHECK-LABEL: @test71(
  1072. ; CHECK: ret i32 %cond
  1073. }
  1074. ; SMIN(SMIN(X, 92), 11) -> SMIN(X, 11)
  1075. define i32 @test72(i32 %x) {
  1076. %cmp = icmp sgt i32 %x, 92
  1077. %cond = select i1 %cmp, i32 92, i32 %x
  1078. %cmp3 = icmp sgt i32 %cond, 11
  1079. %retval = select i1 %cmp3, i32 11, i32 %cond
  1080. ret i32 %retval
  1081. ; CHECK-LABEL: @test72(
  1082. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp sgt i32 %x, 11
  1083. ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 11, i32 %x
  1084. ; CHECK-NEXT: ret i32 [[SEL]]
  1085. }
  1086. ; MIN(MIN(X, 83), 24) -> MIN(X, 24)
  1087. define i32 @test73(i32 %x) {
  1088. %cmp = icmp ugt i32 %x, 83
  1089. %cond = select i1 %cmp, i32 83, i32 %x
  1090. %cmp3 = icmp ugt i32 %cond, 24
  1091. %retval = select i1 %cmp3, i32 24, i32 %cond
  1092. ret i32 %retval
  1093. ; CHECK-LABEL: @test73(
  1094. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ugt i32 %x, 24
  1095. ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 24, i32 %x
  1096. ; CHECK-NEXT: ret i32 [[SEL]]
  1097. }
  1098. ; SMAX(SMAX(X, 36), 75) -> SMAX(X, 75)
  1099. define i32 @test74(i32 %x) {
  1100. %cmp = icmp slt i32 %x, 36
  1101. %cond = select i1 %cmp, i32 36, i32 %x
  1102. %cmp3 = icmp slt i32 %cond, 75
  1103. %retval = select i1 %cmp3, i32 75, i32 %cond
  1104. ret i32 %retval
  1105. ; CHECK-LABEL: @test74(
  1106. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp slt i32 %x, 75
  1107. ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 75, i32 %x
  1108. ; CHECK-NEXT: ret i32 [[SEL]]
  1109. }
  1110. ; MAX(MAX(X, 47), 68) -> MAX(X, 68)
  1111. define i32 @test75(i32 %x) {
  1112. %cmp = icmp ult i32 %x, 47
  1113. %cond = select i1 %cmp, i32 47, i32 %x
  1114. %cmp3 = icmp ult i32 %cond, 68
  1115. %retval = select i1 %cmp3, i32 68, i32 %cond
  1116. ret i32 %retval
  1117. ; CHECK-LABEL: @test75(
  1118. ; CHECK-NEXT: [[CMP:%[a-z0-9]+]] = icmp ult i32 %x, 68
  1119. ; CHECK-NEXT: [[SEL:%[a-z0-9]+]] = select i1 [[CMP]], i32 68, i32 %x
  1120. ; CHECK-NEXT: ret i32 [[SEL]]
  1121. }
  1122. @under_aligned = external global i32, align 1
  1123. define i32 @test76(i1 %flag, i32* %x) {
  1124. ; The load here must not be speculated around the select. One side of the
  1125. ; select is trivially dereferencable but may have a lower alignment than the
  1126. ; load does.
  1127. ; CHECK-LABEL: @test76(
  1128. ; CHECK: store i32 0, i32* %x
  1129. ; CHECK: %[[P:.*]] = select i1 %flag, i32* @under_aligned, i32* %x
  1130. ; CHECK: load i32, i32* %[[P]]
  1131. store i32 0, i32* %x
  1132. %p = select i1 %flag, i32* @under_aligned, i32* %x
  1133. %v = load i32, i32* %p
  1134. ret i32 %v
  1135. }
  1136. declare void @scribble_on_i32(i32*)
  1137. define i32 @test77(i1 %flag, i32* %x) {
  1138. ; The load here must not be speculated around the select. One side of the
  1139. ; select is trivially dereferencable but may have a lower alignment than the
  1140. ; load does.
  1141. ; CHECK-LABEL: @test77(
  1142. ; CHECK: %[[A:.*]] = alloca i32, align 1
  1143. ; CHECK: call void @scribble_on_i32(i32* nonnull %[[A]])
  1144. ; CHECK: store i32 0, i32* %x
  1145. ; CHECK: %[[P:.*]] = select i1 %flag, i32* %[[A]], i32* %x
  1146. ; CHECK: load i32, i32* %[[P]]
  1147. %under_aligned = alloca i32, align 1
  1148. call void @scribble_on_i32(i32* %under_aligned)
  1149. store i32 0, i32* %x
  1150. %p = select i1 %flag, i32* %under_aligned, i32* %x
  1151. %v = load i32, i32* %p
  1152. ret i32 %v
  1153. }
  1154. define i32 @test78(i1 %flag, i32* %x, i32* %y, i32* %z) {
  1155. ; Test that we can speculate the loads around the select even when we can't
  1156. ; fold the load completely away.
  1157. ; CHECK-LABEL: @test78(
  1158. ; CHECK: %[[V1:.*]] = load i32, i32* %x
  1159. ; CHECK-NEXT: %[[V2:.*]] = load i32, i32* %y
  1160. ; CHECK-NEXT: %[[S:.*]] = select i1 %flag, i32 %[[V1]], i32 %[[V2]]
  1161. ; CHECK-NEXT: ret i32 %[[S]]
  1162. entry:
  1163. store i32 0, i32* %x
  1164. store i32 0, i32* %y
  1165. ; Block forwarding by storing to %z which could alias either %x or %y.
  1166. store i32 42, i32* %z
  1167. %p = select i1 %flag, i32* %x, i32* %y
  1168. %v = load i32, i32* %p
  1169. ret i32 %v
  1170. }
  1171. define i32 @test78_neg(i1 %flag, i32* %x, i32* %y, i32* %z) {
  1172. ; The same as @test78 but we can't speculate the load because it can trap
  1173. ; if under-aligned.
  1174. ; CHECK-LABEL: @test78_neg(
  1175. ; CHECK: %p = select i1 %flag, i32* %x, i32* %y
  1176. ; CHECK-NEXT: %v = load i32, i32* %p, align 16
  1177. ; CHECK-NEXT: ret i32 %v
  1178. entry:
  1179. store i32 0, i32* %x
  1180. store i32 0, i32* %y
  1181. ; Block forwarding by storing to %z which could alias either %x or %y.
  1182. store i32 42, i32* %z
  1183. %p = select i1 %flag, i32* %x, i32* %y
  1184. %v = load i32, i32* %p, align 16
  1185. ret i32 %v
  1186. }
  1187. define float @test79(i1 %flag, float* %x, i32* %y, i32* %z) {
  1188. ; Test that we can speculate the loads around the select even when we can't
  1189. ; fold the load completely away.
  1190. ; CHECK-LABEL: @test79(
  1191. ; CHECK: %[[V1:.*]] = load float, float* %x
  1192. ; CHECK-NEXT: %[[V2:.*]] = load float, float* %y
  1193. ; CHECK-NEXT: %[[S:.*]] = select i1 %flag, float %[[V1]], float %[[V2]]
  1194. ; CHECK-NEXT: ret float %[[S]]
  1195. entry:
  1196. %x1 = bitcast float* %x to i32*
  1197. %y1 = bitcast i32* %y to float*
  1198. store i32 0, i32* %x1
  1199. store i32 0, i32* %y
  1200. ; Block forwarding by storing to %z which could alias either %x or %y.
  1201. store i32 42, i32* %z
  1202. %p = select i1 %flag, float* %x, float* %y1
  1203. %v = load float, float* %p
  1204. ret float %v
  1205. }
  1206. define i32 @test80(i1 %flag) {
  1207. ; Test that when we speculate the loads around the select they fold throug
  1208. ; load->load folding and load->store folding.
  1209. ; CHECK-LABEL: @test80(
  1210. ; CHECK: %[[X:.*]] = alloca i32
  1211. ; CHECK-NEXT: %[[Y:.*]] = alloca i32
  1212. ; CHECK: %[[V:.*]] = load i32, i32* %[[X]]
  1213. ; CHECK-NEXT: store i32 %[[V]], i32* %[[Y]]
  1214. ; CHECK-NEXT: ret i32 %[[V]]
  1215. entry:
  1216. %x = alloca i32
  1217. %y = alloca i32
  1218. call void @scribble_on_i32(i32* %x)
  1219. call void @scribble_on_i32(i32* %y)
  1220. %tmp = load i32, i32* %x
  1221. store i32 %tmp, i32* %y
  1222. %p = select i1 %flag, i32* %x, i32* %y
  1223. %v = load i32, i32* %p
  1224. ret i32 %v
  1225. }
  1226. define float @test81(i1 %flag) {
  1227. ; Test that we can speculate the load around the select even though they use
  1228. ; differently typed pointers.
  1229. ; CHECK-LABEL: @test81(
  1230. ; CHECK: %[[X:.*]] = alloca i32
  1231. ; CHECK-NEXT: %[[Y:.*]] = alloca i32
  1232. ; CHECK: %[[V:.*]] = load i32, i32* %[[X]]
  1233. ; CHECK-NEXT: store i32 %[[V]], i32* %[[Y]]
  1234. ; CHECK-NEXT: %[[C:.*]] = bitcast i32 %[[V]] to float
  1235. ; CHECK-NEXT: ret float %[[C]]
  1236. entry:
  1237. %x = alloca float
  1238. %y = alloca i32
  1239. %x1 = bitcast float* %x to i32*
  1240. %y1 = bitcast i32* %y to float*
  1241. call void @scribble_on_i32(i32* %x1)
  1242. call void @scribble_on_i32(i32* %y)
  1243. %tmp = load i32, i32* %x1
  1244. store i32 %tmp, i32* %y
  1245. %p = select i1 %flag, float* %x, float* %y1
  1246. %v = load float, float* %p
  1247. ret float %v
  1248. }
  1249. define i32 @test82(i1 %flag) {
  1250. ; Test that we can speculate the load around the select even though they use
  1251. ; differently typed pointers.
  1252. ; CHECK-LABEL: @test82(
  1253. ; CHECK: %[[X:.*]] = alloca float
  1254. ; CHECK-NEXT: %[[Y:.*]] = alloca i32
  1255. ; CHECK-NEXT: %[[X1:.*]] = bitcast float* %[[X]] to i32*
  1256. ; CHECK-NEXT: %[[Y1:.*]] = bitcast i32* %[[Y]] to float*
  1257. ; CHECK: %[[V:.*]] = load float, float* %[[X]]
  1258. ; CHECK-NEXT: store float %[[V]], float* %[[Y1]]
  1259. ; CHECK-NEXT: %[[C:.*]] = bitcast float %[[V]] to i32
  1260. ; CHECK-NEXT: ret i32 %[[C]]
  1261. entry:
  1262. %x = alloca float
  1263. %y = alloca i32
  1264. %x1 = bitcast float* %x to i32*
  1265. %y1 = bitcast i32* %y to float*
  1266. call void @scribble_on_i32(i32* %x1)
  1267. call void @scribble_on_i32(i32* %y)
  1268. %tmp = load float, float* %x
  1269. store float %tmp, float* %y1
  1270. %p = select i1 %flag, i32* %x1, i32* %y
  1271. %v = load i32, i32* %p
  1272. ret i32 %v
  1273. }
  1274. declare void @scribble_on_i64(i64*)
  1275. declare void @scribble_on_i128(i128*)
  1276. define i8* @test83(i1 %flag) {
  1277. ; Test that we can speculate the load around the select even though they use
  1278. ; differently typed pointers and requires inttoptr casts.
  1279. ; CHECK-LABEL: @test83(
  1280. ; CHECK: %[[X:.*]] = alloca i8*
  1281. ; CHECK-NEXT: %[[Y:.*]] = alloca i8*
  1282. ; CHECK-DAG: %[[X2:.*]] = bitcast i8** %[[X]] to i64*
  1283. ; CHECK-DAG: %[[Y2:.*]] = bitcast i8** %[[Y]] to i64*
  1284. ; CHECK: %[[V:.*]] = load i64, i64* %[[X2]]
  1285. ; CHECK-NEXT: store i64 %[[V]], i64* %[[Y2]]
  1286. ; CHECK-NEXT: %[[C:.*]] = inttoptr i64 %[[V]] to i8*
  1287. ; CHECK-NEXT: ret i8* %[[S]]
  1288. entry:
  1289. %x = alloca i8*
  1290. %y = alloca i64
  1291. %x1 = bitcast i8** %x to i64*
  1292. %y1 = bitcast i64* %y to i8**
  1293. call void @scribble_on_i64(i64* %x1)
  1294. call void @scribble_on_i64(i64* %y)
  1295. %tmp = load i64, i64* %x1
  1296. store i64 %tmp, i64* %y
  1297. %p = select i1 %flag, i8** %x, i8** %y1
  1298. %v = load i8*, i8** %p
  1299. ret i8* %v
  1300. }
  1301. define i64 @test84(i1 %flag) {
  1302. ; Test that we can speculate the load around the select even though they use
  1303. ; differently typed pointers and requires a ptrtoint cast.
  1304. ; CHECK-LABEL: @test84(
  1305. ; CHECK: %[[X:.*]] = alloca i8*
  1306. ; CHECK-NEXT: %[[Y:.*]] = alloca i8*
  1307. ; CHECK: %[[V:.*]] = load i8*, i8** %[[X]]
  1308. ; CHECK-NEXT: store i8* %[[V]], i8** %[[Y]]
  1309. ; CHECK-NEXT: %[[C:.*]] = ptrtoint i8* %[[V]] to i64
  1310. ; CHECK-NEXT: ret i64 %[[C]]
  1311. entry:
  1312. %x = alloca i8*
  1313. %y = alloca i64
  1314. %x1 = bitcast i8** %x to i64*
  1315. %y1 = bitcast i64* %y to i8**
  1316. call void @scribble_on_i64(i64* %x1)
  1317. call void @scribble_on_i64(i64* %y)
  1318. %tmp = load i8*, i8** %x
  1319. store i8* %tmp, i8** %y1
  1320. %p = select i1 %flag, i64* %x1, i64* %y
  1321. %v = load i64, i64* %p
  1322. ret i64 %v
  1323. }
  1324. define i8* @test85(i1 %flag) {
  1325. ; Test that we can't speculate the load around the select. The load of the
  1326. ; pointer doesn't load all of the stored integer bits. We could fix this, but it
  1327. ; would require endianness checks and other nastiness.
  1328. ; CHECK-LABEL: @test85(
  1329. ; CHECK: %[[T:.*]] = load i128, i128*
  1330. ; CHECK-NEXT: store i128 %[[T]], i128*
  1331. ; CHECK-NEXT: %[[X:.*]] = load i8*, i8**
  1332. ; CHECK-NEXT: %[[Y:.*]] = load i8*, i8**
  1333. ; CHECK-NEXT: %[[V:.*]] = select i1 %flag, i8* %[[X]], i8* %[[Y]]
  1334. ; CHECK-NEXT: ret i8* %[[V]]
  1335. entry:
  1336. %x = alloca [2 x i8*]
  1337. %y = alloca i128
  1338. %x1 = bitcast [2 x i8*]* %x to i8**
  1339. %x2 = bitcast i8** %x1 to i128*
  1340. %y1 = bitcast i128* %y to i8**
  1341. call void @scribble_on_i128(i128* %x2)
  1342. call void @scribble_on_i128(i128* %y)
  1343. %tmp = load i128, i128* %x2
  1344. store i128 %tmp, i128* %y
  1345. %p = select i1 %flag, i8** %x1, i8** %y1
  1346. %v = load i8*, i8** %p
  1347. ret i8* %v
  1348. }
  1349. define i128 @test86(i1 %flag) {
  1350. ; Test that we can't speculate the load around the select when the integer size
  1351. ; is larger than the pointer size. The store of the pointer doesn't store to all
  1352. ; the bits of the integer.
  1353. ;
  1354. ; CHECK-LABEL: @test86(
  1355. ; CHECK: %[[T:.*]] = load i8*, i8**
  1356. ; CHECK-NEXT: store i8* %[[T]], i8**
  1357. ; CHECK-NEXT: %[[X:.*]] = load i128, i128*
  1358. ; CHECK-NEXT: %[[Y:.*]] = load i128, i128*
  1359. ; CHECK-NEXT: %[[V:.*]] = select i1 %flag, i128 %[[X]], i128 %[[Y]]
  1360. ; CHECK-NEXT: ret i128 %[[V]]
  1361. entry:
  1362. %x = alloca [2 x i8*]
  1363. %y = alloca i128
  1364. %x1 = bitcast [2 x i8*]* %x to i8**
  1365. %x2 = bitcast i8** %x1 to i128*
  1366. %y1 = bitcast i128* %y to i8**
  1367. call void @scribble_on_i128(i128* %x2)
  1368. call void @scribble_on_i128(i128* %y)
  1369. %tmp = load i8*, i8** %x1
  1370. store i8* %tmp, i8** %y1
  1371. %p = select i1 %flag, i128* %x2, i128* %y
  1372. %v = load i128, i128* %p
  1373. ret i128 %v
  1374. }
  1375. define i32 @test_select_select0(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) {
  1376. ; CHECK-LABEL: @test_select_select0(
  1377. ; CHECK: %[[C0:.*]] = icmp sge i32 %a, %v1
  1378. ; CHECK-NEXT: %[[C1:.*]] = icmp slt i32 %a, %v2
  1379. ; CHECK-NEXT: %[[C:.*]] = and i1 %[[C1]], %[[C0]]
  1380. ; CHECK-NEXT: %[[SEL:.*]] = select i1 %[[C]], i32 %r0, i32 %r1
  1381. ; CHECK-NEXT: ret i32 %[[SEL]]
  1382. %c0 = icmp sge i32 %a, %v1
  1383. %s0 = select i1 %c0, i32 %r0, i32 %r1
  1384. %c1 = icmp slt i32 %a, %v2
  1385. %s1 = select i1 %c1, i32 %s0, i32 %r1
  1386. ret i32 %s1
  1387. }
  1388. define i32 @test_select_select1(i32 %a, i32 %r0, i32 %r1, i32 %v1, i32 %v2) {
  1389. ; CHECK-LABEL: @test_select_select1(
  1390. ; CHECK: %[[C0:.*]] = icmp sge i32 %a, %v1
  1391. ; CHECK-NEXT: %[[C1:.*]] = icmp slt i32 %a, %v2
  1392. ; CHECK-NEXT: %[[C:.*]] = or i1 %[[C1]], %[[C0]]
  1393. ; CHECK-NEXT: %[[SEL:.*]] = select i1 %[[C]], i32 %r0, i32 %r1
  1394. ; CHECK-NEXT: ret i32 %[[SEL]]
  1395. %c0 = icmp sge i32 %a, %v1
  1396. %s0 = select i1 %c0, i32 %r0, i32 %r1
  1397. %c1 = icmp slt i32 %a, %v2
  1398. %s1 = select i1 %c1, i32 %r0, i32 %s0
  1399. ret i32 %s1
  1400. }
  1401. define i32 @test_max_of_min(i32 %a) {
  1402. ; MAX(MIN(%a, -1), -1) == -1
  1403. ; CHECK-LABEL: @test_max_of_min(
  1404. ; CHECK: ret i32 -1
  1405. %not_a = xor i32 %a, -1
  1406. %c0 = icmp sgt i32 %a, 0
  1407. %s0 = select i1 %c0, i32 %not_a, i32 -1
  1408. %c1 = icmp sgt i32 %s0, -1
  1409. %s1 = select i1 %c1, i32 %s0, i32 -1
  1410. ret i32 %s1
  1411. }
  1412. define i32 @PR23757(i32 %x) {
  1413. ; CHECK-LABEL: @PR23757
  1414. ; CHECK: %[[cmp:.*]] = icmp eq i32 %x, 2147483647
  1415. ; CHECK-NEXT: %[[add:.*]] = add nsw i32 %x, 1
  1416. ; CHECK-NEXT: %[[sel:.*]] = select i1 %[[cmp]], i32 -2147483648, i32 %[[add]]
  1417. ; CHECK-NEXT: ret i32 %[[sel]]
  1418. %cmp = icmp eq i32 %x, 2147483647
  1419. %add = add nsw i32 %x, 1
  1420. %sel = select i1 %cmp, i32 -2147483648, i32 %add
  1421. ret i32 %sel
  1422. }