Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

#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 実行委員長

Slide 3

Slide 3 text

#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アプリケーションエンジニア - シニアエンジニア - テックリード - とにかくエンジニア

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

#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

Slide 10

Slide 10 text

#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まで)

Slide 11

Slide 11 text

#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まで)

Slide 12

Slide 12 text

#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まで)

Slide 13

Slide 13 text

#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まで)

Slide 14

Slide 14 text

#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まで)

Slide 15

Slide 15 text

#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まで)

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

#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が導入された背景

Slide 18

Slide 18 text

#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

Slide 19

Slide 19 text

#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へのサポートを持続的かつ、 品質を担保するため、 効率化が必須

Slide 20

Slide 20 text

#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が導入された背景

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

#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には完全に依存していません。

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

#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でどう中間表現が実現されているか

Slide 27

Slide 27 text

#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でどう中間表現が実現されているか

Slide 28

Slide 28 text

#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でどう中間表現が実現されているか

Slide 29

Slide 29 text

#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でどう中間表現が実現されているか

Slide 30

Slide 30 text

#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でどう中間表現が実現されているか

Slide 31

Slide 31 text

#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でどう中間表現が実現されているか

Slide 32

Slide 32 text

#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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

#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でどう中間表現が実現されているか

Slide 35

Slide 35 text

#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でどう中間表現が実現されているか

Slide 36

Slide 36 text

#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でどう中間表現が実現されているか

Slide 37

Slide 37 text

#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でどう中間表現が実現されているか

Slide 38

Slide 38 text

#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でどう中間表現が実現されているか

Slide 39

Slide 39 text

#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でどう中間表現が実現されているか

Slide 40

Slide 40 text

#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でどう中間表現が実現されているか

Slide 41

Slide 41 text

#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 を使っ ている

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 44 何か忘れている気がする

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

#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%) でより小さなコードを生成します。 何か忘れている気がする

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

#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でどう中間表現が最適化されているか

Slide 51

Slide 51 text

#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でどう中間表現が最適化されているか

Slide 52

Slide 52 text

#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でどう中間表現が最適化されているか

Slide 53

Slide 53 text

#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でどう中間表現が最適化されているか

Slide 54

Slide 54 text

#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でどう中間表現が最適化されているか

Slide 55

Slide 55 text

#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でどう中間表現が最適化されているか

Slide 56

Slide 56 text

#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でどう中間表現が最適化されているか

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

#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でどう中間表現が最適化されているか

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

#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でどう中間表現が最適化されているか

Slide 61

Slide 61 text

#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でどう中間表現が最適化されているか

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

#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でどう中間表現が最適化されているか

Slide 64

Slide 64 text

#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でどう中間表現が最適化されているか

Slide 65

Slide 65 text

#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でどう中間表現が最適化されているか

Slide 66

Slide 66 text

#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でどう中間表現が最適化されているか

Slide 67

Slide 67 text

#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でどう中間表現が最適化されているか

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

#phperkaigi #b © 2012-2025 BASE, Inc. PHP8.4におけるJITフレーム ワークIRと中間表現について理 解を深める 69 最後に 正直に話すと、ちょっと理解が正しいか自信がない部分もあります 🙇 もし知見があったりなにか気づいたことがあれば、 Q&AでもAsk the SpeakerでもXのポストでも カンファレンスの廊下でも、 FBいただけると助かります 🙏🙏🙏🙏🙏🙏 今回の話は範囲を絞っても、それだけで 20,40分トークで話せるぐらい奥深い分野なので、是非 みなさんもインプット &アウトプットしてみてはいかがでしょうか!