2017-02-27 8 views
1

나는 -S -emit-llvm이 코드를 컴파일 할 연타를 사용 :clang 컴파일러가 인수를 취하는 모든 함수의 시작 부분에이 지침을 넣는 이유는 무엇입니까?

int sub2(int n) { 
    return n - 2 
} 

을 그리고 이것은 출력 코드 :

define i32 @sub2(i32) #0 { 
    %2 = sub i32 %0, 2 
    ret i32 %2 
} 
: 나는 같은 기능을 쓸 수있다, 그러나

; Function Attrs: nounwind 
define i32 @_Z4sub2i(i32) #0 { 
    %2 = alloca i32, align 4 
    store i32 %0, i32* %2, align 4 
    %3 = load i32, i32* %2, align 4 
    %4 = sub nsw i32 %3, 2 
    ret i32 %4 
} 

왜 그런 지시를 추가합니까? 나는 그것에 대해 확신하지 못한다. 그러나 그것은 논쟁을 복사하고있는 것처럼 보인다.

+0

최적화가 활성화되어 있습니까? –

+0

@ChrisBeck'-S -emit-llvm'을 사용했습니다 – user6245072

+2

인수를 로컬 변수에 복사 중입니다. '-S -emit-llvm'을 사용하면 최적화되지 않은 코드가 생성되므로'-S -emit-llvm -O3' 또는'-O2'를 사용하여 다른 것을 볼 수 있습니다. 자동으로 최적화되지 않는 이유는 무엇입니까? 컴파일러에게 마법을 부탁하지 않았으므로 표현을 생성합니다. 아마도 AST 사전 생성 (SSA 기반)에있을 것입니다. –

답변

2

mem2reg 패스를 실행하지 않았기 때문입니다. 변수는 스택의 공간을 차지하는 것으로 간주되어 할당됩니다.

시도해 보면 opt --mem2reg filename.ll -S 당신이 예상했던 것과 비슷한 것을 볼 수 있습니다.

mem2reg 또한 O1, O2 및 O3의 일부입니다.

mem2reg 패스는 "변수"를 llvm 임시 변수로 변환하려고합니다. 주소가없는 변수에 대해서만이 작업을 수행합니다.