[pypy-commit] pypy result-in-resops: a little bit of dance with copying optimize_value. we need a better model I think

fijal noreply at buildbot.pypy.org
Wed Sep 26 16:15:58 CEST 2012


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: result-in-resops
Changeset: r57612:bf44c48658a3
Date: 2012-09-26 16:13 +0200
http://bitbucket.org/pypy/pypy/changeset/bf44c48658a3/

Log:	a little bit of dance with copying optimize_value. we need a better
	model I think

diff --git a/pypy/jit/metainterp/optimizeopt/earlyforce.py b/pypy/jit/metainterp/optimizeopt/earlyforce.py
--- a/pypy/jit/metainterp/optimizeopt/earlyforce.py
+++ b/pypy/jit/metainterp/optimizeopt/earlyforce.py
@@ -2,11 +2,9 @@
 from pypy.jit.metainterp.resoperation import rop
 
 def check_early_force(opt, opnum, num, arg):
-    try:
-        value = arg.get_extra("optimize_value")
-    except KeyError:
-        return
-    value.force_box(opt)
+    value = opt.getvalue(arg, create=False)
+    if value is not None:
+        value.force_box(opt)
 
 class OptEarlyForce(Optimization):
     def propagate_forward(self, op):
diff --git a/pypy/jit/metainterp/optimizeopt/intbounds.py b/pypy/jit/metainterp/optimizeopt/intbounds.py
--- a/pypy/jit/metainterp/optimizeopt/intbounds.py
+++ b/pypy/jit/metainterp/optimizeopt/intbounds.py
@@ -113,8 +113,8 @@
                 # nonneg % power-of-two ==> nonneg & (power-of-two - 1)
                 arg1 = op.getarg(0)
                 arg2 = ConstInt(val-1)
-                xxx
-                op = op.copy_and_change(rop.INT_AND, args=[arg1, arg2])
+                op = self.optimizer.copy_and_change(op, rop.INT_AND, arg0=arg1,
+                                                    arg1=arg2)
         self.emit_operation(op)
         if v2.is_constant():
             val = v2.op.getint()
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
@@ -22,7 +22,7 @@
 from pypy.jit.metainterp.resoperation import rop, AbstractResOp, opgroups,\
      Const, ConstInt, ConstFloat, AbstractValue
 from pypy.jit.metainterp.typesystem import llhelper
-from pypy.rlib.objectmodel import specialize
+from pypy.rlib.objectmodel import specialize, we_are_translated
 from pypy.tool.pairtype import extendabletype
 
 LEVEL_UNKNOWN    = '\x00'
@@ -43,6 +43,11 @@
     def clone(self):
         return LenBound(self.mode, self.descr, self.bound.clone())
 
+class exploder(object):
+    def __getattribute__(self, attr):
+        import pdb
+        pdb.set_trace()
+
 class OptValue(object):
     _attrs_ = ('known_class', 'last_guard', 'level', 'intbound', 'lenbound', 'is_bool_box')
 
@@ -305,8 +310,8 @@
         self.next_optimization.propagate_forward(op)
 
     # FIXME: Move some of these here?
-    def getvalue(self, box):
-        return self.optimizer.getvalue(box)
+    def getvalue(self, box, create=True):
+        return self.optimizer.getvalue(box, create=create)
 
     def setvalue(self, box, value):
         self.optimizer.setvalue(box, value)
@@ -442,7 +447,7 @@
         self.metainterp_sd.profiler.count(jitprof.Counters.OPT_FORCINGS)
         self.resumedata_memo.forget_numberings(virtualbox)
 
-    def getvalue(self, box):
+    def getvalue(self, box, create=True):
         try:
             while True:
                 box = box.get_extra("optimize_replace")
@@ -462,6 +467,8 @@
         try:
             value = box.get_extra("optimize_value")
         except KeyError:
+            if not create:
+                return None
             value = OptValue(box)
             box.set_extra("optimize_value", value)
         self.ensure_imported(value)
@@ -515,6 +522,13 @@
         assert isinstance(with_, AbstractValue)
         assert not what.has_extra("optimize_replace")
         assert not what.is_constant()
+        if what.has_extra("optimize_value"):
+            v = what.get_extra("optimize_value")
+            v.op = with_
+            with_.set_extra("optimize_value", v)
+        #if not we_are_translated():
+        #    if what.has_extra("optimize_value"):
+        #        what.get_extra("optimize_value").__class__ = exploder
         what.set_extra("optimize_replace", with_)
 
     def make_constant(self, box, constbox):
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
@@ -4690,7 +4690,7 @@
         ops = """
         [p0, i0]
         i1 = int_add(i0, 1)
-        p1 = call(0, p0, i0, i1, descr=strslicedescr)
+        p1 = call_r(0, p0, i0, i1, descr=strslicedescr)
         escape(p1)
         jump(p0, i1)
         """
@@ -4859,7 +4859,7 @@
         setarrayitem_gc(p0, 0, 3)
         setarrayitem_gc(p0, 2, 4)
         setarrayitem_gc(p0, i0, 15)
-        i2 = getarrayitem_gc(p0, 2)
+        i2 = getarrayitem_gc_i(p0, 2)
         jump(p0, i2)
         """
         # Remove the getarrayitem_gc, because we know that p[i0] does not alias
@@ -4936,7 +4936,7 @@
         [i1]
         p0 = newstr(6)
         copystrcontent(s"hello!", p0, 0, 0, 6)
-        p1 = call(0, p0, s"abc123", descr=strconcatdescr)
+        p1 = call_r(0, p0, s"abc123", descr=strconcatdescr)
         i0 = strgetitem(p1, i1)
         finish(i0)
         """
diff --git a/pypy/jit/metainterp/optimizeopt/vstring.py b/pypy/jit/metainterp/optimizeopt/vstring.py
--- a/pypy/jit/metainterp/optimizeopt/vstring.py
+++ b/pypy/jit/metainterp/optimizeopt/vstring.py
@@ -409,9 +409,9 @@
             vvalue = self.make_vstring_plain(op, mode)
             vvalue.setup(length_box.getint())
         else:
-            self.getvalue(op.result).ensure_nonnull()
+            self.getvalue(op).ensure_nonnull()
             self.emit_operation(op)
-            self.pure(mode.STRLEN, [op.result], op.getarg(0))
+            self.pure(op.getarg(0), mode.STRLEN, op)
 
     def optimize_STRSETITEM(self, op):
         value = self.getvalue(op.getarg(0))


More information about the pypy-commit mailing list