[pypy-commit] pypy better-storesink: just call constfold after cse to remove constant operations, instead of doing it

cfbolz pypy.commits at gmail.com
Fri Sep 16 17:13:21 EDT 2016


Author: Carl Friedrich Bolz <cfbolz at gmx.de>
Branch: better-storesink
Changeset: r87169:a9034e8630f8
Date: 2016-09-13 14:20 +0200
http://bitbucket.org/pypy/pypy/changeset/a9034e8630f8/

Log:	just call constfold after cse to remove constant operations, instead
	of doing it badly in CSE itself

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
@@ -6,7 +6,7 @@
 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
+from rpython.translator.backendopt import ssa, constfold
 from rpython.translator.backendopt.writeanalyze import WriteAnalyzer
 
 from rpython.translator.backendopt.support import log
@@ -224,18 +224,8 @@
                 fieldname = op.args[1].value
                 concretetype = op.args[0].concretetype
                 arg0 = representative_arg(op.args[0])
-                res = None
-                if isinstance(arg0, Constant):
-                    PTRTYPE = concretetype.TO
-                    if PTRTYPE._immutable_field(fieldname):
-                        # can constant-fold:
-                        FIELDTYPE = getattr(PTRTYPE, fieldname)
-                        const = lltype.cast_pointer(concretetype, arg0.value)
-                        value = getattr(const, fieldname)
-                        res = Constant(value, FIELDTYPE)
-                if res is None:
-                    tup = (arg0, op.args[0].concretetype, fieldname)
-                    res = self.heapcache.get(tup, None)
+                tup = (arg0, op.args[0].concretetype, fieldname)
+                res = self.heapcache.get(tup, None)
                 if res is not None:
                     op.opname = 'same_as'
                     op.args = [res]
@@ -342,6 +332,7 @@
         if added_same_as:
             ssa.SSA_to_SSI(graph)
             removenoops.remove_same_as(graph)
+            constfold.constant_fold_graph(graph) # make use of extra constants
         simplify.transform_dead_op_vars(graph)
         if added_same_as:
             if self.translator.config.translation.verbose:
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
@@ -379,13 +379,18 @@
             _immutable_fields_ = ['a']
             def __init__(self, a):
                 self.a = a
+        class B(object):
+            pass
         a1 = A(5)
         a2 = A(8)
 
         def read(i):
+            b = B()
             if i:
-                return a1.a
-            return a2.a
+                b.a = a1
+                return b.a.a
+            b.a = a2
+            return b.a.a
         self.check(read, [int], getfield=0)
 
         # not immutable
@@ -429,7 +434,7 @@
         class Cls(object):
             pass
         class Sub(Cls):
-            pass
+            _immutable_fields_ = ['user_overridden_class']
         cls1 = Cls()
         cls2 = Sub()
         cls2.user_overridden_class = True
@@ -455,7 +460,7 @@
                 cls = a.cls
                 assert type(cls) is Sub
                 return cls.user_overridden_class
-        self.check(f, [int], getfield=2)
+        self.check(f, [int], getfield=0)
 
 
 


More information about the pypy-commit mailing list