126 lines
2.1 KiB
Plaintext
126 lines
2.1 KiB
Plaintext
|
-- Test cases for basic block execution frequency analysis.
|
||
|
--
|
||
|
-- These test cases are using exception transform test machinery for convenience.
|
||
|
--
|
||
|
-- NOTE: These must all have the _freq suffix
|
||
|
|
||
|
[case testSimpleError_freq]
|
||
|
from typing import List
|
||
|
def f(x: List[int]) -> int:
|
||
|
return x[0]
|
||
|
[out]
|
||
|
def f(x):
|
||
|
x :: list
|
||
|
r0 :: object
|
||
|
r1, r2 :: int
|
||
|
L0:
|
||
|
r0 = CPyList_GetItemShort(x, 0)
|
||
|
if is_error(r0) goto L3 (error at f:3) else goto L1
|
||
|
L1:
|
||
|
r1 = unbox(int, r0)
|
||
|
dec_ref r0
|
||
|
if is_error(r1) goto L3 (error at f:3) else goto L2
|
||
|
L2:
|
||
|
return r1
|
||
|
L3:
|
||
|
r2 = <error> :: int
|
||
|
return r2
|
||
|
hot blocks: [0, 1, 2]
|
||
|
|
||
|
[case testHotBranch_freq]
|
||
|
from typing import List
|
||
|
def f(x: bool) -> None:
|
||
|
if x:
|
||
|
y = 1
|
||
|
else:
|
||
|
y = 2
|
||
|
[out]
|
||
|
def f(x):
|
||
|
x :: bool
|
||
|
y :: int
|
||
|
L0:
|
||
|
if x goto L1 else goto L2 :: bool
|
||
|
L1:
|
||
|
y = 2
|
||
|
dec_ref y :: int
|
||
|
goto L3
|
||
|
L2:
|
||
|
y = 4
|
||
|
dec_ref y :: int
|
||
|
L3:
|
||
|
return 1
|
||
|
hot blocks: [0, 1, 2, 3]
|
||
|
|
||
|
[case testGoto_freq]
|
||
|
from typing import List
|
||
|
def f(x: bool) -> int:
|
||
|
if x:
|
||
|
y = 1
|
||
|
else:
|
||
|
return 2
|
||
|
return y
|
||
|
[out]
|
||
|
def f(x):
|
||
|
x :: bool
|
||
|
y :: int
|
||
|
L0:
|
||
|
if x goto L1 else goto L2 :: bool
|
||
|
L1:
|
||
|
y = 2
|
||
|
goto L3
|
||
|
L2:
|
||
|
return 4
|
||
|
L3:
|
||
|
return y
|
||
|
hot blocks: [0, 1, 2, 3]
|
||
|
|
||
|
[case testFalseOnError_freq]
|
||
|
from typing import List
|
||
|
def f(x: List[int]) -> None:
|
||
|
x[0] = 1
|
||
|
[out]
|
||
|
def f(x):
|
||
|
x :: list
|
||
|
r0 :: object
|
||
|
r1 :: bit
|
||
|
r2 :: None
|
||
|
L0:
|
||
|
r0 = object 1
|
||
|
inc_ref r0
|
||
|
r1 = CPyList_SetItem(x, 0, r0)
|
||
|
if not r1 goto L2 (error at f:3) else goto L1 :: bool
|
||
|
L1:
|
||
|
return 1
|
||
|
L2:
|
||
|
r2 = <error> :: None
|
||
|
return r2
|
||
|
hot blocks: [0, 1]
|
||
|
|
||
|
[case testRareBranch_freq]
|
||
|
from typing_extensions import Final
|
||
|
|
||
|
x: Final = str()
|
||
|
|
||
|
def f() -> str:
|
||
|
return x
|
||
|
[out]
|
||
|
def f():
|
||
|
r0 :: str
|
||
|
r1 :: bool
|
||
|
r2 :: str
|
||
|
L0:
|
||
|
r0 = __main__.x :: static
|
||
|
if is_error(r0) goto L1 else goto L3
|
||
|
L1:
|
||
|
r1 = raise NameError('value for final name "x" was not set')
|
||
|
if not r1 goto L4 (error at f:6) else goto L2 :: bool
|
||
|
L2:
|
||
|
unreachable
|
||
|
L3:
|
||
|
inc_ref r0
|
||
|
return r0
|
||
|
L4:
|
||
|
r2 = <error> :: str
|
||
|
return r2
|
||
|
hot blocks: [0, 3]
|