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];
}
Code language: PHP (php)
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로 설치가능하다)
