Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP8.4におけるJITフレームワークIRと中間表現について理解を深める

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
Avatar for 02 02
March 23, 2025
1.2k

 PHP8.4におけるJITフレームワークIRと中間表現について理解を深める

Avatar for 02

02

March 23, 2025
Tweet

More Decks by 02

Transcript

  1. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める |

    BASE, Inc. PHP8.4におけるJITフレームワーク IR と中間表現について理解を深める 02 @PHPerKaigi 2025 2025.03.23
  2. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める Speaker

    Profile 2 02 Otsu Kazuki BASE BANK Dept. Engineering Program Manager :@cocoeyes02 PHPカンファレンス2024, 2025 実行委員長
  3. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める BASE

    Recruitment Information Our Mission Payment to the People, Power to the People. 自分の好きなことを仕事にしたり経済活動を行っている個人やスモールチーム のエンパワーメントを目指しています。 3 BASE BANKで一緒に働くメンバーを募集中! 絶賛募集中! - Webアプリケーションエンジニア - シニアエンジニア - テックリード - とにかくエンジニア
  4. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 4

    今回話すこと • PHPのコンパイルについて軽くおさらいしつ つ、JITと中間表現の基本概念を説明する • JITフレームワーク IRのしくみについてざっくり 知る
  5. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 5

    今回話さないこと • IRに関係ない範囲の、 PHPコンパイルの詳細 の話 • JITフレームワーク IRで使用しているアルゴリズ ムの説明
  6. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 6

    一般的な言葉の定義① • マシンコード ◦ コンピュータが理解できる言語のこと(機械語やアセンブリ言語など) • コンパイル ◦ ソースコードを、マシンコードやバイトコードなどへ変換すること ◦ 目的に応じたコードへ変換することで、効率化を図っている • 中間表現(中間コード) ◦ マシンコード変換する前に、一度任意のデータ形式に変える手法やコードそのも のこと ◦ 一気にマシンコードへ変換するよりも、無駄な計算を省いたり複数フォーマットへ の変換処理を効率化するなどの恩恵をもたらす
  7. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 7

    • バイトコード ◦ 中間表現の一種。命令長がバイト可変長だったり、命令中のフィールドの区切り がバイト単位になっているところから来ている ◦ 今日では、 VM向けの命令コード体系を表現しているところも多い • VM(仮想環境) ◦ コンピュータ上でソフトウェア的に動作する仮想的な「コンピュータ」環境を提供す る技術 ◦ 実際のハードウェアとは独立して動作し、異なるアーキテクチャのシステム上で も同じ環境を再現する目的がある 一般的な言葉の定義②
  8. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©

    2012-2025 BASE, Inc. 8 PHPのコンパイルについて おさらい( PHP8.3まで) 8
  9. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 9

    PHPのコンパイルについておさらい( PHP8.3まで) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP
  10. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 10

    https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP PHPソースコードをVM(Zend Engine)が理 解できるオペコードへ変換する。 その後、オペコードをより効率よく実行できる よう最適化する(数を減らしたり、効率の良い ものにしたりする) オペコード: Zend Engine向けの操作に関する命令の コード。中間表現、バイトコードの一つ。 PHPのコンパイルについておさらい( PHP8.3まで)
  11. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 11

    https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP VM(Zend Engine)でオペコードを使って コードを実行する。 本来ならIntel x86とM1 Mac(AArch64)で それぞれマシンコードが必要だが、 オペコードがあれば、 IntelでもMacでも同じ オペコードを実行するだけで OK PHPのコンパイルについておさらい( PHP8.3まで)
  12. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 12

    https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP コンパイル済みのオペコードを、 共通メモリにキャッシュする。 Opcache: コンパイル処理のスキップによ る高速化図る目的の PHP拡張モ ジュール。 コンパイル済みのオペコードを、 共通メモリにキャッシュする。 Opcache: 上記のようなキャッシュを用い て、高速化図る目的を持った PHP拡張モジュール。 PHPのコンパイルについておさらい( PHP8.3まで)
  13. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 13

    https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP JITコンパイルでマシンコードを生成する。 JIT(ジャストインタイム)コンパイル: PHP8.0で追加されたOPcacheの拡張機能。 Cache Hit時に、VMを通さずマシンコード実 行できる(≒早い)メリットがある。 頻繁に実行されるコー ドを検知して、キャッ シュするよう条件決め ができる PHPのコンパイルについておさらい( PHP8.3まで)
  14. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 14

    https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP JITコンパイル時には、 Intel x86とM1 Mac(AArch64)でそ れぞれのマシンコードを分けて生成し ている PHPのコンパイルについておさらい( PHP8.3まで)
  15. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 15

    本当はおさらいの方も深く話したいですが、時間が無いので詳細は割愛します! 詳細を知らない人は、下記の記事を読んでみると良いです! • 【PHP】Zend Engine の内部を図示した記事・資料まとめ ◦ https://qiita.com/7968/items/2aa487e2e515dba2fd03 • OPcache オペコードキャッシュの仕組み - Shin x Blog ◦ https://blog.shin1x1.com/entry/php-opcache-under-the-hood • PHP8から追加された JITについて学ぼう ! - takeokunn's blog ◦ https://www.takeokunn.org/posts/permanent/20221222111924-about_php_jit/ PHPのコンパイルについておさらい( PHP8.3まで)
  16. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©

    2012-2025 BASE, Inc. 16 PHP8.4でJITフレームワーク IRが 導入された背景 16
  17. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 17

    https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP JITコンパイル時には、 Intel x86とM1 Mac(AArch64)でそ れぞれのマシンコードを分けて生成 している PHP8.4でJITフレームワーク IRが導入された背景
  18. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 18

    PHP8.3の現在について (前略) • PHP JITはターゲット CPU用に機械語を「手動で」直接生成します • 各CPU(x86_64およびAArch64)を個別にサポートする必要があります • 最適化およびレジスタ割り当ての範囲には制限があります • PHP JITは非常に短時間で中間的な品質のコードを生成します • PHP JITに関連する修正には、サポートされているすべてのプラットフォームに対してアセン ブラコードの変更が必要な場合があります ◦ サポートが難しいです PHP8.4でJITフレームワーク IRが導入された背景 https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP
  19. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 19

    PHP8.3の現在について (前略) • PHP JITはターゲット CPU用に機械語を「手動で」直接生成します • 各CPU(x86_64およびAArch64)を個別にサポートする必要があります • 最適化およびレジスタ割り当ての範囲には制限があります • PHP JITは非常に短時間で中間的な品質のコードを生成します • PHP JITに関連する修正には、サポートされているすべてのプラットフォームに対してアセン ブラコードの変更が必要な場合があります ◦ サポートが難しいです PHP8.4でJITフレームワーク IRが導入された背景 https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP 各CPUへのサポートを持続的かつ、 品質を担保するため、 効率化が必須
  20. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 20

    https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP 効率化のため、独自の JITフレームワーク IRが爆誕! PHP8.4でJITフレームワーク IRが導入された背景
  21. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 21

    https://github.com/dstogov/ir PHP8.4でJITフレームワーク IRが導入された背景
  22. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 22

    https://github.com/dstogov/ir PHP8.4でJITフレームワーク IRが導入された背景 IRフレームワークは、中規模のプロジェクトで JITを実装するための実用的なソリューションです。 これには、中間表現( IR)の定義、 IR構築のためのシンプルな API、最適化、スケジューリング、レ ジスタ割り当て、コード生成のアルゴリズムが提供されます。生成されたインメモリコードは、直接 実行することができます。 これはまだ安定した完成品ではなく、現在も積極的に開発中です。 PHP-9の次世代 JITコンパイラ 開発のための基盤として始まりましたが、 PHPには完全に依存していません。
  23. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める ©

    2012-2025 BASE, Inc. 23 JITフレームワーク IRでどう 中間表現が実現されているか 23
  24. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 24

    PHPでのJITコンパイルの流れを、 BeforeAfterで見てみる Before After IRでどう中間表現が実現されているか PHP Script オペコード マシン コード PHP Script オペコード マシン コード IR用 中間コード
  25. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 25

    オペコードから IR用中間コードを生成している流れを、 PHPではどうなっているか追ってみる Before After PHP Script オペコード マシン コード PHP Script オペコード マシン コード IR用 中間コード IRでどう中間表現が実現されているか
  26. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 26

    php-srcで、JITのコンパイルを実行しているコードを見てみる https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L1413 IRでどう中間表現が実現されているか
  27. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 27

    各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L1756 IRでどう中間表現が実現されているか
  28. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 28

    各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L1756 IRでどう中間表現が実現されているか
  29. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 29

    各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L5684 IRでどう中間表現が実現されているか
  30. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 30

    各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L5684 IRでどう中間表現が実現されているか
  31. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 31

    各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた https://github.com/dstogov/ir/blob/master/ir_builder.h IRでどう中間表現が実現されているか
  32. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 32

    各所でIR ビルダー API(ir_builder.h)を使って、 IR用の中間コードを生成していた IRでどう中間表現が実現されているか https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP
  33. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 33

    IR用中間コードからマシンコード生成をしているコードを追ってみる Before After PHP Script オペコード マシン コード PHP Script オペコード マシン コード IR用 中間コード IRでどう中間表現が実現されているか
  34. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 34

    php-srcで、JITのコンパイルを実行しているコードを見てみる … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit.c#L2938 IRでどう中間表現が実現されているか
  35. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 35

    zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L16734 IRでどう中間表現が実現されているか
  36. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 36

    zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L16734 IRでどう中間表現が実現されているか
  37. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 37

    zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L268-L296 IRでどう中間表現が実現されているか
  38. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 38

    zend_jit_ir_compile で、組み立てた IR用中間コードをコンパイルしている https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L268-L296 IRでどう中間表現が実現されているか
  39. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 39

    ir_emit_codeでマシンコードを生成する( CPUごとにマシンコード生成用ファイルがある) … https://github.com/php/php-src/blob/master/ext/opcache/jit/zend_jit_ir.c#L2780 IRでどう中間表現が実現されているか
  40. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 40

    ir_emit_codeでマシンコードを生成する( CPUごとにマシンコード生成用ファイルがある) https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_x86.dasc#L10461 https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_aarch64.dasc#L5851 IRでどう中間表現が実現されているか
  41. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 41

    ir_emit_codeでマシンコードを生成する( CPUごとにマシンコード生成用ファイルがある) https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_x86.dasc#L10461 https://github.com/php/php-src/blob/master/ext/opcache/jit/ir/ir_aarch64.dasc#L5851 IRでどう中間表現が実現されているか マシンコードの生成には、 PHP8.0の JITでも使用している DynASM を使っ ている
  42. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 45

    中間コードが 1つ増える =変換の工程が 1つ増えるから、遅くなるのでは? Before After PHP Script オペコード マシン コード PHP Script オペコード マシン コード JIT FW IR用 中間コード 何か忘れている気がする
  43. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 46

    もしかして中間コードって 増やせば増やすほど早くなる 魔法のコードか!!???? 何か忘れている気がする
  44. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 47

    もしかして中間コードって 増やせば増やすほど早くなる 魔法のコードか!!???? ✖ 何か忘れている気がする
  45. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 48

    https://wiki.php.net/rfc/jit-ir 現在の新しい PHP JIT は、古いものとまったく同じ PHP 関連の機能と最適化のセットを実装して います。 IR フレームワークは より多くの最適化を提供 し、よりスマートなレジスタ アロケータを備えている ため、JIT はより高速 (5 ~ 10%) でより小さなコードを生成します。 何か忘れている気がする
  46. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 50

    遅くならないよう、色々な工程で最適化がされています https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
  47. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 51

    詳細を話すと時間内で終わらないので、 PHPコード例で簡単に最適化の内容を話します https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP 中間コード 作成 マシン コード生成 マシンコード生成前に必要な準備 最適化 最適化 最適化 IRでどう中間表現が最適化されているか
  48. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 52

    定数畳み込み / 定数伝播による、式の単純化 &デッドコード削除 (FOLDING) (SCCP) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
  49. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 53

    // PHPでのコード例 $a = 30; $b = 9 - $a / 5; $c = $b * 4; if ($c > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
  50. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 54

    // $a の値を代入して、定数値に置き換える(定数伝搬) $a = 30; $b = 9 - 30 / 5; $c = $b * 4; if ($c > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
  51. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 55

    // 定数伝播を続けて、式を計算して単純な定数にする(定数畳み込み) $a = 30; $b = 3; $c = 12; if (12 > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
  52. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 56

    // if文が必ずtrueになるので消す(疎な条件分岐を考慮した定数伝播(SCCP)) $a = 30; $b = 3; $c = 12; $c = 12 - 10; // 2 return $c * 2; IRでどう中間表現が最適化されているか
  53. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 57

    // 最終的に定数になるまで単純化される return 4; IRでどう中間表現が最適化されているか
  54. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 58

    // もしif文がfalseだった場合は、if文には到達しない(デッドコードになる) $a = 30; $b = 3; $c = 9; if (9 > 10) { $c = $c - 10; } return $c * 2; IRでどう中間表現が最適化されているか
  55. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 59

    // デッドコードを削除して、 // 単純化する(疎な条件分岐を考慮した定数伝播(SCCP)) return 18; IRでどう中間表現が最適化されているか
  56. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 60

    同じ式の出現を探し出して、計算結果を格納する一つの変数に置き換える (CSE) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
  57. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 61

    // PHPでのコード例 $a1 = $b * $c + $g; $a2 = $b * $c * $d; $tmp = $b * $c; $a1 = $tmp + $g; $d2 = $tmp * $d; IRでどう中間表現が最適化されているか
  58. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 62

    // 全く同じ式が大量にでてきたとする(極端ではあるが) $a1 = $b * $c + $g; $a2 = $b * $c * $d; … $a5000000000 = $b * $c * $d; IRでどう中間表現が最適化されているか
  59. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 63

    // 一番最初に計算すると、計算コストが下がる(共通部分式除去(CSE)) $tmp = $b * $c; $a1 = $tmp + $g; $a2 = $tmp * $d; … $a5000000000 = $tmp * $d; IRでどう中間表現が最適化されているか
  60. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 64

    計算タイミングを前後することで、よりループの内側へ / デッドコードを削除 (GCM) https://www.researchgate.net/publication/374470404_IR_JIT_Framework_a_base_for_the_next_generation_JIT_for_PHP IRでどう中間表現が最適化されているか
  61. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 65

    function foo ($a): int { // PHPのコード例 $i = 0; do { $b = $a + 1; $i = $i + $b; $c = $i * 2; } while ($i < 10) { return $c; } } IRでどう中間表現が最適化されているか
  62. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 66

    function foo ($a): int { // $aは定数なので、$bも定数伝播により定数になるのでループ外へ移動 $i = 0; $b = $a + 1; do { $i = $i + $b; $c = $i * 2; } while ($i < 10) { return $c; } } IRでどう中間表現が最適化されているか
  63. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 67

    function foo ($a): int { // $iも20になり(ループ10回回るため)定数になるので、ループ外へ移動 $i = 0; $b = $a + 1; do { $i = $i + $b; } while ($i < 10) { $c = $i * 2; return $c; } } IRでどう中間表現が最適化されているか
  64. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 68

    IRでどう中間表現が最適化されているか 内部のアルゴリズムについて知りたい人は、 Sea of Nodesの理解が必要なので、興味あればぜ ひ!下記の記事がわかりやすかったです! https://darksi.de/d.sea-of-nodes/
  65. #phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 69

    最後に 正直に話すと、ちょっと理解が正しいか自信がない部分もあります 🙇 もし知見があったりなにか気づいたことがあれば、 Q&AでもAsk the SpeakerでもXのポストでも カンファレンスの廊下でも、 FBいただけると助かります 🙏🙏🙏🙏🙏🙏 今回の話は範囲を絞っても、それだけで 20,40分トークで話せるぐらい奥深い分野なので、是非 みなさんもインプット &アウトプットしてみてはいかがでしょうか!