Dmitry,

On Mon, Feb 16, 2015 at 9:12 AM, Dmitry Stogov <dmi...@zend.com> wrote:
>
>> > The type checks in PHP7 is quite cheap (2-3 CPU instructions). Strict or
>> > weak check doesn't make any difference for "fast path" (the same 2-3
>> > instructions). The slow patch for weak checks is going to be a bit more
>> > expensive.
>>
>> Well, not really. It's 2-3 CPU instructions once you have the
>> instructions for dealing with ZVALs. The concept I'm talking is having
>> the AOT compiler not know anything about a ZVAL (except perhaps at an
>> FFI level). So yes, it's 2-3 CPU instructions to check type, but it's
>> also a branch. It's also more memory and values to keep track of. It's
>> far more code to generate.
>
>
>
> This is code for week type check:
>
>     cmpb  Z_TYPE_P(%edx), IS_LONG
>     je     slow_path
> L1:
>     addl  Z_LVAL_P(%edx), %eax
>
> ....
>
> slow_path:
>     movl %edx, (%esp)
>     call convert_to_long
>     jmp L1
>
> This is code for strict type check:
>
>     cmpb  Z_TYPE_P(%edx), IS_LONG
>     je     slow_path
> L1:
>     addl  Z_LVAL_P(%edx), %eax
>
> ....
>
> slow_path:
>     movl %edx, (%esp)
>     ...
>     call zend_error
>     jmp L1 ; we still have to support E_RECOVERABLE, so we may return back
>
> No big difference...

The code I'm talking about generating is:

addl %edx %eax

No jumps, no type extraction, because it happened at compile time (and
strict lets us do that since we can determine types 100% at compile
time since dynamic types become errors).

So it's a significant difference (1 less conditional jump, 1 less
unconditional jump, 1 less comparison, a number less operations, etc).

>>
>>
>> >>
>> >>
>> >> In fact, the research I have been doing is precisely around that
>> >> (where I know for a fact that all remaining function calls are going
>> >> to be typed, and compile the entire block at one time with direct
>> >> calls). So that way I never need to actually do even as much as a FCC
>> >> to call a userland function. Which then lets me avoid generating
>> >> typing code (since I know the types). Which is why I'm advocating for
>> >> strict, since that way we can treat an entire graph of function calls
>> >> as strict and compile them all in one go (no need to even JIT at
>> >> runtime, just compile AOT).
>> >>
>> >> If your research has shown something different, care to share?
>> >
>> >
>> > Very similar :), but in cases when we know the called function the
>> > effect
>> > from type hinting is negligible. It's almost always possible to generate
>> > optimal code without any hints.
>>
>> It's always possible to generate optimal PHP code. But I want to
>> generate optimal ASM code. And for that, I need type guarantees.
>
>
> Doesn't week type hint make the same guarantee as strong?
> It just makes conversion on mismatch.

No, because I still need to promote back up to ZVAL before calling
another function (since the type conversion is allowed). Therefore I
cant error on type conversion, I need to generate the code to handle
it.

>>
>>
>> > See code for fibo_r() from bench.php generated by our old JIT for
>> > PHP-5.5
>> > (without type hinting):
>> > https://gist.github.com/dstogov/5f71d23f387332e9d77c
>> >
>> > Unfortunately, we didn't make the same for PHP7 yet.
>> > More important, in our experiments we saw improvements only on small
>> > benchmarks (e.g. 25 times on mandelbrot), but nothing on real-life apps.
>> >
>> > So a some point, looking into ASM code that endlessly allocates and
>> > frees
>> > zvals, we switched to engine re-factoring.
>>
>> Which for generic code, is amazing. And I'm all for optimizing dynamic
>> code. You're going to get an overall big gain doing that. I just see a
>> bigger gain is possible given some preconditions, and would love to
>> see them working together.
>
>
> I'm looking forward as well :)
> Just busy with other things now.
>
>>
>>
>> >>
>> >>
>> >> > According to mandel() and integer to float conversion in the loop,
>> >> > it's
>> >> > possible to perform a backward data-propagation pass to catch this
>> >> > case
>> >> > and
>> >> > replace integer by float in first place. We did it in our old JIT
>> >> > prototypes
>> >> > without any type hinting. Also, don't use "fild", use SSE2 and/or
>> >> > AVX.
>> >>
>> >> I did wind up doing a few passes to back-propagate the cast (among
>> >> other optimizations). But it's still a point that the conversions
>> >> aren't exactly cheap. But as I said before, that was a side-note and
>> >> not really an argument for/against strict typing. So worth mentioning,
>> >> but shouldn't affect anyone's decision.
>> >>
>> >> Re fild vs SSE/AVX: that was up to the backend code generator we were
>> >> using (libjit). It may be an open req against that lib to generate the
>> >> different instruction, or perhaps it just failed a heuristic. We were
>> >> working a level higher than the generated ASM, so not really 100% sure
>> >> why it made that decision.
>> >
>> >
>> > I saw a big speed difference between FPU and SSE2/AVX code on bench.php,
>> > so
>> > if you may tell libjit to use SSE2/AVX - do it.
>>
>> Yeah, I'm not sure it's worth it at this stage, but will definitely
>> keep in mind.
>>
>> > Right, but it's not always possible to know the types at compile time,
>> > and in this case hints may be helpful, however, strict and week hints
>> > give
>> > exactly the same information - they guarantee the type of argument
>> > inside
>> > the function.
>>
>> Well, yes. However it also means that inside the function dynamic
>> types (variables that change type) are fine, and you need to implement
>> the conversion logic. Therefore you need to implement ZVAL
>> abstractions in the compiler. Something I really want to avoid, as it
>> exponentially raises the complexity that you need to handle.
>
>
> We had different goals and may misunderstand each other.
> We tried to make 100% transparent JIT for PHP that would able to run any
> code.

I think the high-level goals are the same, but yes, the low level
goals are very different. I see we compliment each other rather than
oppose. Which is why I am excited by it :-).

Thanks for the discussion :-)

Anthony

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to