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の場合、メモリーリークになっちゃうのかな?
後者の場合、メモリの無駄遣いなだけなのかな?