飛び越しを削除するためのコード模写

ループ展開とその他の最適化に加えて,コード模写による飛越しの削除によって,飛越し数が減らされます。コード模写は,基本ブロック (エントリ・ポイントが先頭にしかなく,出口が末尾にしかない一連の命令の流れ) 数を減らし,命令スケジューリングの機会を増やします。

コード模写は,通常は,複数の短い終了列を持つルーチンなどのように,制御の流れの終わりに飛越しがあるような場合に行われます。終了列のコードが,飛越しが起こる個々の場所に模写されます。

次の例は,最適化されていないルーチンと,コード模写を使用する,これと等価な最適化を示しています。R0 (ia32 システムでは EAX) はレジスタ 0 です。

	最適化されていない命令		最適化された (模写された) 命令
	
		.				.
		.				.
		.				.
		branch to exit1			move 1 into R0
		.				return
		.				.
		.				.
		branch to exit1			.
		.				move 1 into R0
		.				return
		.				.
	exit1:	move 1 into R0			.
		return				.
						move 1 into R0
						return

同じように,コード模写は,ループの終わりに少量の共有コードを含み,ループ内に CASE 形式の飛越しを含んでいるループ中でも行われます。ループの末尾にある検証を行って飛越しするコードを個々の CASE の終わりに模写することで,個々の CASE コード中で効率的な命令パイプラインを行うことができます。