Author: Maciej Fijalkowski <[email protected]>
Branch: optresult
Changeset: r77910:f03f53422028
Date: 2015-06-05 15:12 +0200
http://bitbucket.org/pypy/pypy/changeset/f03f53422028/
Log: the specialization seems to be an overkill
diff --git a/rpython/jit/backend/llsupport/rewrite.py
b/rpython/jit/backend/llsupport/rewrite.py
--- a/rpython/jit/backend/llsupport/rewrite.py
+++ b/rpython/jit/backend/llsupport/rewrite.py
@@ -86,20 +86,24 @@
return op
def emit_op(self, op):
+ op = self.get_box_replacement(op)
+ orig_op = op
+ replaced = False
+ for i in range(op.numargs()):
+ orig_arg = op.getarg(i)
+ arg = self.get_box_replacement(orig_arg)
+ if orig_arg is not arg:
+ if not replaced:
+ op = op.copy_and_change(op.getopnum())
+ orig_op.set_forwarded(op)
+ replaced = True
+ op.setarg(i, arg)
if op.is_guard():
- newop = op.get_replacement_for_rewrite()
- if newop is op:
- newop = op.copy_and_change(op.getopnum())
- op.set_forwarded(newop)
- _newfailargs = []
- for arg in op.getfailargs():
- if arg is not None:
- arg = arg.get_replacement_for_rewrite()
- _newfailargs.append(arg)
- newop.setfailargs(_newfailargs)
- op = newop
- else:
- op = op.get_replacement_for_rewrite()
+ if not replaced:
+ op = op.copy_and_change(op.getopnum())
+ orig_op.set_forwarded(op)
+ op.setfailargs([self.get_box_replacement(a, True)
+ for a in op.getfailargs()])
self._newops.append(op)
def replace_op_with(self, op, newop):
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
@@ -204,9 +204,6 @@
def constbox(self):
return self
- def get_replacement_for_rewrite(self):
- return self
-
def same_box(self, other):
return self.same_constant(other)
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
@@ -24,9 +24,6 @@
def get_forwarded(self):
return None
- def get_replacement(self):
- return self
-
def set_forwarded(self, forwarded_to):
raise Exception("oups")
@@ -77,11 +74,6 @@
def get_forwarded(self):
return self._forwarded
- def get_replacement(self):
- if self._forwarded:
- return self._forwarded.get_replacement()
- return self
-
def set_forwarded(self, forwarded_to):
self._forwarded = forwarded_to
@@ -427,12 +419,6 @@
def get_forwarded(self):
return self._forwarded
- # this is for rewrite.py, we can have several versions depending on
- # invariants
- def get_replacement_for_rewrite(self):
- assert self._forwarded is None
- return self
-
def set_forwarded(self, forwarded_to):
self._forwarded = forwarded_to
@@ -478,9 +464,6 @@
def initarglist(self, args):
assert len(args) == 0
- def get_replacement_for_rewrite(self):
- return self.get_replacement()
-
def getarglist(self):
return []
@@ -502,19 +485,6 @@
assert len(args) == 1
self._arg0, = args
- def get_replacement_for_rewrite(self):
- if self._forwarded:
- return self._forwarded.get_replacement_for_rewrite()
- arg0 = self._arg0.get_replacement()
- if arg0 is not self._arg0:
- op = self.__class__()
- if isinstance(self, ResOpWithDescr):
- op.setdescr(self.getdescr())
- op._arg0 = arg0
- self.set_forwarded(op)
- return op
- return self
-
def getarglist(self):
return [self._arg0]
@@ -562,21 +532,6 @@
else:
raise IndexError
- def get_replacement_for_rewrite(self):
- if self._forwarded:
- return self._forwarded.get_replacement_for_rewrite()
- arg0 = self._arg0.get_replacement()
- arg1 = self._arg1.get_replacement()
- if arg0 is not self._arg0 or arg1 is not self._arg1:
- op = self.__class__()
- if isinstance(self, ResOpWithDescr):
- op.setdescr(self.getdescr())
- op._arg0 = arg0
- op._arg1 = arg1
- self.set_forwarded(op)
- return op
- return self
-
def getarglist(self):
return [self._arg0, self._arg1]
@@ -607,24 +562,6 @@
else:
raise IndexError
- def get_replacement_for_rewrite(self):
- if self._forwarded:
- return self._forwarded.get_replacement_for_rewrite()
- arg0 = self._arg0.get_replacement()
- arg1 = self._arg1.get_replacement()
- arg2 = self._arg2.get_replacement()
- if (arg0 is not self._arg0 or arg1 is not self._arg1 or
- arg2 is not self._arg2):
- op = self.__class__()
- if isinstance(self, ResOpWithDescr):
- op.setdescr(self.getdescr())
- op._arg0 = arg0
- op._arg1 = arg1
- op._arg2 = arg2
- self.set_forwarded(op)
- return op
- return self
-
def setarg(self, i, box):
if i == 0:
self._arg0 = box
@@ -646,21 +583,6 @@
self.__class__.__name__.startswith('FINISH'): # XXX remove me
assert len(args) <= 1 # FINISH operations take 0 or 1 arg now
- def get_replacement_for_rewrite(self):
- if self._forwarded:
- return self._forwarded.get_replacement_for_rewrite()
- for arg in self._args:
- if arg is not arg.get_replacement():
- break
- else:
- return self
- op = self.__class__()
- self.set_forwarded(op)
- op._args = [arg.get_replacement() for arg in self._args]
- if isinstance(self, ResOpWithDescr):
- op.setdescr(self.getdescr())
- return op
-
def getarglist(self):
return self._args
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit