컴파일러 최적화 종류와 기법 정리
컴파일러 Back-end에서는 어떻게든 머신 인스트럭션의 갯수를 하나라도 줄이고자 노력한다. 컴파일러 최적화 기법은 컴파일러마다 다양하지만, 일반적으로 많이 사용되는 것은 주로 상수 연산을 최대한 줄이는 것이다. 다음 기법들은 일반적인 컴파일러에서 통용되는 최적화 기법들이다.
1. Copy propagation
Copy propagation은 직접 할당의 대상을 해당 값으로 대체하는 최적화 과정이다. 아래와 같이 y = x의 직접 할당은 해당 값으로 대체될 수 있다.
최적화 이전
최적화 이후
2. Constant folding
Constant Folding은 런타임에 계산 전, 컴파일 타임에 상수 표현을 인식하고 처리하는 최적화 과정이다.
최적화 이전
1스텝 진행 결과
2번째 줄, b의 할당 값인 9 - (a / 5)에 a의 상수값이 들어가고 계산되었다.
2스텝 진행 결과
5번째 줄, c의 할당 값인 b * 4에 b의 상수값이 들어가고 계산되었다. 6번째 줄의 조건문은 true로 치환되었다. 7번째 줄의 c의 할당 값인 c - 10도 계산되었다.
3스텝 진행 결과
2번째 줄, 변수 c의 선언문과 5번째 줄의 c의 할당문이 합쳐진다. 그리고 사용되지 않는 값인 a, b의 선언문이 있는 1,2번째 줄은 제거된다.
최종 최적화 결과
c의 값을 알았으므로, 리턴값이 4인 것을 구할 수 있다. 그 외 다른 문장들은 사용하지 않게되어 제거된다. 실제 컴파일된 바이너리는 상수 4를 반환하는 머신 인스트럭션만을 수행할 것이다.
3. Common subexpression elimination
Common subexpression elimination, 이하 CSE는 동일한 subexpression에 대해서 한단계 상위로 올려서 연산의 수를 줄이는 최적화 방법이다.
최적화 이전
최적화 이후