It's a little long for that, I was hoping people would request what is relevant. Here's some pertinent snippets (again, this is all an experiment, so it is not pretty).<br><br>jitdriver = JitDriver(greens=['pc', 'method'], <br>
reds=['self'],<br> virtualizables=['self'],<br> get_printable_location=get_location)<br><br>class Frame:<br> """ Represents one stack frame."""<br>
_immutable_fields_ = ['space', 'method', 'opStack', 'scopeStack', 'locals']<br> _virtualizable2_ = ["locals[*]"]<br> def __init__(self, space, method):<br> self = jit.hint(self, access_directly=True, fresh_virtualizable=True)<br>
self.space = space<br> self.method = method<br> body = method.method_body<br> self.opStack = [space.getUndefined()] * body.max_stack<br> self.opCount = 0<br> self.scopeStack = [space.getUndefined()] * body.max_scope_depth<br>
self.scopeCount = 0<br> self.locals = [space.getUndefined()] * body.local_count<br> <br> def dispatch(self):<br> self = jit.hint(self, access_directly=True)<br> pc = 0<br> while True:<br>
jitdriver.jit_merge_point(self=self, pc=pc, method=self.method)<br> self.opCount = jit.hint(self.opCount, promote=True)<br> self.scopeCount = jit.hint(self.scopeCount, promote=True)<br> r, pc = self.handle_bytecode(pc)<br>
if r is not None:<br> return r <br>def handle_bytecode(self, pc):<br> """Runs the interpreter for a single bytecode.<br>Returns (retvalue,pc) where retvalue is non-None if if the RETURNVALUE or RETURNVOID opcodes are run, and pc the new program counter."""<br>
bytecode = ord(self.method.method_body.code[pc])<br> pc+=1<br> if bytecode == Frame.LABEL:<br>
pass<br> elif bytecode == Frame.INCLOCAL_I:<br> index, pc = readU30(self.method.method_body.code, pc)<br> self.locals[force_non_neg(index)] = self.space.wrapInt(self.space.toInteger(self.locals[force_non_neg(index)]) + 1)<br>
elif bytecode == Frame.GETLOCAL2:<br> self.push(self.locals[2])<br> elif bytecode == Frame.PUSHSHORT:<br> i, pc = readU30(self.method.method_body.code, pc)<br> self.push(self.space.wrapInt(i))<br>
elif (bytecode == Frame.IFGE or<br> bytecode == Frame.IFGT or<br> bytecode == Frame.IFLE or<br> bytecode == Frame.IFLT or<br> bytecode == Frame.IFNGE or<br> bytecode == Frame.IFNGT or<br>
bytecode == Frame.IFNLE or<br> bytecode == Frame.IFNLT):<br> offset, pc = readSI24(self.method.method_body.code, pc)<br> b = self.pop()<br> a = self.pop()<br> c = self.compare(a, b)<br>
<br> doBranch = False<br> if c == -99:<br> doBranch = False<br> else:<br> if bytecode in (Frame.IFGE, Frame.IFNGE): doBranch = c >= 0<br> elif bytecode in (Frame.IFGT, Frame.IFNGT): doBranch = c > 0<br>
elif bytecode in (Frame.IFLE, Frame.IFNLE): doBranch = c <= 0<br> elif bytecode in (Frame.IFLT, Frame.IFNLT): doBranch = c < 0<br> if bytecode in (Frame.IFNGE,Frame.IFNGT,Frame.IFNLE,Frame.IFNLT):<br>
doBranch = not doBranch<br> if doBranch:<br> pc += offset<br> #jitdriver.can_enter_jit(self=self, pc=pc, method=self.method)<br><br><br><br><br><br><br>The bytecode in question:<br>
L1: label <br> inclocal_i 2<br> L0: getlocal2 <br> pushshort 10000<br> iflt L1<br><br>(i.e. increment local variable 2 by 1, then compare it against 10000)<br>
<br><br><div class="gmail_quote">On Sat, Sep 17, 2011 at 6:25 PM, Benjamin Peterson <span dir="ltr"><<a href="mailto:benjamin@python.org">benjamin@python.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex;">
This would probably be easier if you showed us the code.<br>
<br>
2011/9/17 Boris <<a href="mailto:boris2010@boristhebrave.com">boris2010@boristhebrave.com</a>>:<br>
<div><div></div><div class="h5">> Hi,<br>
><br>
> I've been trying out writing my own interpreter using the PyPy framework<br>
> recently, as a bit of fun. I've been trying to get the JIT to optimize a<br>
> trivial loop down to the minimal amount of operations. With judicious use of<br>
> `_immutable_fields_` and `_virtualizable2_`, I've got pretty close.<br>
><br>
> But I'm still seeing lots of calls to<br>
> `ll_dict_lookup__dicttablePtr_Signed_Signed`, which don't correspond to any<br>
> code in my interpreter. I don't think I even have any dicts that take<br>
> integer keys. Could someone give me a hint where these are coming from and<br>
> for what purpose? Or perhaps how to inspect the dicts or get further info?<br>
><br>
> I append what I'm seeing in the logs (Note: I've augmented the logs to give<br>
> the raw pointer). In this case, it is only looking up the value 21, but I've<br>
> seen other values in addition when running other programs. The<br>
> setarrayitem_gc calls are expected - it is nulling out the stack that was<br>
> being used. Everything from i17 is unexpected. I tested on revisions<br>
> 00711ff1e03d and 96a212b0688a.<br>
><br>
> Thanks,<br>
><br>
> Boris<br>
><br>
><br>
> #############################<br>
><br>
> [3fd12ea6569db] {jit-log-opt-loop<br>
> # Loop 0 : loop with 37 ops<br>
> [p0, p1, p2, i3, p4, p5]<br>
> debug_merge_point(0, '::Test$iinit:20')<br>
> +113: i7 = int_add(i3, 1)<br>
> debug_merge_point(0, '::Test$iinit:22')<br>
> debug_merge_point(0, '::Test$iinit:23')<br>
> debug_merge_point(0, '::Test$iinit:26')<br>
> +116: setarrayitem_gc(p5, 0, ConstPtr(ptr9,0x0), descr=<GcPtrArrayDescr>)<br>
> +126: setarrayitem_gc(p5, 1, ConstPtr(ptr11,0x0), descr=<GcPtrArrayDescr>)<br>
> +133: i13 = uint_lt(i7, 10000)<br>
> guard_true(i13, descr=<Guard2>) [p0, p1, p2, p4, i7]<br>
> +145: i17 = call(ConstClass(ll_dict_lookup__dicttablePtr_Signed_Signed),<br>
> ConstPtr(ptr15,0x84c2958), 21, 21, descr=<SignedCallDescr>)<br>
> +176: guard_no_exception(, descr=<Guard3>) [p0, i17, p1, p2, p4, i7]<br>
> +189: i19 = int_and(i17, -<a href="tel:2147483648" value="+12147483648">2147483648</a>)<br>
> +195: i20 = int_is_true(i19)<br>
> guard_true(i20, descr=<Guard4>) [p0, p1, p2, p4, i7]<br>
> +204: i23 = call(ConstClass(ll_dict_lookup__dicttablePtr_Signed_Signed),<br>
> ConstPtr(ptr22,0x84c2978), 21, 21, descr=<SignedCallDescr>)<br>
> +235: guard_no_exception(, descr=<Guard5>) [p0, i23, p1, p2, p4, i7]<br>
> +248: i24 = int_and(i23, -<a href="tel:2147483648" value="+12147483648">2147483648</a>)<br>
> +254: i25 = int_is_true(i24)<br>
> guard_true(i25, descr=<Guard6>) [p0, p1, p2, p4, i7]<br>
> +263: i28 = call(ConstClass(ll_dict_lookup__dicttablePtr_Signed_Signed),<br>
> ConstPtr(ptr27,0x84c2988), 21, 21, descr=<SignedCallDescr>)<br>
> +294: guard_no_exception(, descr=<Guard7>) [p0, i28, p1, p2, p4, i7]<br>
> +307: i29 = int_and(i28, -2147483648)<br>
> +313: i30 = int_is_true(i29)<br>
> guard_true(i30, descr=<Guard8>) [p0, p1, p2, p4, i7]<br>
> +322: i33 = call(ConstClass(ll_dict_lookup__dicttablePtr_Signed_Signed),<br>
> ConstPtr(ptr32,0x84c2998), 21, 21, descr=<SignedCallDescr>)<br>
> +353: guard_no_exception(, descr=<Guard9>) [p0, i33, p1, p2, p4, i7]<br>
> +366: i34 = int_and(i33, -2147483648)<br>
> +372: i35 = int_is_true(i34)<br>
> guard_false(i35, descr=<Guard10>) [p0, p1, p2, p4, i7]<br>
> +381: i38 = call(ConstClass(ll_dict_lookup__dicttablePtr_Signed_Signed),<br>
> ConstPtr(ptr37,0x84c2968), 21, 21, descr=<SignedCallDescr>)<br>
> +412: guard_no_exception(, descr=<Guard11>) [p0, i38, p1, p2, p4, i7]<br>
> +425: i39 = int_and(i38, -2147483648)<br>
> +431: i40 = int_is_true(i39)<br>
> guard_true(i40, descr=<Guard12>) [p0, p1, p2, p4, i7]<br>
> debug_merge_point(0, '::Test$iinit:20')<br>
> +440: i41 = arraylen_gc(p5, descr=<GcPtrArrayDescr>)<br>
> +440: jump(p0, p1, p2, i7, p4, p5, descr=<Loop0>)<br>
> +448: --end of the loop--<br>
> [3fd12ea696ce9] jit-log-opt-loop}<br>
><br>
><br>
><br>
</div></div>> _______________________________________________<br>
> pypy-dev mailing list<br>
> <a href="mailto:pypy-dev@python.org">pypy-dev@python.org</a><br>
> <a href="http://mail.python.org/mailman/listinfo/pypy-dev" target="_blank">http://mail.python.org/mailman/listinfo/pypy-dev</a><br>
><br>
><br>
<font color="#888888"><br>
<br>
<br>
--<br>
Regards,<br>
Benjamin<br>
</font></blockquote></div><br><div style="visibility: hidden; left: -5000px; position: absolute; z-index: 9999; padding: 0px; margin-left: 0px; margin-top: 0px; overflow: hidden; word-wrap: break-word; color: black; font-size: 10px; text-align: left; line-height: 130%;" id="avg_ls_inline_popup">
</div>