Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: EWARM 4.41A, EWAVR 4.30A: баг оптимизатора
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
vet
При включении высокого (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
А вы листинг выложите как 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
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
Цитата(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
vet
KRS, тоже проявляется. Обратите внимание на адреса 0000001A-0000001C.
KRS
Но при смене оптимизации на 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я итерация неверная
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.