@@ -2912,6 +2912,46 @@ def testfunc(n):
29122912 self .assertIn ("_POP_TOP_NOP" , uops )
29132913 self .assertLessEqual (count_ops (ex , "_POP_TOP" ), 2 )
29142914
2915+ def test_binary_op_refcount_elimination (self ):
2916+ class CustomAdder :
2917+ def __init__ (self , val ):
2918+ self .val = val
2919+ def __add__ (self , other ):
2920+ return CustomAdder (self .val + other .val )
2921+
2922+ def testfunc (n ):
2923+ a = CustomAdder (1 )
2924+ b = CustomAdder (2 )
2925+ res = None
2926+ for _ in range (n ):
2927+ res = a + b
2928+ return res .val if res else 0
2929+
2930+ res , ex = self ._run_with_optimizer (testfunc , TIER2_THRESHOLD )
2931+ self .assertEqual (res , 3 )
2932+ self .assertIsNotNone (ex )
2933+ uops = get_opnames (ex )
2934+ self .assertIn ("_BINARY_OP" , uops )
2935+ self .assertIn ("_POP_TOP_NOP" , uops )
2936+ self .assertLessEqual (count_ops (ex , "_POP_TOP" ), 2 )
2937+
2938+ def test_binary_op_extend_float_long_add_refcount_elimination (self ):
2939+ def testfunc (n ):
2940+ a = 1.5
2941+ b = 2
2942+ res = 0.0
2943+ for _ in range (n ):
2944+ res = a + b
2945+ return res
2946+
2947+ res , ex = self ._run_with_optimizer (testfunc , TIER2_THRESHOLD )
2948+ self .assertEqual (res , 3.5 )
2949+ self .assertIsNotNone (ex )
2950+ uops = get_opnames (ex )
2951+ self .assertIn ("_BINARY_OP_EXTEND" , uops )
2952+ self .assertIn ("_POP_TOP_NOP" , uops )
2953+ self .assertLessEqual (count_ops (ex , "_POP_TOP" ), 2 )
2954+
29152955 def test_remove_guard_for_slice_list (self ):
29162956 def f (n ):
29172957 for i in range (n ):
0 commit comments