ひでみのアイデア帳

くだらないことなんだけど、忘れないために・・・

LLVMのIRコード

LLVMのIRコードがどんなになるだろうか?と、試してみた。

試したのは次の多次元配列での受け渡し。

int data[8][8];

sample(data[8][8]){...};

トップ階層では、次のようにメモリが生成されている。

%data = alloca [8 x [8 x i32]], align 16

ただ、sampleの関数の中で次のような感じで書いてみると・・・

for(y=0;y<8;y++){

  for(x=0;x<8;x++){

    data[y][x] = ...;

  }

}

こんな風になる。

  %1 = alloca [8 x i32]*, align 8

  %x = alloca i32, align 4

  %y = alloca i32, align 4

  store [8 x i32]* %data, [8 x i32]** %1, align 8

  store i32 0, i32* %y, align 4

...

  %13 = load i32* %x, align 4

  %14 = sext i32 %13 to i64

  %15 = load i32* %y, align 4

  %16 = sext i32 %15 to i64

  %17 = load [8 x i32]** %1, align 8

  %18 = getelementptr inbounds [8 x i32]* %17, i64 %16

  %19 = getelementptr inbounds [8 x i32]* %18, i32 0, i64 %14

これでどうやって、8x8の多次元配列のポインタを作り出しているのだろうか?

多次元配列を次のように、8x16にしてみると。

int data[8][16]

sample(data[8][16]){...};

次のようなコードになった。

  %1 = alloca [8 x i32]*, align 8

  %x = alloca i32, align 4

  %y = alloca i32, align 4

  store [8 x i32]* %data, [8 x i32]** %1, align 8

  store i32 0, i32* %y, align 4

あれ?

8x8のままになってない?

次のコードではsample関数内では16x16のように見えている。

int data[16][16]

sample(data[16][16]){...};

8x16の場合、メモリーリークになっちゃうのかな?

後者の場合、メモリの無駄遣いなだけなのかな?