[pypy-commit] pypy optresult: hack enough to get the basic test go to the backend

fijal noreply at buildbot.pypy.org
Tue Nov 18 07:43:24 CET 2014


Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: optresult
Changeset: r74570:8960f6fef760
Date: 2014-11-18 08:43 +0200
http://bitbucket.org/pypy/pypy/changeset/8960f6fef760/

Log:	hack enough to get the basic test go to the backend

diff --git a/rpython/jit/metainterp/compile.py b/rpython/jit/metainterp/compile.py
--- a/rpython/jit/metainterp/compile.py
+++ b/rpython/jit/metainterp/compile.py
@@ -128,9 +128,10 @@
     part = create_empty_loop(metainterp)
     part.inputargs = inputargs[:]
     h_ops = history.operations
-    part.operations = [ResOperation(rop.LABEL, inputargs, None, descr=TargetToken(jitcell_token))] + \
+    # XXX why do we clone here?
+    part.operations = [ResOperation(rop.LABEL, inputargs, descr=TargetToken(jitcell_token))] + \
                       [h_ops[i].clone() for i in range(start, len(h_ops))] + \
-                      [ResOperation(rop.LABEL, jumpargs, None, descr=jitcell_token)]
+                      [ResOperation(rop.LABEL, jumpargs, descr=jitcell_token)]
 
     try:
         optimize_trace(metainterp_sd, part, enable_opts)
diff --git a/rpython/jit/metainterp/executor.py b/rpython/jit/metainterp/executor.py
--- a/rpython/jit/metainterp/executor.py
+++ b/rpython/jit/metainterp/executor.py
@@ -437,7 +437,6 @@
 
 
 def execute(cpu, metainterp, opnum, descr, *argboxes):
-    xxx
     # only for opnums with a fixed arity
     num_args = len(argboxes)
     withdescr = has_descr(opnum)
diff --git a/rpython/jit/metainterp/history.py b/rpython/jit/metainterp/history.py
--- a/rpython/jit/metainterp/history.py
+++ b/rpython/jit/metainterp/history.py
@@ -1,7 +1,7 @@
 from rpython.rtyper.extregistry import ExtRegistryEntry
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
 from rpython.rlib.objectmodel import we_are_translated, Symbolic
-from rpython.rlib.objectmodel import compute_unique_id
+from rpython.rlib.objectmodel import compute_unique_id, specialize
 from rpython.rlib.rarithmetic import r_int64, is_valid_int
 
 from rpython.conftest import option
@@ -172,6 +172,16 @@
         self.identifier = identifier      # for testing
 
 
+ at specialize.argtype(0)
+def newconst(value):
+    if isinstance(value, int):
+        return ConstInt(value)
+    elif isinstance(value, float):
+        return ConstFloat(value)
+    else:
+        assert lltype.typeOf(value) == llmemory.GCREF
+        return ConstPtr(value)
+        
 class Const(AbstractValue):
     __slots__ = ()
 
@@ -689,6 +699,7 @@
     @staticmethod
     def check_consistency_of_branch(operations, seen):
         "NOT_RPYTHON"
+        return # XXX for now
         for op in operations:
             for i in range(op.numargs()):
                 box = op.getarg(i)
@@ -763,8 +774,10 @@
         self.inputargs = None
         self.operations = []
 
-    def record(self, opnum, argboxes, resbox, descr=None):
-        op = ResOperation(opnum, argboxes, resbox, descr)
+    @specialize.argtype(3)
+    def record(self, opnum, argboxes, value, descr=None):
+        op = ResOperation(opnum, argboxes, descr)
+        op.setvalue(value)
         self.operations.append(op)
         return op
 
diff --git a/rpython/jit/metainterp/logger.py b/rpython/jit/metainterp/logger.py
--- a/rpython/jit/metainterp/logger.py
+++ b/rpython/jit/metainterp/logger.py
@@ -155,10 +155,10 @@
             s_offset = "+%d: " % offset
         args = ", ".join([self.repr_of_arg(op.getarg(i)) for i in range(op.numargs())])
 
-        if op.result is not None:
-            res = self.repr_of_arg(op.result) + " = "
-        else:
-            res = ""
+        #if op.result is not None:
+        #    res = self.repr_of_arg(op.result) + " = "
+        #else:
+        res = ""
         is_guard = op.is_guard()
         if op.getdescr() is not None:
             descr = op.getdescr()
diff --git a/rpython/jit/metainterp/optimizeopt/pure.py b/rpython/jit/metainterp/optimizeopt/pure.py
--- a/rpython/jit/metainterp/optimizeopt/pure.py
+++ b/rpython/jit/metainterp/optimizeopt/pure.py
@@ -42,7 +42,6 @@
                                                 op.getarglist(), op.getdescr())
             oldop = self.pure_operations.get(args, None)
             if oldop is not None and oldop.getdescr() is op.getdescr():
-                assert oldop.getopnum() == op.getopnum()
                 self.optimizer.make_equal_to(op, self.getvalue(oldop))
                 return
             else:
diff --git a/rpython/jit/metainterp/optimizeopt/rewrite.py b/rpython/jit/metainterp/optimizeopt/rewrite.py
--- a/rpython/jit/metainterp/optimizeopt/rewrite.py
+++ b/rpython/jit/metainterp/optimizeopt/rewrite.py
@@ -233,7 +233,7 @@
 
         # replace "x / const" by "x * (1/const)" if possible
         if v2.is_constant():
-            divisor = v2.box.getfloat()
+            divisor = v2.box.getfloatstorage()
             fraction = math.frexp(divisor)[0]
             # This optimization is valid for powers of two
             # but not for zeroes, some denormals and NaN:
@@ -242,7 +242,8 @@
                 rfraction = math.frexp(reciprocal)[0]
                 if rfraction == 0.5 or rfraction == -0.5:
                     c = ConstFloat(longlong.getfloatstorage(reciprocal))
-                    op = op.copy_and_change(rop.FLOAT_MUL, args=[arg1, c])
+                    op = self.optimizer.replace_op_with(op, rop.FLOAT_MUL,
+                                                        args=[arg1, c])
         self.emit_operation(op)
 
     def optimize_FLOAT_NEG(self, op):
diff --git a/rpython/jit/metainterp/optimizeopt/simplify.py b/rpython/jit/metainterp/optimizeopt/simplify.py
--- a/rpython/jit/metainterp/optimizeopt/simplify.py
+++ b/rpython/jit/metainterp/optimizeopt/simplify.py
@@ -48,7 +48,7 @@
         if not self.unroll:
             descr = op.getdescr()
             if isinstance(descr, JitCellToken):
-                return self.optimize_JUMP(op.copy_and_change(rop.JUMP))
+                return self.optimize_JUMP(op._copy_and_change(rop.JUMP))
             self.last_label_descr = op.getdescr()
         self.emit_operation(op)
 
diff --git a/rpython/jit/metainterp/pyjitpl.py b/rpython/jit/metainterp/pyjitpl.py
--- a/rpython/jit/metainterp/pyjitpl.py
+++ b/rpython/jit/metainterp/pyjitpl.py
@@ -1883,11 +1883,11 @@
         # execute the operation
         profiler = self.staticdata.profiler
         profiler.count_ops(opnum)
-        resbox = executor.execute(self.cpu, self, opnum, descr, *argboxes)
+        resvalue = executor.execute(self.cpu, self, opnum, descr, *argboxes)
         if rop._ALWAYS_PURE_FIRST <= opnum <= rop._ALWAYS_PURE_LAST:
-            return self._record_helper_pure(opnum, resbox, descr, *argboxes)
+            return self._record_helper_pure(opnum, resvalue, descr, *argboxes)
         else:
-            return self._record_helper_nonpure_varargs(opnum, resbox, descr,
+            return self._record_helper_nonpure_varargs(opnum, resvalue, descr,
                                                        list(argboxes))
 
     @specialize.arg(1)
@@ -1896,6 +1896,7 @@
         # execute the operation
         profiler = self.staticdata.profiler
         profiler.count_ops(opnum)
+        xxx
         resbox = executor.execute_varargs(self.cpu, self,
                                           opnum, argboxes, descr)
         # check if the operation can be constant-folded away
@@ -1906,16 +1907,18 @@
             resbox = self._record_helper_nonpure_varargs(opnum, resbox, descr, argboxes)
         return resbox
 
-    def _record_helper_pure(self, opnum, resbox, descr, *argboxes):
+    @specialize.argtype(2)
+    def _record_helper_pure(self, opnum, resvalue, descr, *argboxes):
         canfold = self._all_constants(*argboxes)
         if canfold:
-            resbox = resbox.constbox()       # ensure it is a Const
-            return resbox
+            return history.newconst(resvalue)
         else:
-            resbox = resbox.nonconstbox()    # ensure it is a Box
-            return self._record_helper_nonpure_varargs(opnum, resbox, descr, list(argboxes))
+            return self._record_helper_nonpure_varargs(opnum, resvalue, descr,
+                                                       list(argboxes))
 
+    @specialize.argtype(2)
     def _record_helper_pure_varargs(self, opnum, resbox, descr, argboxes):
+        xxx
         canfold = self._all_constants_varargs(argboxes)
         if canfold:
             resbox = resbox.constbox()       # ensure it is a Const
@@ -1924,19 +1927,19 @@
             resbox = resbox.nonconstbox()    # ensure it is a Box
             return self._record_helper_nonpure_varargs(opnum, resbox, descr, argboxes)
 
-    def _record_helper_nonpure_varargs(self, opnum, resbox, descr, argboxes):
-        assert resbox is None or isinstance(resbox, Box)
+    @specialize.argtype(2)
+    def _record_helper_nonpure_varargs(self, opnum, resvalue, descr, argboxes):
         if (rop._OVF_FIRST <= opnum <= rop._OVF_LAST and
             self.last_exc_value_box is None and
             self._all_constants_varargs(argboxes)):
-            return resbox.constbox()
+            return history.newconst(resvalue)
         # record the operation
         profiler = self.staticdata.profiler
         profiler.count_ops(opnum, Counters.RECORDED_OPS)
         self.heapcache.invalidate_caches(opnum, descr, argboxes)
-        op = self.history.record(opnum, argboxes, resbox, descr)
+        op = self.history.record(opnum, argboxes, resvalue, descr)
         self.attach_debug_info(op)
-        return resbox
+        return op
 
     def execute_new_with_vtable(self, known_class):
         resbox = self.execute_and_record(rop.NEW_WITH_VTABLE, None,
diff --git a/rpython/jit/metainterp/resoperation.py b/rpython/jit/metainterp/resoperation.py
--- a/rpython/jit/metainterp/resoperation.py
+++ b/rpython/jit/metainterp/resoperation.py
@@ -115,7 +115,7 @@
         descr = self.getdescr()
         if descr is not None:
             descr = descr.clone_if_mutable()
-        op = ResOperation(self.getopnum(), args[:], self.result, descr)
+        op = ResOperation(self.getopnum(), args[:], descr)
         if not we_are_translated():
             op.name = self.name
             op.pc = self.pc
@@ -340,6 +340,9 @@
             name = self.type + str(len(memo))
             memo[self] = name
             return name
+
+    def getdescr(self):
+        return None
         
 class InputArgInt(IntOp, AbstractInputArg):
     def __init__(self, intval):


More information about the pypy-commit mailing list