Author: Richard Plangger <[email protected]>
Branch: vecopt
Changeset: r78695:fce17b8ec26a
Date: 2015-07-28 17:02 +0200
http://bitbucket.org/pypy/pypy/changeset/fce17b8ec26a/
Log: restricted the test environment, loop versioning only works
resumedescr (not basicfaildescr) rawstart is now saved to the loop
token to be more easily reconstructed when mc and datablockwrappers
are removed from the assembler
diff --git a/rpython/jit/backend/llgraph/runner.py
b/rpython/jit/backend/llgraph/runner.py
--- a/rpython/jit/backend/llgraph/runner.py
+++ b/rpython/jit/backend/llgraph/runner.py
@@ -258,6 +258,9 @@
self.stats = stats or MiniStats()
self.vinfo_for_tests = kwds.get('vinfo_for_tests', None)
+ def stitch_bridge(self, faildescr, jitcell_token):
+ pass
+
def compile_loop(self, inputargs, operations, looptoken, jd_id=0,
unique_id=0, log=True, name='', logger=None):
clt = model.CompiledLoopToken(self, looptoken.number)
@@ -868,17 +871,23 @@
def fail_guard(self, descr, saved_data=None):
values = []
- for box in self.current_op.getfailargs():
+ for i,box in enumerate(self.current_op.getfailargs()):
if box is not None:
value = self.env[box]
else:
value = None
- if box and box.getaccum():
- if box.getaccum().operator == '+':
+ accum = descr.rd_accum_list
+ while accum != None:
+ if accum.position != i:
+ accum = accum.prev
+ continue
+ if accum.operation == '+':
value = sum(value)
- elif box.getaccum().operator == '*':
+ break
+ elif accum.operation == '*':
def prod(acc, x): return acc * x
value = reduce(prod, value, 1)
+ break
else:
raise NotImplementedError("accum operator in fail guard")
values.append(value)
diff --git a/rpython/jit/backend/llsupport/assembler.py
b/rpython/jit/backend/llsupport/assembler.py
--- a/rpython/jit/backend/llsupport/assembler.py
+++ b/rpython/jit/backend/llsupport/assembler.py
@@ -35,6 +35,7 @@
self.exc = exc
self.is_guard_not_invalidated = is_guard_not_invalidated
self.is_guard_not_forced = is_guard_not_forced
+ self.rawstart = 0
def compute_gcmap(self, gcmap, failargs, fail_locs, frame_depth):
# note that regalloc has a very similar compute, but
diff --git a/rpython/jit/backend/x86/assembler.py
b/rpython/jit/backend/x86/assembler.py
--- a/rpython/jit/backend/x86/assembler.py
+++ b/rpython/jit/backend/x86/assembler.py
@@ -503,6 +503,7 @@
full_size = self.mc.get_relative_pos()
#
rawstart = self.materialize_loop(looptoken)
+ looptoken.rawstart = rawstart
self.patch_stack_checks(frame_depth_no_fixed_size +
JITFRAME_FIXED_SIZE,
rawstart)
looptoken._ll_loop_code = looppos + rawstart
@@ -590,8 +591,8 @@
return AsmInfo(ops_offset, startpos + rawstart, codeendpos - startpos)
def stitch_bridge(self, faildescr, token):
- rawstart = self.materialize_loop(token)
- self.patch_jump_for_descr(faildescr, rawstart)
+ assert token.rawstart != 0
+ self.patch_jump_for_descr(faildescr, token.rawstart)
def write_pending_failure_recoveries(self, regalloc):
# for each pending guard, generate the code of the recovery stub
diff --git a/rpython/jit/backend/x86/vector_ext.py
b/rpython/jit/backend/x86/vector_ext.py
--- a/rpython/jit/backend/x86/vector_ext.py
+++ b/rpython/jit/backend/x86/vector_ext.py
@@ -1,4 +1,5 @@
import py
+from rpython.jit.metainterp.compile import ResumeGuardDescr
from rpython.jit.metainterp.history import (Box, Const, ConstInt, ConstPtr,
ConstFloat, BoxInt, BoxFloat, BoxVector, INT, REF,
FLOAT, VECTOR, TargetToken)
@@ -65,6 +66,8 @@
def _accum_update_at_exit(self, fail_locs, fail_args, faildescr, regalloc):
""" If accumulation is done in this loop, at the guard exit
some vector registers must be adjusted to yield the correct value"""
+ if not isinstance(faildescr, ResumeGuardDescr):
+ return
assert regalloc is not None
accum_info = faildescr.rd_accum_list
while accum_info:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit