2017-10-01 24 views
1

저는 현재 LLVM을 가지고 놀고 있으며 opt와 clang에 익숙해 지도록 몇 가지 최적화 도구를 작성하려고합니다.LLVM opt mem2reg는 아무런 효과가 없습니다.

clang -emit-llvm -O0 -c test.c -o test.bc 
llvm-dis test.bc 
opt -mem2reg -S test.ll -o test-mem2reg.ll 

모두 .ll : 나는 2 개 .ll 파일, 최적화되지 않은 하나 mem2reg 최적화 패스와 하나가 소스 코드를 컴파일하고 생성

int foo(int aa, int bb, int cc){ 
    int sum = aa + bb; 
    return sum/cc; 
} 

: 나는 다음과 같이있는 TEST.C 파일을 작성 파일은 다음과 같은 결과를 내었습니다 :

ModuleID = 'test.bc' 
source_filename = "test.c" 
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" 
target triple = "x86_64-unknown-linux-gnu" 

; Function Attrs: noinline nounwind optnone uwtable 
define i32 @foo(i32 %aa, i32 %bb, i32 %cc) #0 { 
entry: 
    %aa.addr = alloca i32, align 4 
    %bb.addr = alloca i32, align 4 
    %cc.addr = alloca i32, align 4 
    %sum = alloca i32, align 4 
    store i32 %aa, i32* %aa.addr, align 4 
    store i32 %bb, i32* %bb.addr, align 4 
    store i32 %cc, i32* %cc.addr, align 4 
    %0 = load i32, i32* %aa.addr, align 4 
    %1 = load i32, i32* %bb.addr, align 4 
    %add = add nsw i32 %0, %1 
    store i32 %add, i32* %sum, align 4 
    %2 = load i32, i32* %sum, align 4 
    %3 = load i32, i32* %cc.addr, align 4 
    %div = sdiv i32 %2, %3 
    ret i32 %div 
} 

attributes #0 = { noinline nounwind optnone uwtable "correctly-rounded-divide-sqrt-fp-math"="false" "disable-tail-calls"="false" "less-precise-fpmad"="false" "no-frame-pointer-elim"="true" "no-frame-pointer-elim-non-leaf" "no-infs-fp-math"="false" "no-jump-tables"="false" "no-nans-fp-math"="false" "no-signed-zeros-fp-math"="false" "no-trapping-math"="false" "stack-protector-buffer-size"="8" "target-cpu"="x86-64" "target-features"="+fxsr,+mmx,+sse,+sse2,+x87" "unsafe-fp-math"="false" "use-soft-float"="false" } 

!llvm.module.flags = !{!0} 
!llvm.ident = !{!1} 

!0 = !{i32 1, !"wchar_size", i32 4} 
!1 = !{!"clang version 6.0.0 (trunk 314616)"} 

그래서 내 mem2reg 패스가 작동하지 않는 것 같습니다! 무엇이 문제일까요?

답변

5

최근에 -O0으로 컴파일하면 clang이 각 함수에 optnone 속성을 추가하기 시작하여 이후에 mem2reg 패스를 포함하여 이후의 최적화가 더 이상 이루어지지 않습니다. 이를 방지하려면 clang에 -Xclang -disable-O0-optnone을 추가하십시오.