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]
|