AI 요약
Kavin Gnanapandithan은 RISC-V 타겟 환경에서 LLVM이 GCC 대비 특정 벤치마크 성능이 크게 떨어지는 문제를 발견하고 이를 심층 분석했습니다. Igalia의 성능 비교 사이트에 따르면 SiFive P550 CPU에서 LLVM은 GCC보다 약 8% 더 많은 사이클을 소모하고 있었으며, 이는 최근 LLVM 커밋이 정수-부동소수점 변환(isKnownExactCastIntToFP) 로직을 변경하면서 발생한 24%의 부분적 성능 저하가 주원인이었습니다. 구체적으로는 배정밀도(double) 연산인 fdiv.d(33사이클 지연)가 단정밀도(float) 연산인 fdiv.s(19사이클 지연)를 대체하면서 연산 효율이 급격히 떨어진 것입니다. 작성자는 llvm-mca 도구를 활용해 이전 빌드와 어셈블리 코드를 대조 분석함으로써 문제를 확인했습니다. 최종적으로 getMinimumFPType에 범위 분석 기능을 확장 적용하여 불필요한 배정밀도 변환을 제거하고 다시 단정밀도 연산을 수행하도록 복구하는 패치를 성공적으로 적용했습니다.
핵심 인사이트
- LLVM의 최신 커밋이 RISC-V 타겟에서 약 24~25%의 성능 저하를 유발하는 회귀(Regression) 현상을 발생시킴.
- SiFive P550 CPU 아키텍처 상에서 fdiv.d(64비트)는 33사이클, fdiv.s(32비트)는 19사이클의 명령 대기 시간(Latency) 차이가 존재함.
- 2026년 4월 9일 게시된 이 분석에 따르면, LLVM의 isKnownExactCastIntToFP 패치가 의도치 않게 visitFPTrunc의 정밀도 축소 최적화를 방해함.
- 범위 분석(Range analysis)을 통해 fptrunc(uitofp x double)를 uitofp x to float로 직접 변환하도록 패치를 구현하여 문제를 해결함.
주요 디테일
- Igalia의 벤치마크 비교 데이터에서 LLVM이 GCC 대비 약 8% 더 많은 사이클을 소모하는 현상을 포착하여 분석을 시작함.
- llvm-mca 도구를 사용해 정적 머신 코드 분석을 수행한 결과, 루프 내부에서 예상치 못한 fdiv.d 명령어가 생성되고 있음을 확인.
- 문제의 원인은 fpext(sitofp x to float) to double을 직접 uitofp x to double로 폴딩(Folding)하는 최적화가 하위 단계의 narrowing 최적화를 깨뜨린 데 있음.
- 이전 LLVM 빌드에서는 fdiv.d 대신 fdiv.s를 사용하고 있었음을 대조 분석을 통해 입증함.
- 최종 패치는 getMinimumFPType에 범위 분석을 추가하여 단정밀도로의 안전한 축소가 가능함을 컴파일러가 인식하도록 함.
향후 전망
- 이번 패치 적용으로 RISC-V 환경에서 LLVM의 부동소수점 연산 최적화 능력이 개선되어 GCC와의 성능 격차가 줄어들 것으로 예상됨.
- 컴파일러 최적화 시 정밀도 변환(Casting) 로직이 다른 하위 최적화 단계에 미치는 부수 효과(Side effect)에 대한 검증이 더욱 중요해질 전망.
