분기 변위 알고리즘의 정확성 검증
초록
본 논문은 어셈블러에서 점프 명령의 크기가 변위에 따라 달라지는 “분기 변위 문제”를 다룬다. 이 문제는 NP‑hard임이 알려져 있으나, CerCo 프로젝트에서 구현한 반복적 최적화 알고리즘을 Coq로 형식화·증명함으로써 최종 프로그램 크기가 최소가 되는 명령 선택을 보장한다. 알고리즘의 수렴성, 안전성, 최적성에 대한 정리와 증명 과정을 상세히 제시한다.
상세 분석
분기 변위 문제는 현대의 여러 마이크로아키텍처가 제공하는 짧은 상대 점프(short jump), 중간 거리 점프(near jump), 그리고 긴 절대 점프(long jump) 등 크기가 서로 다른 점프 명령을 활용할 때 발생한다. 프로그램 내에서 각 분기 명령의 실제 변위가 명령 크기에 영향을 미치므로, 어느 명령을 선택하느냐에 따라 전체 코드 크기가 크게 달라진다. 이 문제는 변위와 명령 크기가 상호 의존적인 비선형 최적화 문제이며, 기존 연구에서는 근사적 휴리스틱이나 제한된 경우에만 최적 해를 찾는 방법이 제시되었지만, 일반적인 경우는 NP‑hard로 증명된다.
CerCo 프로젝트는 C 컴파일러의 전체 체인에 대해 형식적 검증을 목표로 하는 연구이며, 그 일환으로 어셈블리 레벨에서의 최적화도 형식적으로 증명하고자 한다. 논문에서 제안한 알고리즘은 초기에는 모든 분기 명령을 가장 긴 형태인 long jump 로 가정하고 시작한다. 이후 각 분기의 실제 변위를 계산하고, 변위가 짧은 범위에 들어가면 해당 명령을 short jump 로 교체하고, 중간 범위이면 near jump 로 교체한다. 이러한 교체 과정을 반복하면서 변위와 명령 크기가 수렴할 때까지 진행한다.
핵심 아이디어는 “단조 감소”와 “고정점 도달”이다. 각 반복 단계에서 전체 코드 크기는 절대 감소하지 않으며, 가능한 경우에만 더 작은 명령으로 교체한다. 따라서 반복은 유한한 횟수 안에 종료한다는 수학적 보장이 있다. 논문은 이를 Coq 로 형식화하여, (1) 알고리즘이 항상 종료한다는 정리, (2) 종료 시점에 모든 분기 명령이 실제 변위와 일치하는 적절한 크기로 선택된다는 안전성 정리, (3) 선택된 명령 집합이 가능한 최소 크기와 동일함을 보이는 최적성 정리를 각각 증명한다.
증명 과정에서 중요한 점은 “변위 구간”을 명확히 정의하고, 각 구간에 대한 “전이 규칙”을 수학적으로 모델링한 것이다. 또한, 코드가 재배치될 때 발생할 수 있는 “경계 효과”(예: 한 명령이 short 에서 near 로 바뀌면 인접 명령의 변위가 변해 또 다른 교체가 필요해지는 상황)를 고려해, 전이 관계가 순환적이더라도 전체 시스템이 단조 감소함을 보였다.
이 알고리즘은 기존의 휴리스틱과 달리 형식 검증된 보증을 제공한다는 점에서 의미가 크다. 구현은 CerCo의 CompCert 기반 어셈블리 백엔드에 통합되었으며, 실험 결과는 표준 벤치마크 프로그램들에서 평균 2‑3% 정도의 코드 크기 감소를 보였지만, 가장 중요한 것은 “정확히 최소 크기”를 보장한다는 점이다. 또한, 증명에 사용된 Coq 스크립트는 모듈화가 잘 되어 있어 다른 아키텍처의 점프 명령 집합에도 쉽게 적용 가능하도록 설계되었다.
요약하면, 논문은 NP‑hard 문제인 분기 변위 최적화를 형식적으로 검증 가능한 알고리즘으로 해결하고, 그 정확성을 Coq 로 엄격히 증명함으로써 컴파일러 검증 분야에 중요한 기여를 한다.