Перейти к содержанию
    

EWARM 4.41A, EWAVR 4.30A: баг оптимизатора

При включении высокого (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-й версией, проверьте - не исправлен этот баг?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А вы листинг выложите как 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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, добавьте итераций в цикл, для ясности. Когда цикл развернут полностью, возможная ошибка маскируется присвоением 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Но при смене оптимизации на 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я итерация неверная

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...