реклама на сайте
подробности

 
 
> EWARM 4.41A, EWAVR 4.30A: баг оптимизатора, теперь и в 5.11! :)
vet
сообщение Mar 13 2008, 08:25
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 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-й версией, проверьте - не исправлен этот баг?


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
vet
сообщение Mar 13 2008, 08:45
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 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


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 25th July 2025 - 01:53
Рейтинг@Mail.ru


Страница сгенерированна за 0.01378 секунд с 7
ELECTRONIX ©2004-2016