Author: Carl Friedrich Bolz <[email protected]>
Branch: better-storesink
Changeset: r87164:d2cc6120b553
Date: 2016-09-09 18:54 +0200
http://bitbucket.org/pypy/pypy/changeset/d2cc6120b553/
Log: constant-fold reads from immutable fields of constants
diff --git a/rpython/translator/backendopt/cse.py
b/rpython/translator/backendopt/cse.py
--- a/rpython/translator/backendopt/cse.py
+++ b/rpython/translator/backendopt/cse.py
@@ -2,7 +2,7 @@
from rpython.translator.backendopt import support
from rpython.rtyper.lltypesystem.lloperation import llop
-from rpython.flowspace.model import mkentrymap, Variable
+from rpython.flowspace.model import mkentrymap, Variable, Constant
from rpython.translator.backendopt import removenoops
from rpython.translator import simplify
from rpython.translator.backendopt import ssa
@@ -212,8 +212,19 @@
for op in block.operations:
# heap operations
if op.opname == 'getfield':
- tup = (representative_arg(op.args[0]), op.args[1].value)
- res = self.heapcache.get(tup, None)
+ fieldname = op.args[1].value
+ arg0 = representative_arg(op.args[0])
+ res = None
+ if isinstance(arg0, Constant):
+ PTRTYPE = arg0.concretetype.TO
+ if PTRTYPE._immutable_field(fieldname).is_immutable:
+ # can constant-fold:
+ FIELDTYPE = getattr(PTRTYPE, fieldname)
+ value = getattr(arg0.value, fieldname)
+ res = Constant(value, FIELDTYPE)
+ if res is None:
+ tup = (arg0, fieldname)
+ res = self.heapcache.get(tup, None)
if res is not None:
op.opname = 'same_as'
op.args = [res]
diff --git a/rpython/translator/backendopt/test/test_cse.py
b/rpython/translator/backendopt/test/test_cse.py
--- a/rpython/translator/backendopt/test/test_cse.py
+++ b/rpython/translator/backendopt/test/test_cse.py
@@ -374,6 +374,21 @@
return res
self.check(read, [int, int])
+ def test_immutable_getfield(self):
+ class A(object):
+ _immutable_fields_ = ['a']
+ def __init__(self, a):
+ self.a = a
+ a1 = A(5)
+ a2 = A(8)
+
+ def read(i):
+ if i:
+ return a1.a
+ return a2.a
+ self.check(read, [int], getfield=0)
+
+
def fakevar(name='v'):
var = Variable(name)
var.concretetype = "fake concrete type"
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit