blob: c2bcba54e444da4cd905704a076369d91164eb15 [file] [log] [blame] [edit]
-- Test cases for converting high-level IR to lower-level IR (lowering).
[case testLowerIntEq]
def f(x: int, y: int) -> int:
if x == y:
return 1
else:
return 2
[out]
def f(x, y):
x, y :: int
r0 :: native_int
r1, r2, r3 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L1 else goto L2 :: bool
L1:
r2 = CPyTagged_IsEq_(x, y)
if r2 goto L3 else goto L4 :: bool
L2:
r3 = x == y
if r3 goto L3 else goto L4 :: bool
L3:
return 2
L4:
return 4
[case testLowerIntNe]
def f(x: int, y: int) -> int:
if x != y:
return 1
else:
return 2
[out]
def f(x, y):
x, y :: int
r0 :: native_int
r1, r2, r3, r4 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L1 else goto L2 :: bool
L1:
r2 = CPyTagged_IsEq_(x, y)
r3 = r2 ^ 1
if r3 goto L3 else goto L4 :: bool
L2:
r4 = x != y
if r4 goto L3 else goto L4 :: bool
L3:
return 2
L4:
return 4
[case testLowerIntEqWithConstant]
def f(x: int, y: int) -> int:
if x == 2:
return 1
elif -1 == x:
return 2
return 3
[out]
def f(x, y):
x, y :: int
r0, r1 :: bit
L0:
r0 = x == 4
if r0 goto L1 else goto L2 :: bool
L1:
return 2
L2:
r1 = -2 == x
if r1 goto L3 else goto L4 :: bool
L3:
return 4
L4:
return 6
[case testLowerIntNeWithConstant]
def f(x: int, y: int) -> int:
if x != 2:
return 1
elif -1 != x:
return 2
return 3
[out]
def f(x, y):
x, y :: int
r0, r1 :: bit
L0:
r0 = x != 4
if r0 goto L1 else goto L2 :: bool
L1:
return 2
L2:
r1 = -2 != x
if r1 goto L3 else goto L4 :: bool
L3:
return 4
L4:
return 6
[case testLowerIntEqValueContext]
def f(x: int, y: int) -> bool:
return x == y
[out]
def f(x, y):
x, y :: int
r0 :: native_int
r1, r2 :: bit
r3 :: bool
r4 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L1 else goto L2 :: bool
L1:
r2 = CPyTagged_IsEq_(x, y)
r3 = r2
goto L3
L2:
r4 = x == y
r3 = r4
L3:
return r3
[case testLowerIntLt]
def f(x: int, y: int) -> int:
if x < y:
return 1
else:
return 2
[out]
def f(x, y):
x, y :: int
r0 :: native_int
r1 :: bit
r2 :: native_int
r3, r4, r5 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L2 else goto L1 :: bool
L1:
r2 = y & 1
r3 = r2 != 0
if r3 goto L2 else goto L3 :: bool
L2:
r4 = CPyTagged_IsLt_(x, y)
if r4 goto L4 else goto L5 :: bool
L3:
r5 = x < y :: signed
if r5 goto L4 else goto L5 :: bool
L4:
return 2
L5:
return 4
[case testLowerIntLe]
def f(x: int, y: int) -> int:
if x <= y:
return 1
else:
return 2
[out]
def f(x, y):
x, y :: int
r0 :: native_int
r1 :: bit
r2 :: native_int
r3, r4, r5, r6 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L2 else goto L1 :: bool
L1:
r2 = y & 1
r3 = r2 != 0
if r3 goto L2 else goto L3 :: bool
L2:
r4 = CPyTagged_IsLt_(y, x)
r5 = r4 ^ 1
if r5 goto L4 else goto L5 :: bool
L3:
r6 = x <= y :: signed
if r6 goto L4 else goto L5 :: bool
L4:
return 2
L5:
return 4
[case testLowerIntGt]
def f(x: int, y: int) -> int:
if x > y:
return 1
else:
return 2
[out]
def f(x, y):
x, y :: int
r0 :: native_int
r1 :: bit
r2 :: native_int
r3, r4, r5 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L2 else goto L1 :: bool
L1:
r2 = y & 1
r3 = r2 != 0
if r3 goto L2 else goto L3 :: bool
L2:
r4 = CPyTagged_IsLt_(y, x)
if r4 goto L4 else goto L5 :: bool
L3:
r5 = x > y :: signed
if r5 goto L4 else goto L5 :: bool
L4:
return 2
L5:
return 4
[case testLowerIntGe]
def f(x: int, y: int) -> int:
if x >= y:
return 1
else:
return 2
[out]
def f(x, y):
x, y :: int
r0 :: native_int
r1 :: bit
r2 :: native_int
r3, r4, r5, r6 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L2 else goto L1 :: bool
L1:
r2 = y & 1
r3 = r2 != 0
if r3 goto L2 else goto L3 :: bool
L2:
r4 = CPyTagged_IsLt_(x, y)
r5 = r4 ^ 1
if r5 goto L4 else goto L5 :: bool
L3:
r6 = x >= y :: signed
if r6 goto L4 else goto L5 :: bool
L4:
return 2
L5:
return 4
[case testLowerIntLtShort]
def both() -> int:
if 3 < 5:
return 1
else:
return 2
def rhs_only(x: int) -> int:
if x < 5:
return 1
else:
return 2
def lhs_only(x: int) -> int:
if 5 < x:
return 1
else:
return 2
[out]
def both():
r0 :: bit
L0:
r0 = 6 < 10 :: signed
if r0 goto L1 else goto L2 :: bool
L1:
return 2
L2:
return 4
def rhs_only(x):
x :: int
r0 :: native_int
r1 :: bit
r2 :: native_int
r3, r4, r5 :: bit
L0:
r0 = x & 1
r1 = r0 != 0
if r1 goto L2 else goto L1 :: bool
L1:
r2 = 10 & 1
r3 = r2 != 0
if r3 goto L2 else goto L3 :: bool
L2:
r4 = CPyTagged_IsLt_(x, 10)
if r4 goto L4 else goto L5 :: bool
L3:
r5 = x < 10 :: signed
if r5 goto L4 else goto L5 :: bool
L4:
return 2
L5:
return 4
def lhs_only(x):
x :: int
r0 :: native_int
r1 :: bit
r2 :: native_int
r3, r4, r5 :: bit
L0:
r0 = 10 & 1
r1 = r0 != 0
if r1 goto L2 else goto L1 :: bool
L1:
r2 = x & 1
r3 = r2 != 0
if r3 goto L2 else goto L3 :: bool
L2:
r4 = CPyTagged_IsLt_(10, x)
if r4 goto L4 else goto L5 :: bool
L3:
r5 = 10 < x :: signed
if r5 goto L4 else goto L5 :: bool
L4:
return 2
L5:
return 4
[case testLowerIntForLoop_64bit]
from __future__ import annotations
def f(l: list[int]) -> None:
for x in l:
pass
[out]
def f(l):
l :: list
r0 :: native_int
r1 :: ptr
r2 :: native_int
r3 :: bit
r4, r5 :: ptr
r6 :: native_int
r7 :: ptr
r8 :: object
r9, x :: int
r10 :: native_int
r11 :: None
L0:
r0 = 0
L1:
r1 = get_element_ptr l ob_size :: PyVarObject
r2 = load_mem r1 :: native_int*
r3 = r0 < r2 :: signed
if r3 goto L2 else goto L5 :: bool
L2:
r4 = get_element_ptr l ob_item :: PyListObject
r5 = load_mem r4 :: ptr*
r6 = r0 * 8
r7 = r5 + r6
r8 = load_mem r7 :: builtins.object*
r9 = unbox(int, r8)
dec_ref r8
if is_error(r9) goto L6 (error at f:4) else goto L3
L3:
x = r9
dec_ref x :: int
L4:
r10 = r0 + 1
r0 = r10
goto L1
L5:
return 1
L6:
r11 = <error> :: None
return r11