Author: Maciej Fijalkowski <[email protected]>
Branch: optresult-unroll
Changeset: r78576:677da62dbd4f
Date: 2015-07-17 11:48 +0200
http://bitbucket.org/pypy/pypy/changeset/677da62dbd4f/
Log: detect recursion
diff --git a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
--- a/rpython/jit/metainterp/optimizeopt/shortpreamble.py
+++ b/rpython/jit/metainterp/optimizeopt/shortpreamble.py
@@ -27,6 +27,7 @@
optimizer.produce_potential_short_preamble_ops(self)
short_boxes = []
+ self.boxes_in_production = {}
for op, getfield_op in self.potential_ops.items():
self.add_op_to_short(op, getfield_op)
@@ -51,6 +52,8 @@
def produce_arg(self, op):
if op in self.produced_short_boxes:
return self.produced_short_boxes[op][1]
+ elif op in self.boxes_in_production:
+ return None
elif isinstance(op, Const):
return op
elif op in self.potential_ops:
@@ -59,21 +62,25 @@
return None
def add_op_to_short(self, op, sop):
- if sop:
- preamble_arg = self.produce_arg(sop.getarg(0))
- if preamble_arg is None:
- return None
- preamble_op = ResOperation(sop.getopnum(), [preamble_arg],
- descr=sop.getdescr())
- else:
- arglist = []
- for arg in op.getarglist():
- newarg = self.produce_arg(arg)
- if newarg is None:
+ self.boxes_in_production[op] = None
+ try:
+ if sop:
+ preamble_arg = self.produce_arg(sop.getarg(0))
+ if preamble_arg is None:
return None
- arglist.append(newarg)
- preamble_op = op.copy_and_change(op.getopnum(), args=arglist)
- self.produced_short_boxes[op] = (sop, preamble_op)
+ preamble_op = ResOperation(sop.getopnum(), [preamble_arg],
+ descr=sop.getdescr())
+ else:
+ arglist = []
+ for arg in op.getarglist():
+ newarg = self.produce_arg(arg)
+ if newarg is None:
+ return None
+ arglist.append(newarg)
+ preamble_op = op.copy_and_change(op.getopnum(), args=arglist)
+ self.produced_short_boxes[op] = (sop, preamble_op)
+ finally:
+ del self.boxes_in_production[op]
return preamble_op
def add_pure_op(self, op):
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit