LLVM loop unroll and jam pass and view-cfg

llvm에서 unroll and jam pass를 사용하려고 하는데 아무리 해도 되지 않는다;

da,lcssa,loop simplify가 조건이지만 이것은 unroll and jam pass가 시작시에 이미 다 진행하는것을 확인하였고..

다음과 같은 최적화를 추가하면 수행이 된다.

아래는 행렬 연산의 예시이며 loop unroll and jam 이 수행되어야한다.

#define N 256 #define size 1024 int A[size][size]; int B[size][size]; int C[size][size]; void matmul() { int i,j,k; for (i=0; i < N; i++) for (j=0; j < N; j++) for (k=0; k < N; k++) C[i][j] += A[k][i] * B[j][k]; }
clang -Xclang -disable-O0-optnone -emit-llvm matmul.c -S 
opt -stats -debug -loop-unroll-and-jam -allow-unroll-and-jam -unroll-and-jam-count=2 matmul.ll

위처럼 해도 최적화가 수행안되는데 이걸로 삽질을 많이했다.

아래 pass를 추가하면 unroll and jam이 수행된다.

-mem2reg -simplifycfg -loop-rotate -instcombine

그리고 이걸하면서 cfg를 확인할 일이 있어 다음옵션을 유용하게 이용하였다.

opt -view-cfg matmul.ll 을 하면 다음과 같은 cfg가 나오며 xdot을 설치해야 볼수있다.(우분투에서는 sudo apt-get install xdot로 설치가능하다)

댓글을 남겨주세요~