컴파일러가 최적화를 할 때 의존성 파악은 가장 중요한 작업 중 하나다.
데이터 의존성(data dependency)
RAW(Read-After-Write) 의존성
1: x = y + 1;
2: z = x * 2;
WAR(Write-After-Read) 의존성
1: z = x * 2;
2: x = y + 1;
WAW(Write-After-Write)
1: x = z * 2;
2: x = y + 1;
의존성 제거
프로그램 코드가 위 세가지 데이터 의존성중 하나라도 있으면 일단 순서대로 실행해야 정확한 결과를 얻을 수 있다.
하지만 WAR/WAW의 경우 약간의 트릭을 통해 의존성을 제거할 수 있다.
// WAR
1: z = x * 2;
2: x = y + 1;
3: a = x / 2;
// x -> x1
1': z = x * 2;
2': x1 = y + 1;
3': a = x1 / 2;
// WAW
1: x = z * 2;
2: x = y + 1;
3: a = x / 2;
// x -> x1
1': x = z * 2;
2': x1 = y + 1;
3': a = x1 / 2;