Имеем (Cortex-M3):
Код
s32 c; //signed int
if ((u32)c < 100000) { //проверка как unsigned int
...
} else {
if (c >= 0) i += 1; //проверка как signed int
i += 1;
}
После компиляции с полной оптимизацией получаем бред:
Код
;if ((u32)c < 100000) {
LDR.W R0,??DataTable21_14;; 0x186a0
CMP R5,R0
BCS.N ??isrTIMER1_13
...
B.N ??isrTIMER1_14
;} else {
; if (c >= 0) i += 1;
??isrTIMER1_13:
ADDS R0,R4,#+1;почему безусловно??? Где IT???
...
; i += 1;
ADDS R4,R0,#+1
;}
??isrTIMER1_14:
...
Куда делось условное исполнение: if (c >= 0) i += 1; ????
Если поставить оптимизацию "Low", то всё нормально - эта строка выполняется по условию (с помощью команд перехода).
При компиляции V5.50.0.51878/W32 for ARM тоже всё ок - строка выполняется условно (с помощью команды IT).
IAR-цы добавили новый баг в оптимизатор?
У кого есть IAR более новый - можете проверить - исправлено это или ещё нет?