이런 종류의 최적화는 정말 흥미로움
컴파일러 최적화는 크게 두 가지로 나뉨 — 데이터 흐름 분석과 패턴 인식 및 대체
첫 번째는 대부분의 프로그램에 효과적이고, 두 번째는 점점 수익이 줄어드는 패턴 누적 작업임
링크된 예시는 똑똑하고 재밌지만 실제로는 큰 가치가 없음. 45년 동안 그런 루프를 작성한 적이 없었음
물론 이런 패턴 치환은 고수준 코드에서 자동으로 생성되기 때문에 여전히 중요함
솔직히 말하면, 내 optimizer가 이런 최적화를 못 해서 약간 투덜거리는 걸 수도 있음
실제로는 생각보다 더 가치가 있을 수도 있음. LLVM의 SCEV(Scalar Evolution) 는 주로 분석용으로 쓰이고, 수학 루프 외의 다른 최적화도 가능하게 함
어떤 최적화를 수행했는지 명확하지 않음. 예전에 틈새용 컴파일러를 만들 때, 내가 직접 작성한 최적화보다 컴파일러가 더 똑똑하게 처리하는 걸 보고 놀랐던 기억이 있음
이건 Scalar Evolution(SCEV) 이라 불리는 기능이며, LLVM에서는 꽤 복잡하게 구현되어 있음
Hacker News 의견들
이 기능을 구현한 코드는 ScalarEvolution.cpp와 IndVarSimplify.cpp에 있음
이런 종류의 최적화는 정말 흥미로움
컴파일러 최적화는 크게 두 가지로 나뉨 — 데이터 흐름 분석과 패턴 인식 및 대체
첫 번째는 대부분의 프로그램에 효과적이고, 두 번째는 점점 수익이 줄어드는 패턴 누적 작업임
링크된 예시는 똑똑하고 재밌지만 실제로는 큰 가치가 없음. 45년 동안 그런 루프를 작성한 적이 없었음
물론 이런 패턴 치환은 고수준 코드에서 자동으로 생성되기 때문에 여전히 중요함
솔직히 말하면, 내 optimizer가 이런 최적화를 못 해서 약간 투덜거리는 걸 수도 있음
이건 Scalar Evolution(SCEV) 이라 불리는 기능이며, LLVM에서는 꽤 복잡하게 구현되어 있음
비슷한 최적화 사례로 “Do not optimize away” 글이 있음
이 최적화의 진짜 멋진 점은 일반화(generic) 되어 있다는 것임
단순히 “유한 정수열의 합” 패턴을 인식하는 게 아니라, 범용적으로 적용된다는 게 인상적임
컴파일러가 더 많은 closed form을 추가할 수도 있을 것 같음. 그럴 가치가 있을까 궁금함
관련 개념으로 Wilf–Zeilberger pair가 있음
또 한 번 GCC가 Clang보다 느린 결과에 놀랐음
GCC가 20년이나 앞서 있었는데도 여전히 Clang이 더 빠른 코드를 내는 경우가 있음
예전에 비트 추출을 할 때 Clang은 두 번의 시프트로 끝냈는데, GCC는 세 번이나 했음
누군가 그래프 색칠 문제(graph coloring) 를 상수로 대체하는 최적화를 시도했을까 궁금함
이건 구현과 명세의 경계를 흐리게 만드는 예시임
우리가 구현을 작성한다고 생각하지만, 사실상 명세의 프록시를 작성하는 셈임
즉, 컴파일러가 명령형 기계의 환상을 만들어내는 것임
처음엔 Matt이 이런 동작을 모른다는 게 놀라웠음
나도 대학 시절 LLVM IR을 가지고 놀다 재귀가 곱셈으로 단순화되는 걸 보고 충격받았음
Matt이 몰랐다는 건, 이 최적화가 그가 다루지 않는 단순한 케이스에만 적용된다는 뜻일 수도 있음
YouTube 영상 링크