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