Зачем он для такой строчки на 69, 70ой строчке добавляет к j такую странную константу.
В конечном коде выглядит действительно загадочно. Если вызывать компилятор с ключом
-fdump-tree-all
(фиг знает, как сделать это на godbolt.org, я проверял локально), то уже в самом первом дампе можно увидеть, что
if (arr[j - 1] > arr[j])
превращается в это:
if (*(arr + ((sizetype) j + 1073741823) * 4) > *(arr + (sizetype) ((unsigned int) j * 4)))
1073741823 -- это 0x3fffffff, 30 единичных бит, т.е. 30-битная -1. Дальше
j + 1073741823
превратилось в
add r3, r3, #1073741824
subs r3, r3, #1
т.е. в
j + 1073741824 - 1
. После умножения на 4 старшие два бита j теряются, но в чём смысл использования 30-битной -1 вместо 32-битной -- мне непонятно.
Поскольку константа появляется ещё до начала архитектурно-зависимых преобразований, она фигурирует в выводе для всех 32-битных архитектур поддерживаемых gcc. Интересно, что это началось между gcc-4.6 и gcc-5, до этого в этом месте генерировался просто
sub r3, r3, #1
. Ещё интересно, что даже с
-O2
эта константа остаётся в сгенерированном коде, а исчезает только с
-Os
. Выглядит как регрессия.