-- 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 = :: 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 = :: 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 = :: str return r2 hot blocks: [0, 3]