Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78509:9ab23edf0d53
Date: 2015-07-09 15:42 +0200
http://bitbucket.org/pypy/pypy/changeset/9ab23edf0d53/
Log: expansion misses some adjustments after refactoring
diff --git a/rpython/jit/backend/x86/regalloc.py
b/rpython/jit/backend/x86/regalloc.py
--- a/rpython/jit/backend/x86/regalloc.py
+++ b/rpython/jit/backend/x86/regalloc.py
@@ -307,29 +307,32 @@
def locs_for_fail(self, guard_op):
faillocs = []
descr = guard_op.getdescr()
- for v in guard_op.getfailargs():
- if v is None:
+ for arg in guard_op.getfailargs():
+ if arg is None:
+ faillocs.append(None)
continue
- accum = v.getaccum()
+ accum = arg.getaccum()
if accum:
- loc = self.loc(accum.getvar())
- self.update_accumulation_loc(v, descr)
+ loc = self.loc(accum.getoriginalbox())
faillocs.append(loc)
+ self.update_accumulation_loc(arg, accum, descr)
else:
- faillocs.append(self.loc(v))
+ faillocs.append(self.loc(arg))
return faillocs
- def update_accumulation_loc(self, box, accum, descr):
- """ Saves the location to the AccumInfo object.
- Necessary to reconstruct the values at a guard exit.
+ def update_accumulation_loc(self, arg, accum, descr):
"""
- box = accumbox.scalar_var
+ Faillocs saved on the guard can only represent one value.
+ Accumulation has the accumulation box which need to updated uppon
+ guard exit. The fail descr saves where (regloc) the accumulator
+ is located.
+ """
assert isinstance(descr, ResumeGuardDescr)
accum_info = descr.rd_accum_list
while accum_info:
- if accum_info.box is box:
- accum_info.loc = self.loc(accumbox)
+ if accum_info.box is accum.getoriginalbox():
+ accum_info.loc = self.loc(arg)
break
accum_info = accum_info.prev
else:
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
@@ -551,6 +551,8 @@
return True
def save_to_descr(self, descr, position):
+ from rpython.jit.metainterp.compile import ResumeGuardDescr
+ from rpython.jit.metainterp.resume import AccumInfo
assert isinstance(descr,ResumeGuardDescr)
ai = AccumInfo(descr.rd_accum_list, position, self.operator, self.var)
descr.rd_accum_list = ai
@@ -732,6 +734,16 @@
def repr_of_descr(self):
return 'TargetToken(%d)' % compute_unique_id(self)
+def index_of_first(opnum, operations):
+ """ returns the position of the first operation matching the opnum.
+ Or -1 if non is found
+ """
+ for i,op in enumerate(operations):
+ if op.getopnum() == opnum:
+ return i
+ return -1
+
+
class LoopVersion(object):
def __init__(self, operations, opt_ops, aligned=False):
@@ -739,16 +751,14 @@
self.aligned = aligned
self.faildescrs = []
#
- i = 0
- label = self.operations[i]
- while i < len(self.operations):
- label = self.operations[i]
- if label.getopnum() == rop.LABEL:
- break
- i += 1
- assert label.getopnum() == rop.LABEL
- self.label_pos = i
+ idx = index_of_first(rop.LABEL, operations)
+ assert idx >= 0
+ label = operations[idx]
+ self.label_pos = idx
self.inputargs = label.getarglist()
+ idx = index_of_first(rop.LABEL, opt_ops)
+ assert idx >= 0
+ version_failargs = opt_ops[idx].getarglist()
for op in opt_ops:
if op.is_guard():
descr = op.getdescr()
@@ -758,12 +768,9 @@
# if there are more possibilites, let the descr
# know which loop version he preferes
self.faildescrs.append(descr)
- op.setfailargs(self.inputargs)
+ op.setfailargs(version_failargs)
op.rd_snapshot = None
- def adddescr(self, op, descr):
- self.faildescrs.append((op, descr))
-
def update_token(self, jitcell_token):
label = self.operations[self.label_pos]
jump = self.operations[-1]
@@ -820,10 +827,7 @@
def find_first_index(self, opnum):
""" return the first operation having the same opnum or -1 """
- for i,op in enumerate(self.operations):
- if op.getopnum() == opnum:
- return i
- return -1
+ return index_of_first(opnum, self.operations)
def get_display_text(self): # for graphpage.py
return self.name + '\n' + repr(self.inputargs)
diff --git a/rpython/jit/metainterp/optimizeopt/util.py
b/rpython/jit/metainterp/optimizeopt/util.py
--- a/rpython/jit/metainterp/optimizeopt/util.py
+++ b/rpython/jit/metainterp/optimizeopt/util.py
@@ -213,15 +213,13 @@
return True
def rename_failargs(self, guard, clone=False):
- from rpython.jit.metainterp.compile import ResumeGuardDescr
if guard.getfailargs() is not None:
if clone:
args = guard.getfailargs()[:]
else:
args = guard.getfailargs()
for i,arg in enumerate(args):
- value = self.rename_map.get(arg,arg)
- args[i] = value
+ args[i] = self.rename_map.get(arg,arg)
return args
return None
diff --git a/rpython/jit/metainterp/optimizeopt/vectorize.py
b/rpython/jit/metainterp/optimizeopt/vectorize.py
--- a/rpython/jit/metainterp/optimizeopt/vectorize.py
+++ b/rpython/jit/metainterp/optimizeopt/vectorize.py
@@ -8,14 +8,14 @@
import py
import time
-from rpython.jit.metainterp.resume import Snapshot, AccumInfo
+from rpython.jit.metainterp.resume import Snapshot
from rpython.jit.metainterp.jitexc import NotAVectorizeableLoop,
NotAProfitableLoop
from rpython.jit.metainterp.optimizeopt.unroll import optimize_unroll
from rpython.jit.metainterp.compile import (ResumeAtLoopHeaderDescr,
CompileLoopVersionDescr, invent_fail_descr_for_op, ResumeGuardDescr)
from rpython.jit.metainterp.history import (ConstInt, VECTOR, FLOAT, INT,
BoxVector, BoxFloat, BoxInt, ConstFloat, TargetToken, JitCellToken,
Box,
- LoopVersion, Accum)
+ LoopVersion, Accum, AbstractFailDescr)
from rpython.jit.metainterp.optimizeopt.optimizer import Optimizer,
Optimization
from rpython.jit.metainterp.optimizeopt.util import make_dispatcher_method,
Renamer
from rpython.jit.metainterp.optimizeopt.dependency import (DependencyGraph,
@@ -246,15 +246,13 @@
target_guard = copied_op
copied_op.setdescr(copy_fail_descr(copied_op, self))
descr = target_guard.getdescr()
- exits_early = descr.guard_opnum == rop.GUARD_EARLY_EXIT
- if not exits_early:
- # copy failargs/snapshot
- copied_op.rd_snapshot = \
- renamer.rename_rd_snapshot(copied_op.rd_snapshot,
- clone=True)
- renamed_failargs = \
- renamer.rename_failargs(copied_op, clone=True)
- copied_op.setfailargs(renamed_failargs)
+ # copy failargs/snapshot
+ copied_op.rd_snapshot = \
+ renamer.rename_rd_snapshot(copied_op.rd_snapshot,
+ clone=True)
+ renamed_failargs = \
+ renamer.rename_failargs(copied_op, clone=True)
+ copied_op.setfailargs(renamed_failargs)
#
self.emit_unrolled_operation(copied_op)
@@ -449,7 +447,6 @@
assert False
def schedule(self, vector=False):
- self.guard_early_exit = -1
self.clear_newoperations()
sched_data = VecScheduleData(self.cpu.vector_register_size,
self.costmodel)
scheduler = Scheduler(self.dependency_graph, sched_data)
@@ -838,7 +835,6 @@
if not pack.is_accumulating():
continue
accum = pack.accum
- pack.accum = None
# create a new vector box for the parameters
box = pack.input_type.new_vector_box()
size = vec_reg_size // pack.input_type.getsize()
@@ -866,4 +862,6 @@
# rename the variable with the box
sched_data.setvector_of_box(accum.getoriginalbox(), 0, result) #
prevent it from expansion
renamer.start_renaming(accum.getoriginalbox(), result)
+ if not we_are_translated():
+ print "renaming accum", accum.getoriginalbox(), "->", result
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit