vet 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба При включении высокого (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-й версией, проверьте - не исправлен этот баг? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба А вы листинг выложите как 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
vet 0 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба KRS, тоже проявляется. Обратите внимание на адреса 0000001A-0000001C. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
KRS 1 13 марта, 2008 Опубликовано 13 марта, 2008 · Жалоба Но при смене оптимизации на 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 KRS, тоже проявляется. Обратите внимание на адреса 0000001A-0000001C. А точно каждая 3я итерация неверная Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться