В школе, когда мы решали уравнения или считали формулы, мы пытались их сперва сократить несколько раз, к примеру Z = X - (Y + X)
сокращается в Z = -Y
. В современных компиляторах это подмножество так называемых peephole-оптимизаций, в которых мы по, грубо говоря, набору шаблонов сокращаем выражения, заменяем инструкции на более быстрые для конкретного процессора и т.п. В этой статье я собрал наборчик таких оптимизаций, которые удалось найти в исходниках LLVM, GCC и .NET Core (CoreCLR).
Начнем с простых примеров:
X * 1 => X
-X * -Y => X * Y
-(X - Y) => Y - X
X * Z - Y * Z => Z * (X - Y)
проверим последний пример в С++ и в C#:
int Test(int x, int y, int z) {
return x * z - y * z; // => z * (x - y)
}
и посмотрим на ассемблер от Clang (LLVM), GCC, MSVC и .NET Core: