2014-02-19 9 views
3

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을 반환하지 않습니까?

답변

4

Why is the signature of the llvm function not just listing the 3 variables as i64*

이 서명은 (@ivarne가 언급 한 바와 같이, 유형이 불완전하기 때문에) 호출 규칙 일반 줄리아입니다.

@julia_test14856(%jl_value_t*, %jl_value_t**, i32) 인수는 다음과 같습니다

  1. 포인터 기능 폐쇄에
  2. 포인터 인수 (jl_value_t 기본 박스 타입) 인수

서명 @ivarne 쇼

  • 번호를 박스에 특수화 된 호출 규칙입니다. 인수는 여전히 상자로 전달되지만 인수 유형 및 개수는 이미 알려져 있습니다 (이미 특수화되어 있기 때문에 함수 종료가 필요하지 않습니다).

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

    :

    top: 
        %3 = icmp eq i32 %2, 3, !dbg !369 
        br i1 %3, label %ifcont, label %else, !dbg !369 
    

    이 절에서는 오류가 반환 - (> 고토 라벨 else: 3없는 경우) 예를 들어, 함수의 출력에 대해

    ,이 부분은 인수의 수를 확인 마지막으로, 기본 경우는 36005472에 저장된 nothing의 값을 가져 오는이 행으로 이동합니다 (@ivarne 버전에서는 이것이 보장되므로 void을 직접 반환 할 수 있음).

    %4 = load %jl_value_t** inttoptr (i64 36005472 to %jl_value_t**), align 32, !dbg !370

  • +0

    감사합니다. 내 직감이 나를 올바른 방향으로 인도 해 주었으면 좋겠다. – ivarne

    2

    Array{Int, N}이 부분적으로 초기화 된 유형이고 코드 생성이 찾는 패턴과 일치하지 않는다고 가정합니다.

    julia> code_llvm(test, (Array{Int,1},Array{Int,1},Array{Int,1})) 
    
    define void @julia_test15626(%jl_value_t*, %jl_value_t*, %jl_value_t*) { 
    top: 
        ret void, !dbg !974 
    } 
    
    이 코드 생성의 버그로 간주 될 수

    시도,하지만 난 모르겠어요.