self.assertIn("_UNPACK_SEQUENCE_TWO_TUPLE", uops)
self.assertNotIn("_GUARD_TOS_TUPLE", uops)
+ def test_binary_op_extend_float_result_enables_inplace_multiply(self):
+ # (2 + x) * y with x, y floats: `2 + x` goes through _BINARY_OP_EXTEND
+ # (int + float). The result_type/result_unique info should let the
+ # subsequent float multiply use the inplace variant.
+ def testfunc(n):
+ x = 3.5
+ y = 2.0
+ res = 0.0
+ for _ in range(n):
+ res = (2 + x) * y
+ return res
+
+ res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD)
+ self.assertEqual(res, 11.0)
+ self.assertIsNotNone(ex)
+ uops = get_opnames(ex)
+ self.assertIn("_BINARY_OP_EXTEND", uops)
+ self.assertIn("_BINARY_OP_MULTIPLY_FLOAT_INPLACE", uops)
+ self.assertNotIn("_BINARY_OP_MULTIPLY_FLOAT", uops)
+ # NOS guard on the multiply is eliminated because _BINARY_OP_EXTEND
+ # propagates PyFloat_Type.
+ self.assertNotIn("_GUARD_NOS_FLOAT", uops)
+
def test_unary_invert_long_type(self):
def testfunc(n):
for _ in range(n):
static _PyBinaryOpSpecializationDescr binaryop_extend_descrs[] = {
/* long-long arithmetic */
- {NB_OR, compactlongs_guard, compactlongs_or},
- {NB_AND, compactlongs_guard, compactlongs_and},
- {NB_XOR, compactlongs_guard, compactlongs_xor},
- {NB_INPLACE_OR, compactlongs_guard, compactlongs_or},
- {NB_INPLACE_AND, compactlongs_guard, compactlongs_and},
- {NB_INPLACE_XOR, compactlongs_guard, compactlongs_xor},
+ {NB_OR, compactlongs_guard, compactlongs_or, &PyLong_Type, 1},
+ {NB_AND, compactlongs_guard, compactlongs_and, &PyLong_Type, 1},
+ {NB_XOR, compactlongs_guard, compactlongs_xor, &PyLong_Type, 1},
+ {NB_INPLACE_OR, compactlongs_guard, compactlongs_or, &PyLong_Type, 1},
+ {NB_INPLACE_AND, compactlongs_guard, compactlongs_and, &PyLong_Type, 1},
+ {NB_INPLACE_XOR, compactlongs_guard, compactlongs_xor, &PyLong_Type, 1},
/* float-long arithemetic */
- {NB_ADD, float_compactlong_guard, float_compactlong_add},
- {NB_SUBTRACT, float_compactlong_guard, float_compactlong_subtract},
- {NB_TRUE_DIVIDE, nonzero_float_compactlong_guard, float_compactlong_true_div},
- {NB_MULTIPLY, float_compactlong_guard, float_compactlong_multiply},
+ {NB_ADD, float_compactlong_guard, float_compactlong_add, &PyFloat_Type, 1},
+ {NB_SUBTRACT, float_compactlong_guard, float_compactlong_subtract, &PyFloat_Type, 1},
+ {NB_TRUE_DIVIDE, nonzero_float_compactlong_guard, float_compactlong_true_div, &PyFloat_Type, 1},
+ {NB_MULTIPLY, float_compactlong_guard, float_compactlong_multiply, &PyFloat_Type, 1},
/* float-float arithmetic */
- {NB_ADD, compactlong_float_guard, compactlong_float_add},
- {NB_SUBTRACT, compactlong_float_guard, compactlong_float_subtract},
- {NB_TRUE_DIVIDE, nonzero_compactlong_float_guard, compactlong_float_true_div},
- {NB_MULTIPLY, compactlong_float_guard, compactlong_float_multiply},
+ {NB_ADD, compactlong_float_guard, compactlong_float_add, &PyFloat_Type, 1},
+ {NB_SUBTRACT, compactlong_float_guard, compactlong_float_subtract, &PyFloat_Type, 1},
+ {NB_TRUE_DIVIDE, nonzero_compactlong_float_guard, compactlong_float_true_div, &PyFloat_Type, 1},
+ {NB_MULTIPLY, compactlong_float_guard, compactlong_float_multiply, &PyFloat_Type, 1},
};
static int