LINUX.ORG.RU

История изменений

Исправление wandrien, (текущая версия) :

Что касается оптимизации кода, то далее в моих планах:

  • Добавить likely(), unlikely(), чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
    /* горячая ветвь */
    pass;
else
    /* холодная ветвь */
    pass;
end:if
  • Если likely(), unlikely() не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной как attribute(cold), то такая ветвь является холодной.

  • Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.

Код наподобие такого:

int f1(int x, y, z) of
    when x == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when y == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when z == 0:
        panic(__FILE__, __LINE__, "invalid x");

    int a = f2(x, y, z);

    when a == 0:
        panic(__FILE__, __LINE__, "invalid a");

    return a;
end

Будет превращен во что-то типа такого:

int f1(int x, y, z) of
    when x == 0: goto panic_x;
    when y == 0: goto panic_y;
    when z == 0: goto panic_z;
    int a = f2(x, y, z);
    when a == 0: goto panic_a;
    return a;

label panic_x:
    panic(__FILE__, __LINE__, "invalid x");
label panic_y:
    panic(__FILE__, __LINE__, "invalid y");
label panic_z:
    panic(__FILE__, __LINE__, "invalid z");
label panic_a:
    panic(__FILE__, __LINE__, "invalid a");
end

(Так как компилятор знает, что panic() не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генерируется.)

  • Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.

Исправление wandrien, :

Что касается оптимизации кода, то далее в моих планах:

  • Добавить likely(), unlikely(), чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
    /* горячая ветвь */
    pass;
else
    /* холодная ветвь */
    pass;
end:if
  • Если likely(), unlikely() не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной как attribute(cold), то такая ветвь является холодной.

  • Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.

Код наподобие такого:

int f1(int x, y, z)
    when x == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when y == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when z == 0:
        panic(__FILE__, __LINE__, "invalid x");

    int a = f2(x, y, z);

    when a == 0:
        panic(__FILE__, __LINE__, "invalid a");

    return a;

Будет превращен во что-то типа такого:

int f1(int x, y, z)
    when x == 0: goto panic_x;
    when y == 0: goto panic_y;
    when z == 0: goto panic_z;
    int a = f2(x, y, z);
    when a == 0: goto panic_a;
    return a;

label panic_x:
    panic(__FILE__, __LINE__, "invalid x");
label panic_y:
    panic(__FILE__, __LINE__, "invalid y");
label panic_z:
    panic(__FILE__, __LINE__, "invalid z");
label panic_a:
    panic(__FILE__, __LINE__, "invalid a");

(Так как компилятор знает, что panic() не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генерируется.)

  • Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.

Исправление wandrien, :

Что касается оптимизации кода, то далее в моих планах:

  • Добавить likely(), unlikely(), чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
    /* горячая ветвь */
	pass;
else
    /* холодная ветвь */
	pass;
end:if
  • Если likely(), unlikely() не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной как attribute(cold), то такая ветвь является холодной.

  • Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.

Код наподобие такого:

int f1(int x, y, z)
    when x == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when y == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when z == 0:
        panic(__FILE__, __LINE__, "invalid x");

    int a = f2(x, y, z);

    when a == 0:
        panic(__FILE__, __LINE__, "invalid a");

    return a;

Будет превращен во что-то типа такого:

int f1(int x, y, z)
    when x == 0: goto panic_x;
    when y == 0: goto panic_y;
    when z == 0: goto panic_z;
    int a = f2(x, y, z);
    when a == 0: goto panic_a;
    return a;

label panic_x:
    panic(__FILE__, __LINE__, "invalid x");
label panic_y:
    panic(__FILE__, __LINE__, "invalid y");
label panic_z:
    panic(__FILE__, __LINE__, "invalid z");
label panic_a:
    panic(__FILE__, __LINE__, "invalid a");

(Так как компилятор знает, что panic() не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генерируется.)

  • Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.

Исправление wandrien, :

Что касается оптимизации кода, то далее в моих планах:

  • Добавить likely(), unlikely(), чтобы указывать компилятору, какие ветви являются горячими, а какие холодными.
if likely(x < y) then
    /* горячая ветвь */
	pass;
else
    /* холодная ветвь */
	pass;
end:if
  • Если likely(), unlikely() не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной как attribute(cold), то такая ветвь является холодной.

  • Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.

Код наподобие такого:

int f1(int x, y, z)
    when x == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when y == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when z == 0:
        panic(__FILE__, __LINE__, "invalid x");

    int a = f2(x, y, z);

    when a == 0:
        panic(__FILE__, __LINE__, "invalid a");

    return a;

Будет превращен во что-то типа такого:

int f1(int x, y, z)
    when x == 0: goto panic_x;
    when y == 0: goto panic_y;
    when z == 0: goto panic_z;
    int a = f2(x, y, z);
    when a == 0: goto panic_a;
    return a;

label panic_x:
    panic(__FILE__, __LINE__, "invalid x");
label panic_y:
    panic(__FILE__, __LINE__, "invalid y");
label panic_z:
    panic(__FILE__, __LINE__, "invalid z");
label panic_a:
    panic(__FILE__, __LINE__, "invalid a");

(Так как компилятор знает, что panic() не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генрируется.)

  • Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.

Исправление wandrien, :

Что касается оптимизации кода, то далее в моих планах:

  • Добавить likely(), unlikely(), чтобы указывать компилятору, какие ветви являются холодными, а какие горячими.
if likely(x < y) then
    /* горячая ветвь */
	pass;
else
    /* холодная ветвь */
	pass;
end:if
  • Если likely(), unlikely() не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной как attribute(cold), то такая ветвь является холодной.

  • Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.

Код наподобие такого:

int f1(int x, y, z)
    when x == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when y == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when z == 0:
        panic(__FILE__, __LINE__, "invalid x");

    int a = f2(x, y, z);

    when a == 0:
        panic(__FILE__, __LINE__, "invalid a");

    return a;

Будет превращен во что-то типа такого:

int f1(int x, y, z)
    when x == 0: goto panic_x;
    when y == 0: goto panic_y;
    when z == 0: goto panic_z;
    int a = f2(x, y, z);
    when a == 0: goto panic_a;
    return a;

label panic_x:
    panic(__FILE__, __LINE__, "invalid x");
label panic_y:
    panic(__FILE__, __LINE__, "invalid y");
label panic_z:
    panic(__FILE__, __LINE__, "invalid z");
label panic_a:
    panic(__FILE__, __LINE__, "invalid a");

(Так как компилятор знает, что panic() не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генрируется.)

  • Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.

Исходная версия wandrien, :

Что касается оптимизации кода, то далее в моих планах:

  • Добавить likely(), unlikely(), чтобы указывать компилятору, какие ветви являются холодными, а какие горячими.
if likely(x < y) then
    /* горячая ветвь */
	pass;
else
    /* холодная ветвь */
	pass;
end:if
  • Если likely(), unlikely() не указаны, то компилятор будет распознавать их автоматически. Если внутри ветви находится вызов функции, помеченной как attribute(cold), то такая ветвь является холодной.

  • Холодные ветви переупорядочиваются так, чтобы находиться после горячего кода.

Код наподобие такого:

int f1(int x, y, z)
    when x == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when y == 0:
        panic(__FILE__, __LINE__, "invalid x");
    when z == 0:
        panic(__FILE__, __LINE__, "invalid x");

    int a = f2(x, y, z);

    when a == 0:
        panic(__FILE__, __LINE__, "invalid a");

    return a;

Будет превращен во что-то типа такого:

int f1(int x, y, z)
    when x == 0: goto panic_x;
    when y == 0: goto panic_y;
    when z == 0: goto panic_z;
    int a = f2(x, y, z);
    when a == 0: goto panic_a;
    return a;

label panic_x:
    panic(__FILE__, __LINE__, "invalid x");
label panic_y:
    panic(__FILE__, __LINE__, "invalid x");
label panic_z:
    panic(__FILE__, __LINE__, "invalid x");
label panic_a:
    panic(__FILE__, __LINE__, "invalid a");

(Так как компилятор знает, что panic() не возвращает управление, то никакого дополнительного кода для «возврата обратно» не генрируется.)

  • Также опционально холодные ветви могут быть оптимизированы по размеру кода, а не по скорости.