Skip to content

Commit 39e1619

Browse files
committed
fix bug && add more tests
1 parent f5e4bf3 commit 39e1619

File tree

3 files changed

+23
-24
lines changed

3 files changed

+23
-24
lines changed

Lib/test/test_capi/test_opt.py

Lines changed: 20 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1290,21 +1290,7 @@ def testfunc(n):
12901290
self.assertIsNotNone(ex)
12911291
self.assertIn("_RETURN_GENERATOR", get_opnames(ex))
12921292

1293-
def test_make_heap_safe_optimized(self):
1294-
def returns_owned(x):
1295-
return x + 1
1296-
def testfunc(n):
1297-
a = 0
1298-
for _ in range(n):
1299-
a = returns_owned(a)
1300-
return a
1301-
res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD)
1302-
self.assertEqual(res, TIER2_THRESHOLD)
1303-
self.assertIsNotNone(ex)
1304-
uops = get_opnames(ex)
1305-
self.assertNotIn("_MAKE_HEAP_SAFE", uops)
1306-
self.assertIn("_RETURN_VALUE", uops)
1307-
1293+
def test_make_heap_safe_optimized_immortal(self):
13081294
def returns_immortal():
13091295
return None
13101296
def testfunc(n):
@@ -1319,12 +1305,12 @@ def testfunc(n):
13191305
self.assertNotIn("_MAKE_HEAP_SAFE", uops)
13201306
self.assertIn("_RETURN_VALUE", uops)
13211307

1322-
def test_make_heap_safe_yield_correctness(self):
1308+
def test_make_heap_safe_optimized_yield(self):
13231309
def gen(n):
1324-
for i in range(n):
1325-
yield i + i
1310+
for _ in range(n):
1311+
yield 1
13261312
def testfunc(n):
1327-
for x in gen(n):
1313+
for _ in gen(n):
13281314
pass
13291315
testfunc(TIER2_THRESHOLD * 2)
13301316
gen_ex = get_first_executor(gen)
@@ -1333,6 +1319,21 @@ def testfunc(n):
13331319
self.assertNotIn("_MAKE_HEAP_SAFE", uops)
13341320
self.assertIn("_YIELD_VALUE", uops)
13351321

1322+
def test_make_heap_safe_not_optimized_for_owned(self):
1323+
def returns_owned(x):
1324+
return x + 1
1325+
def testfunc(n):
1326+
a = 0
1327+
for _ in range(n):
1328+
a = returns_owned(a)
1329+
return a
1330+
res, ex = self._run_with_optimizer(testfunc, TIER2_THRESHOLD)
1331+
self.assertEqual(res, TIER2_THRESHOLD)
1332+
self.assertIsNotNone(ex)
1333+
uops = get_opnames(ex)
1334+
self.assertIn("_MAKE_HEAP_SAFE", uops)
1335+
self.assertIn("_RETURN_VALUE", uops)
1336+
13361337
def test_for_iter(self):
13371338
def testfunc(n):
13381339
t = 0

Python/optimizer_bytecodes.c

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,8 @@ dummy_func(void) {
8787
// BEGIN BYTECODES //
8888

8989
op(_MAKE_HEAP_SAFE, (value -- value)) {
90-
// If the value is not borrowed, or is immortal, it's heap-safe.
91-
if (!PyJitRef_IsBorrowed(value) ||
92-
sym_is_immortal(PyJitRef_Unwrap(value))) {
90+
// eliminate _MAKE_HEAP_SAFE when we *know* the value is immortal
91+
if (sym_is_immortal(PyJitRef_Unwrap(value))) {
9392
ADD_OP(_NOP, 0, 0);
9493
}
9594
value = PyJitRef_StripReferenceInfo(value);

Python/optimizer_cases.c.h

Lines changed: 1 addition & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)