Почему (int) (j * 2) компилируется иначе, чем (int) (j + j) для беззнаковых j? - PullRequest
0 голосов
/ 18 апреля 2020

Clang компилирует (clang -O3 -masm=intel) программу

int main(int c, char **v) { unsigned int j; return c < 2 ? j * 2 : 1234; }

в следующее:

xor     ecx, ecx
cmp     edi, 2
mov     eax, 1234
cmovl   eax, ecx
ret

, тогда как компилирует программа

int main(int c, char **v) { unsigned short j; return c < 2 ? j + j : 1234; }

для следующего:

xor     ecx, ecx
cmp     edi, 2
mov     eax, 1234
cmovl   eax, ecx
ret

Также компилирует программу

int main(int c, char **v) { unsigned int j; return c < 2 ? j + j : 1234; }

для следующего:

mov     eax, 1234
ret

Мой вопрос: почему все они обрабатываются по-разному?

Если они неопределяемого поведения, почему компилятор не заставляет их всех просто возвращать 1234?

И в любом случае, почему к j + j и j * 2 относятся по-разному? Они как-то семантически отличаются?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...