Author: Maciej Fijalkowski <[email protected]>
Branch: result-in-resops
Changeset: r57552:19793a568d47
Date: 2012-09-23 21:41 +0200
http://bitbucket.org/pypy/pypy/changeset/19793a568d47/

Log:    general progress

diff --git a/pypy/jit/metainterp/optimizeopt/heap.py 
b/pypy/jit/metainterp/optimizeopt/heap.py
--- a/pypy/jit/metainterp/optimizeopt/heap.py
+++ b/pypy/jit/metainterp/optimizeopt/heap.py
@@ -4,9 +4,10 @@
 from pypy.jit.metainterp.optimizeopt.optimizer import Optimization,\
      MODE_ARRAY, LEVEL_KNOWNCLASS
 from pypy.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from pypy.jit.metainterp.resoperation import rop, opgroups, Const
+from pypy.jit.metainterp.resoperation import rop, opgroups, Const, INT,\
+     FLOAT, create_resop_1
 from pypy.rlib.objectmodel import we_are_translated
-
+from pypy.rpython.lltypesystem import lltype, llmemory
 
 class CachedField(object):
     def __init__(self):
@@ -395,8 +396,18 @@
     optimize_GETFIELD_GC_PURE_p = optimize_GETFIELD_GC_PURE_i
 
     def optimize_SETFIELD_GC(self, op):
-        if self.has_pure_result(rop.GETFIELD_GC_PURE, [op.getarg(0)],
-                                op.getdescr()):
+        if op.type == INT:
+            op_key = create_resop_1(rop.GETFIELD_GC_PURE_i, 0, op.getarg(0),
+                                    op.getdescr())
+        elif op.type == FLOAT:
+            op_key = create_resop_1(rop.GETFIELD_GC_PURE_f, 0.0, op.getarg(0),
+                                    op.getdescr())
+        else:
+            op_key = create_resop_1(rop.GETFIELD_GC_PURE_p,
+                                    lltype.nullptr(llmemory.GCREF.TO),
+                                    op.getarg(0),
+                                    op.getdescr())
+        if self.has_pure_result(op_key):
             os.write(2, '[bogus _immutable_field_ declaration: %s]\n' %
                      (op.getdescr().repr_of_descr()))
             raise BogusPureField
diff --git a/pypy/jit/metainterp/optimizeopt/optimizer.py 
b/pypy/jit/metainterp/optimizeopt/optimizer.py
--- a/pypy/jit/metainterp/optimizeopt/optimizer.py
+++ b/pypy/jit/metainterp/optimizeopt/optimizer.py
@@ -319,9 +319,9 @@
         if self.optimizer.optpure:
             self.optimizer.optpure.pure(opnum, result, arg0, arg1)
 
-    def has_pure_result(self, opnum, args, descr):
+    def has_pure_result(self, op_key):
         if self.optimizer.optpure:
-            return self.optimizer.optpure.has_pure_result(opnum, args, descr)
+            return self.optimizer.optpure.has_pure_result(op_key)
         return False
 
     def get_pure_result(self, key):
diff --git a/pypy/jit/metainterp/optimizeopt/pure.py 
b/pypy/jit/metainterp/optimizeopt/pure.py
--- a/pypy/jit/metainterp/optimizeopt/pure.py
+++ b/pypy/jit/metainterp/optimizeopt/pure.py
@@ -97,13 +97,11 @@
         op = create_resop_2(opnum, result, arg0, arg1)
         self.pure_operations.add(op)
 
-    def has_pure_result(self, opnum, args, descr):
-        op = ResOperation(opnum, args, None, descr)
-        key = self.optimizer.make_args_key(op)
-        op = self.pure_operations.get(key, None)
+    def has_pure_result(self, op_key):
+        op = self.pure_operations.get(op_key)
         if op is None:
             return False
-        return op.getdescr() is descr
+        return op.getdescr() is op_key.getdescr()
 
     def get_pure_result(self, key):
         return self.pure_operations.get(key)
diff --git a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py 
b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
--- a/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
+++ b/pypy/jit/metainterp/optimizeopt/test/test_optimizebasic.py
@@ -559,14 +559,16 @@
 
     def test_const_guard_value(self):
         ops = """
-        []
-        i = int_add(5, 3)
+        [i0]
+        guard_value(i0, 2) []
+        i = int_add(5, i0)
         guard_value(i, 8) []
-        jump()
-        """
-        expected = """
-        []
-        jump()
+        jump(i0)
+        """
+        expected = """
+        [i0]
+        guard_value(i0, 2) []
+        jump(2)
         """
         self.optimize_loop(ops, expected)
 
diff --git a/pypy/jit/metainterp/optimizeopt/util.py 
b/pypy/jit/metainterp/optimizeopt/util.py
--- a/pypy/jit/metainterp/optimizeopt/util.py
+++ b/pypy/jit/metainterp/optimizeopt/util.py
@@ -94,7 +94,7 @@
     """
     def __init__(self, bucket_size=BUCKET_SIZE):
         self.buckets = [None] * bucket_size
-        self.bucket_size = bucket_size
+        self.bucket_size = bucket_size - 1
 
     def get(self, op):
         hash = op._get_hash_() & self.bucket_size
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to