Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r74902:c9f5a43ea3c1
Date: 2014-12-12 18:39 +0200
http://bitbucket.org/pypy/pypy/changeset/c9f5a43ea3c1/

Log:    small progress

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
@@ -847,6 +847,7 @@
     calls back the interpreter.  Used temporarily: a fully compiled
     version of the code may end up replacing it.
     """
+    xxx
     jitcell_token = make_jitcell_token(jitdriver_sd)
     nb_red_args = jitdriver_sd.num_red_args
     assert len(redargtypes) == nb_red_args
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
@@ -185,7 +185,7 @@
                 for op in target_token.exported_state.inputarg_setup_ops:
                     debug_print('    ' + self.repr_of_resop(op))
 
-    def _log_operations(self, inputargs, operations, ops_offset):
+    def _log_operations(self, inputargs, operations, ops_offset=None):
         if not have_debug_prints():
             return
         if ops_offset is None:
diff --git a/rpython/jit/metainterp/optimizeopt/heap.py 
b/rpython/jit/metainterp/optimizeopt/heap.py
--- a/rpython/jit/metainterp/optimizeopt/heap.py
+++ b/rpython/jit/metainterp/optimizeopt/heap.py
@@ -161,7 +161,7 @@
                     getop = ResOperation(rop.GETARRAYITEM_GC, [op.getarg(0), 
op.getarg(1)],
                                          result, op.getdescr())
                     shortboxes.add_potential(getop, synthetic=True)
-                elif op.result is not None:
+                elif op.type != 'v':
                     xxxx
                     shortboxes.add_potential(op)
 
diff --git a/rpython/jit/metainterp/optimizeopt/optimizer.py 
b/rpython/jit/metainterp/optimizeopt/optimizer.py
--- a/rpython/jit/metainterp/optimizeopt/optimizer.py
+++ b/rpython/jit/metainterp/optimizeopt/optimizer.py
@@ -1,11 +1,13 @@
 from rpython.jit.metainterp import jitprof, resume, compile
 from rpython.jit.metainterp.executor import execute_nonspec_const
+from rpython.jit.metainterp.logger import LogOperations
 from rpython.jit.metainterp.history import Const, ConstInt, REF
 from rpython.jit.metainterp.optimizeopt.intutils import IntBound, 
IntUnbounded, \
                                                      ImmutableIntUnbounded, \
                                                      IntLowerBound, MININT, 
MAXINT
 from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method
-from rpython.jit.metainterp.resoperation import rop, ResOperation, 
AbstractResOp
+from rpython.jit.metainterp.resoperation import rop, ResOperation,\
+     AbstractResOp, AbstractInputArg, DONT_CHANGE
 from rpython.jit.metainterp.typesystem import llhelper
 from rpython.tool.pairtype import extendabletype
 from rpython.rlib.debug import debug_print
@@ -375,6 +377,7 @@
         self.metainterp_sd = metainterp_sd
         self.cpu = metainterp_sd.cpu
         self.loop = loop
+        self.logops = LogOperations(metainterp_sd, False)
         self.values = {}
         self.interned_refs = self.cpu.ts.new_ref_dict()
         self.interned_ints = {}
@@ -506,8 +509,15 @@
 
     def replace_op_with(self, op, newopnum, args=None, descr=None):
         v = self.getvalue(op)
-        newop = op.copy_and_change(newopnum, args=args, descr=descr)
-        v.box = newop
+        if isinstance(op, AbstractInputArg):
+            if descr is DONT_CHANGE:
+                descr = None
+            newop = ResOperation(newopnum, args, descr)
+            newop.source_op = op
+        else:
+            newop = op.copy_and_change(newopnum, args=args, descr=descr)
+        if v.box is op: # don't replace if it's already replaced
+            v.box = newop
         return newop
 
     def make_constant_int(self, box, intvalue):
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
@@ -586,10 +586,10 @@
         self.pure(rop.CAST_PTR_TO_INT, [op], op.getarg(0))
         self.emit_operation(op)
 
-    def optimize_SAME_AS_i(self, op):
-        self.make_equal_to(op.result, self.getvalue(op.getarg(0)))
-    optimize_SAME_AS_r = optimize_SAME_AS_i
-    optimize_SAME_AS_f = optimize_SAME_AS_i
+    def optimize_SAME_AS_I(self, op):
+        self.make_equal_to(op, self.getvalue(op.getarg(0)))
+    optimize_SAME_AS_R = optimize_SAME_AS_I
+    optimize_SAME_AS_F = optimize_SAME_AS_I
 
 dispatch_opt = make_dispatcher_method(OptRewrite, 'optimize_',
         default=OptRewrite.emit_operation)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py 
b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_optimizeopt.py
@@ -256,14 +256,14 @@
         ops = """
         [i0]
         p0 = new_with_vtable(ConstClass(node_vtable))
-        escape(p0)
+        escape_n(p0)
         guard_class(p0, ConstClass(node_vtable)) []
         jump(i0)
         """
         expected = """
         [i0]
         p0 = new_with_vtable(ConstClass(node_vtable))
-        escape(p0)
+        escape_n(p0)
         jump(i0)
         """
         self.optimize_loop(ops, expected)
@@ -271,7 +271,7 @@
     def test_remove_guard_class_constant(self):
         ops = """
         [i0]
-        p0 = same_as(ConstPtr(myptr))
+        p0 = same_as_r(ConstPtr(myptr))
         guard_class(p0, ConstClass(node_vtable)) []
         jump(i0)
         """
@@ -368,19 +368,19 @@
     def test_remove_consecutive_guard_value_constfold(self):
         ops = """
         []
-        i0 = escape()
+        i0 = escape_i()
         guard_value(i0, 0) []
         i1 = int_add(i0, 1)
         guard_value(i1, 1) []
         i2 = int_add(i1, 2)
-        escape(i2)
+        escape_n(i2)
         jump()
         """
         expected = """
         []
-        i0 = escape()
+        i0 = escape_i()
         guard_value(i0, 0) []
-        escape(3)
+        escape_n(3)
         jump()
         """
         self.optimize_loop(ops, expected)
diff --git a/rpython/jit/metainterp/optimizeopt/test/test_util.py 
b/rpython/jit/metainterp/optimizeopt/test/test_util.py
--- a/rpython/jit/metainterp/optimizeopt/test/test_util.py
+++ b/rpython/jit/metainterp/optimizeopt/test/test_util.py
@@ -1,5 +1,6 @@
 import py, random
 
+from rpython.rlib.debug import debug_print
 from rpython.rtyper.lltypesystem import lltype, llmemory, rffi
 from rpython.rtyper import rclass
 from rpython.rtyper.rclass import (
@@ -10,6 +11,7 @@
                                             JitCellToken, TargetToken)
 from rpython.jit.metainterp.optimizeopt.util import sort_descrs, equaloplists
 from rpython.jit.codewriter.effectinfo import EffectInfo
+from rpython.jit.metainterp.logger import LogOperations
 from rpython.jit.codewriter.heaptracker import register_known_gctype
 from rpython.jit.tool.oparser import parse, pure_parse
 from rpython.jit.metainterp.quasiimmut import QuasiImmutDescr
@@ -406,6 +408,8 @@
         optimize_trace(metainterp_sd, loop, self.enable_opts)
 
     def unroll_and_optimize(self, loop, call_pure_results=None):
+        metainterp_sd = FakeMetaInterpStaticData(self.cpu)
+        logops = LogOperations(metainterp_sd, False)
         self.add_guard_future_condition(loop)
         operations =  loop.operations
         jumpop = operations[-1]
@@ -435,11 +439,18 @@
                           [ResOperation(rop.JUMP, [memo.get(a, a) for a in 
jump_args],
                                         descr=token)]
                           #[inliner.inline_op(jumpop)]
+        
         assert loop.operations[-1].getopnum() == rop.JUMP
         assert loop.operations[0].getopnum() == rop.LABEL
         loop.inputargs = loop.operations[0].getarglist()
 
+        
+        debug_print("   noopt loop")
+        logops._log_operations(loop.inputargs, loop.operations)
+        
         self._do_optimize_loop(loop, call_pure_results)
+        debug_print("   opt loop")
+        logops._log_operations(loop.inputargs, loop.operations)
         extra_same_as = []
         while loop.operations[0].getopnum() != rop.LABEL:
             extra_same_as.append(loop.operations[0])
diff --git a/rpython/jit/metainterp/optimizeopt/unroll.py 
b/rpython/jit/metainterp/optimizeopt/unroll.py
--- a/rpython/jit/metainterp/optimizeopt/unroll.py
+++ b/rpython/jit/metainterp/optimizeopt/unroll.py
@@ -2,12 +2,14 @@
 
 from rpython.jit.metainterp.compile import Memo
 from rpython.jit.metainterp.history import TargetToken, JitCellToken, Const
+from rpython.jit.metainterp.logger import LogOperations
 from rpython.jit.metainterp.optimize import InvalidLoop
 from rpython.jit.metainterp.optimizeopt.generalize import KillHugeIntBounds
 from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer, 
Optimization
 from rpython.jit.metainterp.optimizeopt.virtualstate import 
(VirtualStateConstructor,
         ShortBoxes, BadVirtualState, VirtualStatesCantMatch)
-from rpython.jit.metainterp.resoperation import rop, ResOperation
+from rpython.jit.metainterp.resoperation import rop, ResOperation, 
DONT_CHANGE,\
+     OpHelpers, AbstractInputArg
 from rpython.jit.metainterp.resume import Snapshot
 from rpython.rlib.debug import debug_print, debug_start, debug_stop
 
@@ -183,7 +185,10 @@
             if values[i].is_virtual():
                 srcbox = values[i].force_box(self.optimizer)
             if original_jump_args[i] is not srcbox:
-                op = ResOperation(rop.SAME_AS, [srcbox], original_jump_args[i])
+                opnum = OpHelpers.same_as_for_type(original_jump_args[i].type)
+                op = self.optimizer.replace_op_with(original_jump_args[i],
+                                                    opnum, [srcbox],
+                                                    descr=DONT_CHANGE)
                 self.optimizer.emit_operation(op)
         inputarg_setup_ops = self.optimizer.get_newoperations()
 
@@ -197,12 +202,11 @@
         for box in inputargs:
             exported_values[box] = self.optimizer.getvalue(box)
         for op in short_boxes.operations():
-            if op and op.result:
-                box = op.result
-                exported_values[box] = self.optimizer.getvalue(box)
+            if op and op.type != 'v':
+                exported_values[op] = self.optimizer.getvalue(op)
 
-        target_token.exported_state = ExportedState(short_boxes, 
inputarg_setup_ops,
-                                                    exported_values)
+        es = ExportedState(short_boxes, inputarg_setup_ops, exported_values)
+        target_token.exported_state = es
 
     def import_state(self, targetop):
         if not targetop: # Trace did not start with a label
@@ -245,20 +249,21 @@
         seen = {}
         for op in self.short_boxes.operations():
             self.ensure_short_op_emitted(op, self.optimizer, seen)
-            if op and op.result:
-                preamble_value = exported_state.exported_values[op.result]
-                value = self.optimizer.getvalue(op.result)
+            if op and op.type != 'v':
+                preamble_value = exported_state.exported_values[op]
+                value = self.optimizer.getvalue(op)
                 if not value.is_virtual() and not value.is_constant():
                     imp = ValueImporter(self, preamble_value, op)
                     self.optimizer.importable_values[value] = imp
-                newvalue = self.optimizer.getvalue(op.result)
+                newvalue = self.optimizer.getvalue(op)
                 newresult = newvalue.get_key_box()
                 # note that emitting here SAME_AS should not happen, but
                 # in case it does, we would prefer to be suboptimal in asm
                 # to a fatal RPython exception.
-                if newresult is not op.result and \
+                if newresult is not op and \
                    not self.short_boxes.has_producer(newresult) and \
                    not newvalue.is_constant():
+                    xxx
                     op = ResOperation(rop.SAME_AS, [op.result], newresult)
                     self.optimizer._newoperations.append(op)
                     #if self.optimizer.loop.logops:
@@ -395,7 +400,7 @@
             if a in boxmap:
                 newargs[i] = boxmap[a]
             else:
-                newargs[i] = a.clonebox()
+                newargs[i] = a.clone_input_arg()
                 boxmap[a] = newargs[i]
         memo = Memo(short_inputargs, newargs)
         target_token.assumed_classes = {}
@@ -417,10 +422,10 @@
     def ensure_short_op_emitted(self, op, optimizer, seen):
         if op is None:
             return
-        if op.result is not None and op.result in seen:
+        if op.type != 'v' and op in seen:
             return
         for a in op.getarglist():
-            if not isinstance(a, Const) and a not in seen:
+            if not isinstance(a, Const) and not isinstance(a, 
AbstractInputArg) and a not in seen:
                 self.ensure_short_op_emitted(self.short_boxes.producer(a), 
optimizer,
                                              seen)
 
@@ -429,15 +434,15 @@
         #                self.optimizer.loop.logops.repr_of_resop(op))
 
         optimizer.send_extra_operation(op)
-        seen[op.result] = None
+        seen[op] = None
         if op.is_ovf():
-            guard = ResOperation(rop.GUARD_NO_OVERFLOW, [], None)
+            guard = ResOperation(rop.GUARD_NO_OVERFLOW, [])
             optimizer.send_extra_operation(guard)
 
     def add_op_to_short(self, op, emit=True, guards_needed=False):
         if op is None:
             return None
-        if op.result is not None and op.result in self.short_seen:
+        if op is not None and op in self.short_seen:
             if emit and self.short_inliner:
                 return self.short_inliner.inline_arg(op.result)
             else:
@@ -609,3 +614,14 @@
         self.short_boxes = short_boxes
         self.inputarg_setup_ops = inputarg_setup_ops
         self.exported_values = exported_values
+
+    def dump(self):
+        debug_start("jit-exported-state")
+        logops = LogOperations()
+        debug_print("   inputarg setup")
+        logops._log_operations(self.inputarg_setup_ops)
+        debug_print("   short boxes")
+        self.short_boxes.dump(logops)
+        debug_print("   exported values")
+        self.exported_values.dump(logops)
+        debug_stop("jit-exported-state")
diff --git a/rpython/jit/metainterp/optimizeopt/virtualstate.py 
b/rpython/jit/metainterp/optimizeopt/virtualstate.py
--- a/rpython/jit/metainterp/optimizeopt/virtualstate.py
+++ b/rpython/jit/metainterp/optimizeopt/virtualstate.py
@@ -1,13 +1,15 @@
 from rpython.jit.metainterp.walkvirtual import VirtualVisitor
-from rpython.jit.metainterp.history import (BoxInt, ConstInt, BoxPtr, Const,
+from rpython.jit.metainterp.history import (ConstInt, Const,
         ConstPtr, ConstFloat)
 from rpython.jit.metainterp.optimizeopt import virtualize
 from rpython.jit.metainterp.optimizeopt.intutils import IntUnbounded
 from rpython.jit.metainterp.optimizeopt.optimizer import (LEVEL_CONSTANT,
     LEVEL_KNOWNCLASS, LEVEL_NONNULL, LEVEL_UNKNOWN, OptValue)
-from rpython.jit.metainterp.resoperation import rop, ResOperation
+from rpython.jit.metainterp.resoperation import rop, ResOperation,\
+     AbstractInputArg
+from rpython.jit.metainterp.compile import Memo
 from rpython.rlib.debug import debug_start, debug_stop, debug_print
-from rpython.rlib.objectmodel import we_are_translated, import_from_mixin
+from rpython.rlib.objectmodel import we_are_translated
 
 
 class BadVirtualState(Exception):
@@ -589,7 +591,7 @@
         self.potential_ops = {}
         self.alternatives = {}
         self.synthetic = {}
-        self.rename = {}
+        self.memo = Memo()
         self.optimizer = optimizer
         self.availible_boxes = availible_boxes
         self.assumed_classes = {}
@@ -602,9 +604,9 @@
             self.short_boxes = {}
             self.short_boxes_in_production = {}
 
-            for box in self.potential_ops.keys():
+            for op in self.potential_ops.keys():
                 try:
-                    self.produce_short_preamble_box(box)
+                    self.produce_short_preamble_op(op)
                 except BoxNotProducable:
                     pass
 
@@ -614,7 +616,7 @@
 
     def prioritized_alternatives(self, box):
         if box not in self.alternatives:
-            return [self.potential_ops[box]]
+            return [box]
         alts = self.alternatives[box]
         hi, lo = 0, len(alts) - 1
         while hi < lo:
@@ -628,16 +630,10 @@
                 lo -= 1
         return alts
 
-    def renamed(self, box):
-        if box in self.rename:
-            return self.rename[box]
-        return box
-
     def add_to_short(self, box, op):
         if op:
-            op = op.clone()
-            for i in range(op.numargs()):
-                op.setarg(i, self.renamed(op.getarg(i)))
+            op = op.clone(self.memo)
+            op.is_source_op = True
         if box in self.short_boxes:
             if op is None:
                 oldop = self.short_boxes[box].clone()
@@ -656,30 +652,30 @@
         else:
             self.short_boxes[box] = op
 
-    def produce_short_preamble_box(self, box):
-        if box in self.short_boxes:
+    def produce_short_preamble_op(self, op):
+        if op in self.short_boxes:
             return
-        if isinstance(box, Const):
+        if isinstance(op, Const) or isinstance(op, AbstractInputArg):
             return
-        if box in self.short_boxes_in_production:
+        if op in self.short_boxes_in_production:
             raise BoxNotProducable
-        if self.availible_boxes is not None and box not in 
self.availible_boxes:
+        if self.availible_boxes is not None and op not in self.availible_boxes:
             raise BoxNotProducable
-        self.short_boxes_in_production[box] = None
+        self.short_boxes_in_production[op] = None
 
-        if box in self.potential_ops:
-            ops = self.prioritized_alternatives(box)
+        if op in self.potential_ops:
+            ops = self.prioritized_alternatives(op)
             produced_one = False
-            for op in ops:
+            for newop in ops:
                 try:
-                    if op:
-                        for arg in op.getarglist():
-                            self.produce_short_preamble_box(arg)
+                    if newop:
+                        for arg in newop.getarglist():
+                            self.produce_short_preamble_op(arg)
                 except BoxNotProducable:
                     pass
                 else:
                     produced_one = True
-                    self.add_to_short(box, op)
+                    self.add_to_short(op, newop)
             if not produced_one:
                 raise BoxNotProducable
         else:
@@ -693,10 +689,10 @@
                 if classbox:
                     self.assumed_classes[op] = classbox
         if op not in self.potential_ops:
-            self.potential_ops[op] = op
+            self.potential_ops[op] = None
         else:
             if op not in self.alternatives:
-                self.alternatives[op] = [self.potential_ops[op]]
+                self.alternatives[op] = [op]
             self.alternatives[op].append(op)
         if synthetic:
             self.synthetic[op] = True
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
@@ -387,19 +387,31 @@
 
     def getdescr(self):
         return None
-        
+
+    def forget_value(self):
+        pass
+    
 class InputArgInt(IntOp, AbstractInputArg):
     def __init__(self, intval=0):
-        self.setint(intval)            
+        self.setint(intval)
+
+    def clone_input_arg(self):
+        return InputArgInt()
 
 class InputArgFloat(FloatOp, AbstractInputArg):
     def __init__(self, f=0.0):
         self.setfloatstorage(f)
 
+    def clone_input_arg(self):
+        return InputArgFloat()
+
 class InputArgRef(RefOp, AbstractInputArg):
     def __init__(self, r=lltype.nullptr(llmemory.GCREF.TO)):
         self.setref_base(r)
 
+    def clone_input_arg(self):
+        return InputArgRef()
+
 # ============
 # arity mixins
 # ============
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to