|
|
  |
EWARM 4.41A, EWAVR 4.30A: баг оптимизатора, теперь и в 5.11! :) |
|
|
|
Mar 13 2008, 08:25
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
При включении высокого (9) уровня оптимизации следующий код транслируется с ошибкой: Код #define LIST_CAPACITY 4
typedef struct tag_List { int Addr; struct tag_List *Next; } List;
List list[LIST_CAPACITY];
void ListInit(void) { List *pList; int i;
for (i = 0; i < LIST_CAPACITY-1; i++) { pList = &list[i]; pList->Addr = i; pList->Next = &list[i + 1]; //строка не транслируется } pList->Next = NULL; } На строку, помеченную комментарием, не создается никакого кода. Проявляется при оптимизации и по скорости, и по размеру. На других уровнях оптимизации - порядок. Кто работает с 5-й версией, проверьте - не исправлен этот баг?
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Mar 13 2008, 08:40
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
А вы листинг выложите как 4.x это транслирует. У меня 5.11 компилит праивльно, но такой короткий цикл вообще разворачивает Код In section .text, align 4, keep-with-next 47 void ListInit(void) 48 { 49 List *pList; 50 int i; 51 52 for (i = 0; i < LIST_CAPACITY-1; i++) 53 { 54 pList = &list[i]; 55 pList->Addr = i; \ ListInit: \ 00000000 0848 LDR.N R0,??ListInit_0 ;; list \ 00000002 0021 MOVS R1,#+0 56 pList->Next = &list[i + 1]; //ñòðîêà íå òðàíñëèðóåòñÿ \ 00000004 0200 MOVS R2,R0 \ 00000006 0832 ADDS R2,R2,#+8 \ 00000008 4260 STR R2,[R0, #+4] \ 0000000A 0122 MOVS R2,#+1 \ 0000000C 8260 STR R2,[R0, #+8] \ 0000000E 0200 MOVS R2,R0 \ 00000010 1032 ADDS R2,R2,#+16 \ 00000012 C260 STR R2,[R0, #+12] \ 00000014 0222 MOVS R2,#+2 \ 00000016 0261 STR R2,[R0, #+16] \ 00000018 0200 MOVS R2,R0 \ 0000001A 1832 ADDS R2,R2,#+24 \ 0000001C 4261 STR R2,[R0, #+20] \ 0000001E 0160 STR R1,[R0, #+0] 57 } 58 pList->Next = 0; \ 00000020 4161 STR R1,[R0, #+20] 59 } \ 00000022 7047 BX LR ;; return \ ??ListInit_0: \ 00000024 ........ DC32 list А 4.42 тоже глючит Код 11 void ListInit(void) 12 { 13 List *pList; 14 int i; 15 16 for (i = 0; i < LIST_CAPACITY-1; i++) \ ListInit: \ 00000000 0020 MOVS R0,#+0 \ 00000002 0021 MOVS R1,#+0 17 { 18 pList = &list[i]; \ ??ListInit_0: \ 00000004 044A LDR.N R2,??ListInit_1 ;; list \ 00000006 12EBC102 ADDS R2,R2,R1, LSL #+3 19 pList->Addr = i; \ 0000000A 1160 STR R1,[R2, #+0] 20 pList->Next = &list[i + 1]; //строка не транслируется 21 } \ 0000000C 491C ADDS R1,R1,#+1 \ 0000000E 0329 CMP R1,#+3 \ 00000010 F8DB BLT.N ??ListInit_0 22 pList->Next = 0; \ 00000012 5060 STR R0,[R2, #+4] 23 } \ 00000014 7047 BX LR ;; return \ 00000016 00BF Nop \ ??ListInit_1: \ 00000018 ........ DC32 list
|
|
|
|
|
Mar 13 2008, 08:45
|
Знающий
   
Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32

|
KRS, добавьте итераций в цикл, для ясности. Когда цикл развернут полностью, возможная ошибка маскируется присвоением pList->Next = 0. Оптимизация по размеру: Код // 46 for (i = 0; i < LIST_CAPACITY-1; i++) ??ListInit: MOVS R0,#+0 MOVS R1,#+0 LDR R3,??ListInit_1 ;; list // 47 { // 48 pList = &list[i]; ??ListInit_2: LSLS R2,R1,#+3 ADDS R2,R3,R2 // 49 pList->Addr = i; STR R1,[R2, #+0] // 50 pList->Next = &list[i + 1]; //!!! // 51 } ADDS R1,R1,#+1 CMP R1,#+15 BCC ??ListInit_2 // 52 pList->Next = NULL; STR R0,[R2, #+4] // 53 } ADD SP,SP,#+0 BX LR ;; return Оптимизация по скорости: Код // 46 for (i = 0; i < LIST_CAPACITY-1; i++) MOVS R0,#+0 MOVS R1,#+0 LDR R2,??ListInit_1 ;; list // 47 { // 48 pList = &list[i]; // 49 pList->Addr = i; ??ListInit_2: STR R1,[R2, #+0] // 50 pList->Next = &list[i + 1]; MOVS R3,R2 ADDS R3,R3,#+8 STR R3,[R2, #+4] ADDS R1,R1,#+1 STR R1,[R3, #+0] MOVS R4,R2 ADDS R4,R4,#+16 STR R4,[R3, #+4] ADDS R1,R1,#+1 STR R1,[R4, #+0] MOVS R3,R2 ADDS R3,R3,#+24 STR R3,[R4, #+4] ADDS R1,R1,#+1 STR R1,[R3, #+0] MOVS R4,R2 ADDS R4,R4,#+32 STR R4,[R3, #+4] ADDS R1,R1,#+1 STR R1,[R4, #+0] //!!! // 51 } ADDS R1,R1,#+1 ADDS R2,R2,#+40 CMP R1,#+15 BCC ??ListInit_2 // 52 pList->Next = NULL; STR R0,[R4, #+4] // 53 } POP {R4} ADD SP,SP,#+0 BX LR ;; return
--------------------
Главная линия этого опуса ясна мне насквозь!
|
|
|
|
|
Mar 13 2008, 08:50
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Цитата(vet @ Mar 13 2008, 11:45)  KRS, добавьте итераций в цикл, для ясности. Когда цикл развернут полностью, возможная ошибка маскируется присвоением pList->Next = 0. Добавил, все ок Цикл теперь частично развернут. Код \ In section .text, align 4, keep-with-next 47 void ListInit(void) 48 { 49 List *pList; 50 int i; 51 52 for (i = 0; i < LIST_CAPACITY-1; i++) \ ListInit: \ 00000000 0B4A LDR.N R2,??ListInit_0 ;; list \ 00000002 11B4 PUSH {R0,R4} \ 00000004 0020 MOVS R0,#+0 \ 00000006 0021 MOVS R1,#+0 53 { 54 pList = &list[i]; 55 pList->Addr = i; \ ??ListInit_1: \ 00000008 1160 STR R1,[R2, #+0] 56 pList->Next = &list[i + 1]; //ñòðîêà íå òðàíñëèðóåòñÿ \ 0000000A 1300 MOVS R3,R2 \ 0000000C 0833 ADDS R3,R3,#+8 \ 0000000E 5360 STR R3,[R2, #+4] \ 00000010 491C ADDS R1,R1,#+1 \ 00000012 1400 MOVS R4,R2 \ 00000014 1960 STR R1,[R3, #+0] \ 00000016 1034 ADDS R4,R4,#+16 \ 00000018 5C60 STR R4,[R3, #+4] \ 0000001A 491C ADDS R1,R1,#+1 \ 0000001C 2160 STR R1,[R4, #+0] 57 } \ 0000001E 491C ADDS R1,R1,#+1 \ 00000020 1832 ADDS R2,R2,#+24 \ 00000022 0F29 CMP R1,#+15 \ 00000024 F0DB BLT.N ??ListInit_1 58 pList->Next = 0; \ 00000026 6060 STR R0,[R4, #+4] 59 } \ 00000028 01B0 ADD SP,SP,#+4 \ 0000002A 10BC POP {R4} \ 0000002C 7047 BX LR ;; return \ 0000002E 00BF Nop \ ??ListInit_0: \ 00000030 ........ DC32 list
|
|
|
|
|
Mar 13 2008, 09:00
|

Профессионал
    
Группа: Модераторы
Сообщений: 1 951
Регистрация: 27-08-04
Из: Санкт-Петербург
Пользователь №: 555

|
Но при смене оптимизации на balanced или size код все равно не правильныйbalanced Код 47 void ListInit(void) 48 { 49 List *pList; 50 int i; 51 52 for (i = 0; i < LIST_CAPACITY-1; i++) \ ListInit: \ 00000000 054A LDR.N R2,??ListInit_0 ;; list \ 00000002 0020 MOVS R0,#+0 \ 00000004 0021 MOVS R1,#+0 53 { 54 pList = &list[i]; \ ??ListInit_1: \ 00000006 1300 MOVS R3,R2 55 pList->Addr = i; \ 00000008 1960 STR R1,[R3, #+0] 56 pList->Next = &list[i + 1]; //ñòðîêà íå òðàíñëèðóåòñÿ 57 } \ 0000000A 491C ADDS R1,R1,#+1 \ 0000000C 0832 ADDS R2,R2,#+8 \ 0000000E 0F29 CMP R1,#+15 \ 00000010 F9DB BLT.N ??ListInit_1 58 pList->Next = 0; \ 00000012 5860 STR R0,[R3, #+4] 59 } \ 00000014 7047 BX LR ;; return \ 00000016 00BF Nop \ ??ListInit_0: \ 00000018 ........ DC32 list size Код \ In section .text, align 4, keep-with-next 47 void ListInit(void) 48 { 49 List *pList; 50 int i; 51 52 for (i = 0; i < LIST_CAPACITY-1; i++) \ ListInit: \ 00000000 054A LDR.N R2,??ListInit_0 ;; list \ 00000002 0020 MOVS R0,#+0 \ 00000004 0021 MOVS R1,#+0 53 { 54 pList = &list[i]; \ ??ListInit_1: \ 00000006 12EBC103 ADDS R3,R2,R1, LSL #+3 55 pList->Addr = i; \ 0000000A 1960 STR R1,[R3, #+0] 56 pList->Next = &list[i + 1]; //ñòðîêà íå òðàíñëèðóåòñÿ 57 } \ 0000000C 491C ADDS R1,R1,#+1 \ 0000000E 0F29 CMP R1,#+15 \ 00000010 F9DB BLT.N ??ListInit_1 58 pList->Next = 0; \ 00000012 5860 STR R0,[R3, #+4] 59 } \ 00000014 7047 BX LR ;; return \ 00000016 00BF Nop \ ??ListInit_0: \ 00000018 ........ DC32 list Цитата(vet @ Mar 13 2008, 11:55)  KRS, тоже проявляется. Обратите внимание на адреса 0000001A-0000001C. А точно каждая 3я итерация неверная
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|