컴파일러 최적화에 관한 두 연구
LLVM 컴파일러 최적화 연구 글에서는 LLVM 22.1.0을 기반으로 두 가지 사례를 통해 컴파일러 최적화 과정을 상세히 분석합니다.
첫 번째 사례는 모듈러 증가 연산으로, 동적 값에 의한 나눗셈을 조건부 이동(cmov)으로 대체하는 최적화 과정을 설명하며, C++23의 [[assume]] 속성이 컴파일러에게 사전 조건을 알려 최적화를 가능하게 하는 과정을 소개합니다.
두 번째 사례는 엔디언 변환으로, 바이트 단위 로드를 여러 번 수행하는 코드를 단일 32/64비트 로드와 바이트 스왑 명령어로 변환하는 과정을 다룹니다. 특히, Instruction Selection(ISel) 단계에서 발생하는 DAGCombiner의 바이트 출처 추적과, 템플릿 인스턴스화 및 루프 언롤링이 최적화에 미치는 영향을 심도 있게 설명합니다.
글은 컴파일러 내부 최적화 패스들의 역할과 순서가 최종 성능에 큰 영향을 미치며, 명확한 의도 표현(템플릿, 어서션, assume 등)과 잘 알려진 코드 패턴을 사용하는 것이 최적화에 유리하다는 점을 강조합니다.
마지막으로, 최적화가 항상 완벽하지 않음을 보여주는 예시를 통해, 중복 로드 제거 실패나 크기 최적화(-Os) 시 루프 언롤링 미적용 문제 등 현실적인 한계도 함께 제시합니다.