Skip to content

Commit dc2d922

Browse files
Address review, add test
1 parent 712a810 commit dc2d922

File tree

4 files changed

+61
-22
lines changed

4 files changed

+61
-22
lines changed

Lib/test/test_generated_cases.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2253,5 +2253,40 @@ def test_validate_uop_unused_size_mismatch(self):
22532253
"Inputs must have equal sizes"):
22542254
self.run_cases_test(input, input2, output)
22552255

2256+
def test_pure_uop_body_copied_in(self):
2257+
input = """
2258+
pure op(OP, (foo -- res)) {
2259+
res = body(foo);
2260+
}
2261+
"""
2262+
input2 = """
2263+
op(OP, (foo -- res)) {
2264+
res = sym_new_unknown(ctx);
2265+
}
2266+
"""
2267+
output = """
2268+
case OP: {
2269+
JitOptSymbol *res;
2270+
if (
2271+
sym_is_const(ctx, foo)
2272+
) {
2273+
JitOptSymbol *foo_sym = foo;
2274+
_PyStackRef foo = sym_get_const_as_stackref(ctx, foo_sym);
2275+
_PyStackRef res_stackref;
2276+
/* Start of pure uop copied from bytecodes for constant evaluation */
2277+
res_stackref = body(foo);
2278+
/* End of pure uop copied from bytecodes for constant evaluation */
2279+
res = sym_new_const_steal(ctx, PyStackRef_AsPyObjectBorrow(res_stackref));
2280+
stack_pointer[-1] = res;
2281+
}
2282+
else {
2283+
res = sym_new_unknown(ctx);
2284+
stack_pointer[-1] = res;
2285+
}
2286+
break;
2287+
}
2288+
"""
2289+
self.run_cases_test(input, input2, output)
2290+
22562291
if __name__ == "__main__":
22572292
unittest.main()

Python/optimizer_cases.c.h

Lines changed: 16 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Tools/cases_generator/generators_common.py

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -75,19 +75,6 @@ def write_header(
7575
"""
7676
)
7777

78-
def skip_to(tkn_iter: TokenIterator, end: str) -> Token:
79-
tkn = None
80-
parens = 0
81-
for tkn in tkn_iter:
82-
if tkn.kind == end and parens == 0:
83-
return tkn
84-
if tkn.kind == "LPAREN":
85-
parens += 1
86-
if tkn.kind == "RPAREN":
87-
parens -= 1
88-
assert tkn is not None
89-
return tkn
90-
9178
def emit_to(out: CWriter, tkn_iter: TokenIterator, end: str) -> Token:
9279
parens = 0
9380
for tkn in tkn_iter:

Tools/cases_generator/optimizer_generator.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,9 @@
2222
write_header,
2323
Emitter,
2424
TokenIterator,
25-
emit_to,
26-
skip_to,
2725
)
2826
from cwriter import CWriter
29-
from typing import TextIO, Callable
27+
from typing import TextIO
3028
from lexer import Token
3129
from stack import Local, Stack, StackError, Storage
3230

@@ -87,7 +85,7 @@ def stackref_type_name(var: StackItem) -> str:
8785
assert False, "Unsafe to convert a symbol to an array-like StackRef."
8886
if var.type:
8987
return var.type
90-
return f"_PyStackRef "
88+
return "_PyStackRef "
9189

9290
def declare_variables(uop: Uop, out: CWriter, skip_inputs: bool) -> None:
9391
variables = {"unused"}
@@ -210,17 +208,19 @@ def write_uop_pure_evaluation_region_header(
210208
# No reference management of outputs needed.
211209
for var in storage.outputs:
212210
var.in_local = True
213-
emitter.emit_tokens(uop, storage, None, False, is_abstract=True)
211+
emitter.emit("/* Start of pure uop copied from bytecodes for constant evaluation */\n")
212+
emitter.emit_tokens(uop, storage, inst=None, emit_braces=False, is_abstract=True)
214213
out.start_line()
214+
emitter.emit("/* End of pure uop copied from bytecodes for constant evaluation */\n")
215215
# Finally, assign back the output stackrefs to symbolics.
216216
for outp in uop.stack.outputs:
217217
# All new stackrefs are created from new references.
218218
# That's how the stackref contract works.
219219
if not outp.peek:
220-
out.emit(f"{outp.name} = sym_new_const_steal(ctx, PyStackRef_AsPyObjectBorrow({outp.name}_stackref));\n")
220+
emitter.emit(f"{outp.name} = sym_new_const_steal(ctx, PyStackRef_AsPyObjectBorrow({outp.name}_stackref));\n")
221221
else:
222-
out.emit(f"{outp.name} = sym_new_const(ctx, PyStackRef_AsPyObjectBorrow({outp.name}_stackref));\n")
223-
storage.flush(out)
222+
emitter.emit(f"{outp.name} = sym_new_const(ctx, PyStackRef_AsPyObjectBorrow({outp.name}_stackref));\n")
223+
storage.flush(out)
224224
emitter.emit("}\n")
225225
emitter.emit("else {\n")
226226

@@ -266,7 +266,8 @@ def write_uop(
266266
out.start_line()
267267
if override:
268268
emitter = OptimizerEmitter(out, {})
269-
_, storage = emitter.emit_tokens(override, storage, None, False, is_abstract=True)
269+
_, storage = emitter.emit_tokens(override, storage, inst=None,
270+
emit_braces=False, is_abstract=True)
270271
storage.flush(out)
271272
else:
272273
emit_default(out, uop, stack)

0 commit comments

Comments
 (0)