C언어 strict aliasing과 restrict — gcc/clang 최적화를 어셈블리로 확인하기
-O0에서 잘 돌던 코드가 -O2로 올리면 값이 달라진다. 디버거로 들여다보면 메모리에는 올바른 값이 들어 있는데 함수가 엉뚱한 값을 반환한다. 대개 범인은 두 가지다. 서로 다른 타입의 포인터로 같은 메모리를 건드리는…
-O0에서 잘 돌던 코드가 -O2로 올리면 값이 달라진다. 디버거로 들여다보면 메모리에는 올바른 값이 들어 있는데 함수가 엉뚱한 값을 반환한다. 대개 범인은 두 가지다. 서로 다른 타입의 포인터로 같은 메모리를 건드리는…
ARM64 서버나 모바일 SoC에서 배열 연산이 많은 코드를 최적화할 때 "컴파일러가 알아서 벡터화해주겠지"라고 믿고 넘어가기 쉽다. 하지만 최적화 레벨이나 포인터 별칭(aliasing) 여부에 따라 auto-vectorization이 조용히 실패하고 스칼라 코드가 그대로 나오는…