julia 컴파일러가 생성하는 LLVM IR (code_llvm
사용)을 볼 때 배열을 인수로 사용하는 경우 이상한 점을 발견했습니다. 저를 예를 들어 보겠습니다 :배열을 사용할 때 Julia llvm 함수 시그니처
function test(a,b,c)
return nothing
end
을
내가 얻을 code_llvm(test, (Int,Int,Int))
를 사용하여 (이것은 쓸모없는 예입니다,하지만 결과는 다른 기능과 동일하며,이 예제의 결과 IR은 덜 복잡하다) 다음과 같은 출력 :
; 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
을 반환하지 않습니까?
감사합니다. 내 직감이 나를 올바른 방향으로 인도 해 주었으면 좋겠다. – ivarne