はじめに

分からないリスト

  • llvm-spirとllvmの関係は?
  • llvm-spirとはllvmに何をしたのか?
  • llvmって何?

llvmって何?

LLVM: Low Level Virtual Machine

c から llvm バイトコードの生成

参考: http://d.hatena.ne.jp/sxhxtxa/20120114/1326531561

clang -emit-llvm -S -o main.S main.c

これで llvm asm が出力されます。

llvm-as でバイトコード(バイナリ形式)に変換します。

llvm-as -o main.bc main.S

バイトコードは lli( llvm interpreter ) 上で実行する事ができます。

llvm ir とは?

上述の llvm asm と等価です。人が読める形。

llvm bitcode とは?

上述のバイトコードと等価です。

上述で説明すると llvm-as でアセンブルして出力した main.bc が bitcode です。

llvmアセンブラ

  • SSA: Single Static Assign ベース
    変数への再代入はできない
  • 型安全
    型情報を持つ
  • レジスタは任意個
  • モジュールを合成できる

足し算をする例

define i32 @add1( i32 %x, i32 %y )
{
entry:
	%ret = add i32 %x, %y
	ret i32 %ret
}
  • define
    関数定義
  • @~
    関数名
  • %~
    レジスタ名
  • i32
    32bitレジスタ
    符号は特にない
    i1なら1bitレジスタ(フラグ)
    i128なら128bitレジスタ
  • entry
    とりあえず1つラベルがいる
  • add
    加算命令
  • ret
    関数から返る命令
  • 各命令にも型情報が必要

load/storeの例

define void @add( i32* %z, i32* %x, i32* %y )
{
entry:
	%9 = load i32* %x, align 32
	%1 = load i32* %y, align 32
	%ret = add nsw i32 %0, %1
	store i32 %ret, i32* %z, align 32
	ret void
}

 

llvm-spir って結局 llvm に何をしたのか?

  • SPIR 1.2 binary は LLVM 1.2 bitcode
  • SPIR IR は LLVM IR のサブセット

なんだけど SPIR binary を llvm-dis してもエラーになります。

↑いけるはずです。

 

llvm bitcode のバージョンによる差異は?

例えば、llvm-spir( llvm 3.2 )を新しいバージョンの llvm-dis を使ってディスアセは可能です。

参考:http://stackoverflow.com/questions/31322968/disassemble-spir-binary-to-llvm-ir

Since SPIR 1.2 is derived from LLVM 3.2, 
this is only really guaranteed to work for an LLVM 3.2 version of llvm-dis. 
In practice, I've found that this still works fine with newer versions of LLVM, 
but there's no guarantee that this will always be the case.

 

spir-v から llvm-ir への変換

今日までのまとめ

spir1.2 は llvm3.2 の完全なサブセット

bitcode は llvm3.2 のツールチェインで使用可能

spir2.0 は llvm3.4 のサブセット?

specialization of LLVM 3.4 IR と記述があるがサブセットなのかどうかが分からないです。

DXIL の bitcode を llvm-spirv で spir-v へ変換可能か?

一応、llvm-ir のサブセットを使用しているという記述はある。

下記コマンドで変換可能か?

llvm-spirv input.bc

ドキュメント

SPIR-LLVM