2017-05-21 14 views
2

SSA :생성하는 방법 LLVM 내가 변수 X가 두 번 할당되는 다음과 같은 C 코드 작성 형식

int main() 
{ 
     int x; 
     x = 10; 
     x = 20; 
     return 0; 
} 

컴파일을하고

clang -emit-llvm -c ssa.c 

IR이

를 생성 한 다음 명령을 사용하여 IR 표현을 생성
; Function Attrs: nounwind uwtable 
define i32 @main() #0 { 
entry: 
    %retval = alloca i32, align 4 
    %x = alloca i32, align 4 
    store i32 0, i32* %retval 
    store i32 10, i32* %x, align 4 
    store i32 20, i32* %x, align 4 
    ret i32 0 
} 

SSA 형식에 대한 나의 이해가 정확하다면이 예제에서 x1과 x2는 t로 표시되어야합니다 LLVM IR 변수가 생성되어 각각 10과 20의 두 값을 할당했습니다. SSA IR 표현을 얻기 위해 컴파일해야하는 특정 옵션이 있습니까? 아니면 IR 표현에 대한 이해가 잘못 되었습니까? 제발 조언.

편집 : 하나의 대답에 제안, -mem2reg 최적화 패스를 사용하는 것은 나에게

clang -c -emit-llvm ssa.c -o ssa.bc 
opt -mem2reg ssa.bc -o ssa.opt.bc 
llvm-dis ssa.opt.bc 
cat ssa.opt.ll 

결과 IR은

; Function Attrs: nounwind uwtable 
define i32 @main() #0 { 
entry: 
    ret i32 0 
} 

는 전체 X 할당 최적화있어 모양을 생성 한 다음 출력을 제공 mem2reg 최적화를 사용합니다. 다른 x 값을 생성하고 유지하는 다른 방법은 없습니까?

답변

2

LLVM은 mem2regreg2mem SSA 형식으로 /에서 변환 코드를 전달합니다. opt 도구를 사용하여 실행할 수 있습니다.

+0

mem2reg opt를 시도했지만 변수 x의 사용을 제거합니다 (위의 편집 참조). 나는 또한 else 문에서 x를 사용하여 시도했지만 여전히 x를 모두 제거합니다. IR 출력 및/또는 변수에 대한 여러 배정이있는 샘플 프로그램에 대해 x1 및 x2 변수를 제공하는 정확한 명령을 제공 할 수 있습니까? 결과 IR에는 여러 변수가 있습니까? –

+1

각 할당 후에'x' 변수를 일부 함수로 전달하십시오. 그리고'clang -S -emit-llvm'을 사용하여 직접 .ll을 출력 할 수 있습니다. – arrowd