3

julia コンパイラが ( を使用してcode_llvm) 生成する LLVM IR を見ると、引数として配列を使用すると、関数のシグネチャに奇妙な点があることに気付きました。例を挙げましょう:

function test(a,b,c)
    return nothing
end

(これは役に立たない例ですが、結果は他の関数と同じです。この例の結果の IR は雑然としていません)

を使用するcode_llvm(test, (Int,Int,Int))と、次の出力が得られます。

; Function Attrs: sspreq
define void @julia_test14855(i64, i64, i64) #2 {
top:
  ret void, !dbg !366
}

を使用code_llvm(test, (Array{Int},Array{Int},Array{Int}))すると、(少なくとも私にとっては)予期しない結果が得られます。

; Function Attrs: sspreq
define %jl_value_t* @julia_test14856(%jl_value_t*, %jl_value_t**, i32) #2 {
top:
  %3 = icmp eq i32 %2, 3, !dbg !369
  br i1 %3, label %ifcont, label %else, !dbg !369

else:                                             ; preds = %top
  call void @jl_error(i8* getelementptr inbounds ([26 x i8]* @_j_str0, i64 0, i64 0)), !dbg !369
  unreachable, !dbg !369

ifcont:                                           ; preds = %top
  %4 = load %jl_value_t** inttoptr (i64 36005472 to %jl_value_t**), align 32, !dbg !370
  ret %jl_value_t* %4, !dbg !370
}

llvm 関数の署名が 3 つの変数をリストしているだけではないのはなぜi64*ですか? voidそして、関数がもう返されないのはなぜですか?

4

2 に答える 2