irbuild-constant-fold.test 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480
  1. [case testIntConstantFolding]
  2. def bin_ops() -> None:
  3. add = 15 + 47
  4. add_mul = (2 + 3) * 5
  5. sub = 7 - 11
  6. div = 3 / 2
  7. bit_and = 6 & 10
  8. bit_or = 6 | 10
  9. bit_xor = 6 ^ 10
  10. lshift = 5 << 2
  11. rshift = 13 >> 2
  12. lshift0 = 5 << 0
  13. rshift0 = 13 >> 0
  14. def unary_ops() -> None:
  15. neg1 = -5
  16. neg2 = --1
  17. neg3 = -0
  18. pos = +5
  19. inverted1 = ~0
  20. inverted2 = ~5
  21. inverted3 = ~3
  22. def pow() -> None:
  23. p0 = 3**0
  24. p1 = 3**5
  25. p2 = (-5)**3
  26. p3 = 0**0
  27. [out]
  28. def bin_ops():
  29. add, add_mul, sub :: int
  30. div :: float
  31. bit_and, bit_or, bit_xor, lshift, rshift, lshift0, rshift0 :: int
  32. L0:
  33. add = 124
  34. add_mul = 50
  35. sub = -8
  36. div = 1.5
  37. bit_and = 4
  38. bit_or = 28
  39. bit_xor = 24
  40. lshift = 40
  41. rshift = 6
  42. lshift0 = 10
  43. rshift0 = 26
  44. return 1
  45. def unary_ops():
  46. neg1, neg2, neg3, pos, inverted1, inverted2, inverted3 :: int
  47. L0:
  48. neg1 = -10
  49. neg2 = 2
  50. neg3 = 0
  51. pos = 10
  52. inverted1 = -2
  53. inverted2 = -12
  54. inverted3 = -8
  55. return 1
  56. def pow():
  57. p0, p1, p2, p3 :: int
  58. L0:
  59. p0 = 2
  60. p1 = 486
  61. p2 = -250
  62. p3 = 2
  63. return 1
  64. [case testIntConstantFoldingDivMod]
  65. def div() -> None:
  66. div1 = 25 // 5
  67. div2 = 24 // 5
  68. div3 = 29 // 5
  69. div4 = 30 // 5
  70. div_zero = 0 // 5
  71. neg1 = -1 // 3
  72. neg2 = -2 // 3
  73. neg3 = -3 // 3
  74. neg4 = -4 // 3
  75. neg_neg = -765467 // -234
  76. pos_neg = 983745 // -7864
  77. def mod() -> None:
  78. mod1 = 25 % 5
  79. mod2 = 24 % 5
  80. mod3 = 29 % 5
  81. mod4 = 30 % 5
  82. mod_zero = 0 % 5
  83. neg1 = -4 % 3
  84. neg2 = -5 % 3
  85. neg3 = -6 % 3
  86. neg4 = -7 % 3
  87. neg_neg = -765467 % -234
  88. pos_neg = 983745 % -7864
  89. [out]
  90. def div():
  91. div1, div2, div3, div4, div_zero, neg1, neg2, neg3, neg4, neg_neg, pos_neg :: int
  92. L0:
  93. div1 = 10
  94. div2 = 8
  95. div3 = 10
  96. div4 = 12
  97. div_zero = 0
  98. neg1 = -2
  99. neg2 = -2
  100. neg3 = -2
  101. neg4 = -4
  102. neg_neg = 6542
  103. pos_neg = -252
  104. return 1
  105. def mod():
  106. mod1, mod2, mod3, mod4, mod_zero, neg1, neg2, neg3, neg4, neg_neg, pos_neg :: int
  107. L0:
  108. mod1 = 0
  109. mod2 = 8
  110. mod3 = 8
  111. mod4 = 0
  112. mod_zero = 0
  113. neg1 = 4
  114. neg2 = 2
  115. neg3 = 0
  116. neg4 = 4
  117. neg_neg = -106
  118. pos_neg = -14238
  119. return 1
  120. [case testIntConstantFoldingUnsupportedCases]
  121. def error_cases() -> None:
  122. div_by_zero = 5 / 0
  123. floor_div_by_zero = 5 // 0
  124. mod_by_zero = 5 % 0
  125. lshift_neg = 6 << -1
  126. rshift_neg = 7 >> -1
  127. def unsupported_pow() -> None:
  128. p = 3 ** (-1)
  129. [out]
  130. def error_cases():
  131. r0, div_by_zero :: float
  132. r1, floor_div_by_zero, r2, mod_by_zero, r3, lshift_neg, r4, rshift_neg :: int
  133. L0:
  134. r0 = CPyTagged_TrueDivide(10, 0)
  135. div_by_zero = r0
  136. r1 = CPyTagged_FloorDivide(10, 0)
  137. floor_div_by_zero = r1
  138. r2 = CPyTagged_Remainder(10, 0)
  139. mod_by_zero = r2
  140. r3 = CPyTagged_Lshift(12, -2)
  141. lshift_neg = r3
  142. r4 = CPyTagged_Rshift(14, -2)
  143. rshift_neg = r4
  144. return 1
  145. def unsupported_pow():
  146. r0, r1, r2 :: object
  147. r3, p :: float
  148. L0:
  149. r0 = object 3
  150. r1 = object -1
  151. r2 = CPyNumber_Power(r0, r1)
  152. r3 = unbox(float, r2)
  153. p = r3
  154. return 1
  155. [case testIntConstantFoldingBigIntResult_64bit]
  156. def long_and_short() -> None:
  157. # The smallest and largest representable short integers
  158. short1 = 0x3ffffffffffffff0 + 0xf # (1 << 62) - 1
  159. short2 = -0x3fffffffffffffff - 1 # -(1 << 62)
  160. short3 = -0x4000000000000000
  161. # Smallest big integers by absolute value
  162. big1 = 1 << 62
  163. big2 = 0x4000000000000000 # 1 << 62
  164. big3 = -(1 << 62) - 1
  165. big4 = -0x4000000000000001 # -(1 << 62) - 1
  166. big5 = 123**41
  167. [out]
  168. def long_and_short():
  169. short1, short2, short3, r0, big1, r1, big2, r2, big3, r3, big4, r4, big5 :: int
  170. L0:
  171. short1 = 9223372036854775806
  172. short2 = -9223372036854775808
  173. short3 = -9223372036854775808
  174. r0 = object 4611686018427387904
  175. big1 = r0
  176. r1 = object 4611686018427387904
  177. big2 = r1
  178. r2 = object -4611686018427387905
  179. big3 = r2
  180. r3 = object -4611686018427387905
  181. big4 = r3
  182. r4 = object 48541095000524544750127162673405880068636916264012200797813591925035550682238127143323
  183. big5 = r4
  184. return 1
  185. [case testIntConstantFoldingFinal]
  186. from typing_extensions import Final
  187. X: Final = 5
  188. Y: Final = 2 + 4
  189. def f() -> None:
  190. a = X + 1
  191. a = Y + 1
  192. [out]
  193. def f():
  194. a :: int
  195. L0:
  196. a = 12
  197. a = 14
  198. return 1
  199. [case testIntConstantFoldingClassFinal]
  200. from typing_extensions import Final
  201. class C:
  202. X: Final = 5
  203. def f() -> None:
  204. a = C.X + 1
  205. [out]
  206. def C.__mypyc_defaults_setup(__mypyc_self__):
  207. __mypyc_self__ :: __main__.C
  208. L0:
  209. __mypyc_self__.X = 10
  210. return 1
  211. def f():
  212. a :: int
  213. L0:
  214. a = 12
  215. return 1
  216. [case testFloatConstantFolding]
  217. from typing_extensions import Final
  218. N: Final = 1.5
  219. N2: Final = 1.5 * 2
  220. def bin_ops() -> None:
  221. add = 0.5 + 0.5
  222. add_mul = (1.5 + 3.5) * 5.0
  223. sub = 7.0 - 7.5
  224. div = 3.0 / 2.0
  225. floor_div = 3.0 // 2.0
  226. def bin_ops_neg() -> None:
  227. add = 0.5 + -0.5
  228. add_mul = (-1.5 + 3.5) * -5.0
  229. add_mul2 = (1.5 + -3.5) * -5.0
  230. sub = 7.0 - -7.5
  231. div = 3.0 / -2.0
  232. floor_div = 3.0 // -2.0
  233. def unary_ops() -> None:
  234. neg1 = -5.5
  235. neg2 = --1.5
  236. neg3 = -0.0
  237. pos = +5.5
  238. def pow() -> None:
  239. p0 = 16.0**0
  240. p1 = 16.0**0.5
  241. p2 = (-5.0)**3
  242. p3 = 16.0**(-0)
  243. p4 = 16.0**(-0.5)
  244. p5 = (-2.0)**(-1)
  245. def error_cases() -> None:
  246. div = 2.0 / 0.0
  247. floor_div = 2.0 // 0.0
  248. power_imag = (-2.0)**0.5
  249. power_imag2 = (-2.0)**(-0.5)
  250. power_overflow = 2.0**10000.0
  251. def final_floats() -> None:
  252. add1 = N + 1.2
  253. add2 = N + N2
  254. add3 = -1.2 + N2
  255. [out]
  256. def bin_ops():
  257. add, add_mul, sub, div, floor_div :: float
  258. L0:
  259. add = 1.0
  260. add_mul = 25.0
  261. sub = -0.5
  262. div = 1.5
  263. floor_div = 1.0
  264. return 1
  265. def bin_ops_neg():
  266. add, add_mul, add_mul2, sub, div, floor_div :: float
  267. L0:
  268. add = 0.0
  269. add_mul = -10.0
  270. add_mul2 = 10.0
  271. sub = 14.5
  272. div = -1.5
  273. floor_div = -2.0
  274. return 1
  275. def unary_ops():
  276. neg1, neg2, neg3, pos :: float
  277. L0:
  278. neg1 = -5.5
  279. neg2 = 1.5
  280. neg3 = -0.0
  281. pos = 5.5
  282. return 1
  283. def pow():
  284. p0, p1, p2, p3, p4, p5 :: float
  285. L0:
  286. p0 = 1.0
  287. p1 = 4.0
  288. p2 = -125.0
  289. p3 = 1.0
  290. p4 = 0.25
  291. p5 = -0.5
  292. return 1
  293. def error_cases():
  294. r0 :: bit
  295. r1 :: bool
  296. r2, div, r3, floor_div :: float
  297. r4, r5, r6 :: object
  298. r7, power_imag :: float
  299. r8, r9, r10 :: object
  300. r11, power_imag2 :: float
  301. r12, r13, r14 :: object
  302. r15, power_overflow :: float
  303. L0:
  304. r0 = 0.0 == 0.0
  305. if r0 goto L1 else goto L2 :: bool
  306. L1:
  307. r1 = raise ZeroDivisionError('float division by zero')
  308. unreachable
  309. L2:
  310. r2 = 2.0 / 0.0
  311. div = r2
  312. r3 = CPyFloat_FloorDivide(2.0, 0.0)
  313. floor_div = r3
  314. r4 = box(float, -2.0)
  315. r5 = box(float, 0.5)
  316. r6 = CPyNumber_Power(r4, r5)
  317. r7 = unbox(float, r6)
  318. power_imag = r7
  319. r8 = box(float, -2.0)
  320. r9 = box(float, -0.5)
  321. r10 = CPyNumber_Power(r8, r9)
  322. r11 = unbox(float, r10)
  323. power_imag2 = r11
  324. r12 = box(float, 2.0)
  325. r13 = box(float, 10000.0)
  326. r14 = CPyNumber_Power(r12, r13)
  327. r15 = unbox(float, r14)
  328. power_overflow = r15
  329. return 1
  330. def final_floats():
  331. add1, add2, add3 :: float
  332. L0:
  333. add1 = 2.7
  334. add2 = 4.5
  335. add3 = 1.8
  336. return 1
  337. [case testMixedFloatIntConstantFolding]
  338. def bin_ops() -> None:
  339. add = 1 + 0.5
  340. sub = 1 - 0.5
  341. mul = 0.5 * 5
  342. div = 5 / 0.5
  343. floor_div = 9.5 // 5
  344. def error_cases() -> None:
  345. div = 2.0 / 0
  346. floor_div = 2.0 // 0
  347. power_overflow = 2.0**10000
  348. [out]
  349. def bin_ops():
  350. add, sub, mul, div, floor_div :: float
  351. L0:
  352. add = 1.5
  353. sub = 0.5
  354. mul = 2.5
  355. div = 10.0
  356. floor_div = 1.0
  357. return 1
  358. def error_cases():
  359. r0 :: bit
  360. r1 :: bool
  361. r2, div, r3, floor_div :: float
  362. r4, r5, r6 :: object
  363. r7, power_overflow :: float
  364. L0:
  365. r0 = 0.0 == 0.0
  366. if r0 goto L1 else goto L2 :: bool
  367. L1:
  368. r1 = raise ZeroDivisionError('float division by zero')
  369. unreachable
  370. L2:
  371. r2 = 2.0 / 0.0
  372. div = r2
  373. r3 = CPyFloat_FloorDivide(2.0, 0.0)
  374. floor_div = r3
  375. r4 = box(float, 2.0)
  376. r5 = box(float, 10000.0)
  377. r6 = CPyNumber_Power(r4, r5)
  378. r7 = unbox(float, r6)
  379. power_overflow = r7
  380. return 1
  381. [case testStrConstantFolding]
  382. from typing_extensions import Final
  383. S: Final = 'z'
  384. N: Final = 2
  385. def f() -> None:
  386. x = 'foo' + 'bar'
  387. y = 'x' + 'y' + S
  388. mul = "foobar" * 2
  389. mul2 = N * "foobar"
  390. [out]
  391. def f():
  392. r0, x, r1, y, r2, mul, r3, mul2 :: str
  393. L0:
  394. r0 = 'foobar'
  395. x = r0
  396. r1 = 'xyz'
  397. y = r1
  398. r2 = 'foobarfoobar'
  399. mul = r2
  400. r3 = 'foobarfoobar'
  401. mul2 = r3
  402. return 1
  403. [case testBytesConstantFolding]
  404. from typing_extensions import Final
  405. N: Final = 2
  406. def f() -> None:
  407. # Unfortunately, mypy doesn't store the bytes value of final refs.
  408. x = b'foo' + b'bar'
  409. mul = b"foobar" * 2
  410. mul2 = N * b"foobar"
  411. [out]
  412. def f():
  413. r0, x, r1, mul, r2, mul2 :: bytes
  414. L0:
  415. r0 = b'foobar'
  416. x = r0
  417. r1 = b'foobarfoobar'
  418. mul = r1
  419. r2 = b'foobarfoobar'
  420. mul2 = r2
  421. return 1
  422. [case testComplexConstantFolding]
  423. from typing_extensions import Final
  424. N: Final = 1
  425. FLOAT_N: Final = 1.5
  426. def integral() -> None:
  427. pos = 1+2j
  428. pos_2 = 2j+N
  429. neg = 1-2j
  430. neg_2 = 2j-N
  431. def floating() -> None:
  432. pos = 1.5+2j
  433. pos_2 = 2j+FLOAT_N
  434. neg = 1.5-2j
  435. neg_2 = 2j-FLOAT_N
  436. [out]
  437. def integral():
  438. r0, pos, r1, pos_2, r2, neg, r3, neg_2 :: object
  439. L0:
  440. r0 = (1+2j)
  441. pos = r0
  442. r1 = (1+2j)
  443. pos_2 = r1
  444. r2 = (1-2j)
  445. neg = r2
  446. r3 = (-1+2j)
  447. neg_2 = r3
  448. return 1
  449. def floating():
  450. r0, pos, r1, pos_2, r2, neg, r3, neg_2 :: object
  451. L0:
  452. r0 = (1.5+2j)
  453. pos = r0
  454. r1 = (1.5+2j)
  455. pos_2 = r1
  456. r2 = (1.5-2j)
  457. neg = r2
  458. r3 = (-1.5+2j)
  459. neg_2 = r3
  460. return 1