gh-146306: JIT: Optimize float operations by mutating uniquely-referenced operands in place (GH-146307)

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Pieter Eendebak 2026-03-24 14:16:02 +01:00 committed by GitHub
parent 68c7fad757
commit 951675c18a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 2349 additions and 1231 deletions

View file

@ -325,21 +325,57 @@ dummy_func(void) {
}
op(_BINARY_OP_ADD_FLOAT, (left, right -- res, l, r)) {
res = sym_new_type(ctx, &PyFloat_Type);
l = left;
r = right;
if (PyJitRef_IsUnique(left)) {
ADD_OP(_BINARY_OP_ADD_FLOAT_INPLACE, 0, 0);
l = PyJitRef_Borrow(sym_new_null(ctx));
r = right;
}
else if (PyJitRef_IsUnique(right)) {
ADD_OP(_BINARY_OP_ADD_FLOAT_INPLACE_RIGHT, 0, 0);
l = left;
r = PyJitRef_Borrow(sym_new_null(ctx));
}
else {
l = left;
r = right;
}
res = PyJitRef_MakeUnique(sym_new_type(ctx, &PyFloat_Type));
}
op(_BINARY_OP_SUBTRACT_FLOAT, (left, right -- res, l, r)) {
res = sym_new_type(ctx, &PyFloat_Type);
l = left;
r = right;
if (PyJitRef_IsUnique(left)) {
ADD_OP(_BINARY_OP_SUBTRACT_FLOAT_INPLACE, 0, 0);
l = PyJitRef_Borrow(sym_new_null(ctx));
r = right;
}
else if (PyJitRef_IsUnique(right)) {
ADD_OP(_BINARY_OP_SUBTRACT_FLOAT_INPLACE_RIGHT, 0, 0);
l = left;
r = PyJitRef_Borrow(sym_new_null(ctx));
}
else {
l = left;
r = right;
}
res = PyJitRef_MakeUnique(sym_new_type(ctx, &PyFloat_Type));
}
op(_BINARY_OP_MULTIPLY_FLOAT, (left, right -- res, l, r)) {
res = sym_new_type(ctx, &PyFloat_Type);
l = left;
r = right;
if (PyJitRef_IsUnique(left)) {
ADD_OP(_BINARY_OP_MULTIPLY_FLOAT_INPLACE, 0, 0);
l = PyJitRef_Borrow(sym_new_null(ctx));
r = right;
}
else if (PyJitRef_IsUnique(right)) {
ADD_OP(_BINARY_OP_MULTIPLY_FLOAT_INPLACE_RIGHT, 0, 0);
l = left;
r = PyJitRef_Borrow(sym_new_null(ctx));
}
else {
l = left;
r = right;
}
res = PyJitRef_MakeUnique(sym_new_type(ctx, &PyFloat_Type));
}
op(_BINARY_OP_ADD_UNICODE, (left, right -- res, l, r)) {
@ -531,7 +567,12 @@ dummy_func(void) {
op(_UNARY_NEGATIVE, (value -- res, v)) {
v = value;
REPLACE_OPCODE_IF_EVALUATES_PURE(value, res);
if (sym_is_compact_int(value)) {
if (sym_matches_type(value, &PyFloat_Type) && PyJitRef_IsUnique(value)) {
ADD_OP(_UNARY_NEGATIVE_FLOAT_INPLACE, 0, 0);
v = PyJitRef_Borrow(sym_new_null(ctx));
res = PyJitRef_MakeUnique(sym_new_type(ctx, &PyFloat_Type));
}
else if (sym_is_compact_int(value)) {
res = sym_new_compact_int(ctx);
}
else {