Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:82846 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 37959 invoked from network); 16 Feb 2015 14:12:35 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 16 Feb 2015 14:12:35 -0000 Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 209.85.220.180 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 209.85.220.180 mail-vc0-f180.google.com Received: from [209.85.220.180] ([209.85.220.180:59181] helo=mail-vc0-f180.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 04/30-36518-2DAF1E45 for ; Mon, 16 Feb 2015 09:12:34 -0500 Received: by mail-vc0-f180.google.com with SMTP id im6so10620284vcb.11 for ; Mon, 16 Feb 2015 06:12:31 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:mime-version:in-reply-to:references:date :message-id:subject:from:to:cc:content-type; bh=VzoWEOI4bkThdCaV8huZTmbUx+3VC9jQ7KOsUNNgtvY=; b=KFLhiTvqO+XlwtN2ZF7/aZHlAxeeNepH5cwG702183EArqV+i3SFj2jEw3YyqtsOi2 mt+pNpvBRKWwIOoc16jdOIHTToraBoXCcixyb5U/wBYiluoGkR4VaDQFs6KklpUsjZhT kpN3Rg5kp8n/HukTgw+Bb8t77yQJTG8Z3ZiHpo/aTwkjFgbDf9XRXbERo/zJYLqqJoRD +0wwDRUi3Ob8Tc5TxZ3oHIftoypumgm2lGYmH9d/HtQ5NQjrblyRpklC2borwG4Kp9nj rrlLe9rcmEgnXKI2tK7RRjL1gIqEQ6Bx7Gun/xso8OGy3wKjIrBOTOcmpJKKAWa/cj+r pjcA== X-Gm-Message-State: ALoCoQkc2ZcU8f9WWSaHwZZDZyw8f1B0EmFpQetZ6LXTi+197W2BGAcultbIl6D2UFxcxFVkPWjkEyKfgSCVcxldoVIfXHe46bFHisFQyp3qYFhSzUh8n/etMr9AispU2m/QsYKH83uCVEgAiY2hInl5Oun2D6PBdQ== MIME-Version: 1.0 X-Received: by 10.52.139.7 with SMTP id qu7mr13273326vdb.68.1424095951292; Mon, 16 Feb 2015 06:12:31 -0800 (PST) Received: by 10.52.74.73 with HTTP; Mon, 16 Feb 2015 06:12:30 -0800 (PST) In-Reply-To: References: Date: Mon, 16 Feb 2015 18:12:30 +0400 Message-ID: To: Anthony Ferrara Cc: Zeev Suraski , Andrea Faulds , Patrick ALLAERT , PHP Internals Content-Type: multipart/alternative; boundary=bcaec52d53ab4da0c0050f352dfd Subject: Re: [PHP-DEV] PHP JIT or AOT From: dmitry@zend.com (Dmitry Stogov) --bcaec52d53ab4da0c0050f352dfd Content-Type: text/plain; charset=UTF-8 > > 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... > > >> > >> > >> 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. > > > 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. Thanks. Dmitry. > > Why do you need to generate conversion logic, why can't you call > > Zend API functions ? > > We definitely can. However there are 2 problems with that. First the > compiler must know and use the ZVAL abstraction (including the > possibility of type change). The second is that we need to support the > error mechanisms and the generated code needs to be aware of the > engine state (for example, to implement try/catch, etc). Definitely > possible, but also greatly increases complexity... Strict typing makes > those cases compile-time errors, and therefore we don't need to handle > it at all in the generated code. > > Thanks > > Anthony > --bcaec52d53ab4da0c0050f352dfd--