|
Странности при оптимизации |
|
|
|
Dec 23 2008, 12:40
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380

|
Кстати, раз уж о глюках: У меня при включенной оптимизации компилятор думает, что раз тела у while нет, то можно и зациклить сам на себя БЕЗ проверки условия, т.е. MojBit=1; while(MojBit==1) { }; в асме выглядит так: Addr: rjmp Addr Если в тело хотя бы вставить _NOP(); т.е. while(MojBit==1) {_NOP();}; картина меняется - добавляется загрузка вита в 1 и проверка в теле while. Вопрос знатокам: Почему? Компилятор умнее пользователя? Модератор. Тема выделена как отдельная из другого топика.
|
|
|
|
|
 |
Ответов
|
Dec 25 2008, 21:19
|

Участник

Группа: Свой
Сообщений: 68
Регистрация: 11-12-08
Из: Республика Беларусь, г.Минск
Пользователь №: 42 380

|
Ещё вопросик: Например, компилятор HiTech предупреждает при: Код while(1) { .... } while(1) { .... } типа warning: infinity loop, а вот ИАР не предупреждает, а молча делает...  Но это лирика... У меня (в данном случае ИАР) ругается на переменные, когда я их обзываю volatile на то, что он не может просчитать их значение, т.к. не проинициализированы. А инитить я их не хочу, т.к. эти переменные лежат в озу и должны быть валидны и просле ресета (я их инициализю отдельно, считая их CRC или анализируя флаг сброса по питанию) Вот тут и грабли... (Опять повторю, прогу полностью переписать не cмогу(высшая математика), исправляю за самоучками  )
|
|
|
|
|
Dec 25 2008, 22:26
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(DenisIV @ Dec 25 2008, 23:19)  типа warning: infinity loop, а вот ИАР не предупреждает, а молча делает...  Но это лирика... Это не лирика, это где-то у вас преднамеренно отключены предупреждения (Project->Options->C/C++ compiler->Diagnostics): Код void Test() { while(1) { __no_operation();} while(1) { __no_operation();} }
Warning[Pe128]: loop is not reachable from preceding code D:\****\loader.cpp 75 Цитата(DenisIV @ Dec 25 2008, 23:19)  У меня (в данном случае ИАР) ругается на переменные, когда я их обзываю volatile на то, что он не может просчитать их значение, т.к. не проинициализированы. Давайте так: Есть непонятка, выкладываете код, выкладываете полный текст предупреждения на языке оригинала, будем смотреть. Код volatile int a; volatile int b; volatile int c; void Test() { int Tmp = a; b = Tmp; Tmp = b; c = Tmp; }
Done. 0 error(s), 0 warning(s)
\ In segment DATA_Z, align 4, align-sorted 72 volatile int a; \ a: \ 00000000 DS8 4 73 volatile int b; \ `b`: \ 00000004 DS8 4 74 volatile int c; \ c: \ 00000008 DS8 4
\ In segment CODE, align 4, keep-with-next 75 void Test() 76 { 77 int Tmp = a; \ ??Test: \ 00000000 0248 LDR R0,??Test_1 ;; a \ 00000002 0168 LDR R1,[R0, #+0] 78 b = Tmp; \ 00000004 4160 STR R1,[R0, #+0x4] 79 Tmp = b; \ 00000006 4168 LDR R1,[R0, #+0x4] 80 c = Tmp; \ 00000008 8160 STR R1,[R0, #+0x8] 81 } \ 0000000A 7047 BX LR ;; return \ ??Test_1: \ 0000000C ........ DC32 a Как видите, никакой ругани, делает все, как просилось. Я могу предположить, что ругань выглядит так: Цитата Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement D:\*****\loader.cpp 77 Но она означает вовсе не "не может проинициализировать", а "не определен порядок обращения к volatile-переменным". И вызывает его примерно такой код: Код int a; volatile int b; volatile int c; void Test() { a = b + c; } И это предупреждение совершенно справедливо: стандарт позволяет компилятору изменять порядок вычисления подвыражений. А поскольку одно из свойств volatile-переменных состоит в том, что чтение может изменять ее значение (а таким свойством обладают многие sfr-регистры), то изменение порядка чтения двух volatile-переменных может привести к неожиданным для вас результатам. Поэтому для разрешения неоднозначности надо разделить чтения точками последовательности, т.е. ";" или оператором "запятая", введя временную переменную как я сделал в примере выше. Но это лишь гадание.Если бы вы представили минимальный необходимый для воспроизведения ситуации код - вы бы получили более точный и быстрый ответ. Цитата(DenisIV @ Dec 26 2008, 00:14)  Варнинги достали (>100)  Поэтому бороться надо с их причиной, а не следствием.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
Dec 25 2008, 22:50
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Сергей Борщ @ Dec 26 2008, 01:26)  Это не лирика, это где-то у вас преднамеренно отключены предупреждения (Project->Options->C/C++ compiler->Diagnostics) Угу, и у тебя тоже  не все включено, ибо еще, если мне не изменяет склероз, должено быть что-то типа Еxpression is constant. Цитата(DenisIV @ Dec 26 2008, 00:19)  while(1) { .... } Вобще-то сие однозначно со всех точек зрения пишется так: Код for(;; ) { .... }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
DenisIV Странности при оптимизации Dec 23 2008, 12:40 Палыч Цитата(DenisIV @ Dec 23 2008, 15:40) Вопр... Dec 23 2008, 12:52 DenisIV Цитата(Палыч @ Dec 23 2008, 15:52) Почему... Dec 23 2008, 18:37  Nemo2000 Цитата(DenisIV @ Dec 23 2008, 21:37) Вы з... Dec 23 2008, 19:16 scifi Цитата(DenisIV @ Dec 23 2008, 15:40) Вопр... Dec 23 2008, 14:35 sergeeff Просто не устаю поражаться. На нашем форуме про vo... Dec 23 2008, 22:38 DenisIV Цитата(sergeeff @ Dec 24 2008, 01:38) Про... Dec 23 2008, 23:21  rezident Цитата(DenisIV @ Dec 24 2008, 04:21) И ес... Dec 23 2008, 23:43  sergeeff Цитата(DenisIV @ Dec 24 2008, 03:21) Прош... Dec 24 2008, 01:12 DenisIV 2rezident: со static (и не тоько) разобрался, спас... Dec 24 2008, 02:56 sergeeff Я все не пойму, что за проблемы "с этой оптим... Dec 24 2008, 12:41 DenisIV Цитата(sergeeff @ Dec 24 2008, 15:41) Я в... Dec 24 2008, 12:55  XVR Цитата(DenisIV @ Dec 24 2008, 15:55) Кажд... Dec 24 2008, 14:13   DenisIV Цитата(XVR @ Dec 24 2008, 17:13) Нет. Ком... Dec 24 2008, 15:47    defunct Цитата(DenisIV @ Dec 24 2008, 17:47) А ес... Dec 24 2008, 17:09     DenisIV Цитата(defunct @ Dec 24 2008, 20:09) #pra... Dec 25 2008, 13:17      Сергей Борщ Цитата(DenisIV @ Dec 25 2008, 15:17) Спас... Dec 25 2008, 13:24       DenisIV Цитата(Сергей Борщ @ Dec 25 2008, 16:24) ... Dec 25 2008, 13:36 sergeeff Уважаемый DenisIV!
Если вы хотите быть ... Dec 24 2008, 16:26 zltigo Цитата(sergeeff @ Dec 24 2008, 19:26) Я у... Dec 24 2008, 17:35  sergeeff Цитата(zltigo @ Dec 24 2008, 21:35) Про ... Dec 24 2008, 22:09   zltigo Цитата(sergeeff @ Dec 25 2008, 01:09) К п... Dec 24 2008, 23:00 sergeeff Я не являюсь разрабочиком компиляторов и линкеров.... Dec 25 2008, 01:16 XVR Цитата(sergeeff @ Dec 25 2008, 04:16) Я н... Dec 25 2008, 07:17  Сергей Борщ Цитата(XVR @ Dec 25 2008, 09:17) Вне зави... Dec 25 2008, 10:24   XVR Цитата(Сергей Борщ @ Dec 25 2008, 13:24) ... Dec 26 2008, 08:53    HARMHARM Цитата(XVR @ Dec 26 2008, 10:53) ...
Опти... Dec 26 2008, 23:34     XVR Цитата(HARMHARM @ Dec 27 2008, 02:34) Это... Dec 27 2008, 08:33   Сергей Борщ Цитата(zltigo @ Dec 26 2008, 00:50) Угу, ... Dec 25 2008, 23:15    zltigo Цитата(Сергей Борщ @ Dec 26 2008, 02:15) ... Dec 26 2008, 08:07   DenisIV Цитата(zltigo @ Dec 26 2008, 01:50) Вобще... Dec 26 2008, 12:42    zltigo Цитата(DenisIV @ Dec 26 2008, 15:42) А ес... Dec 26 2008, 13:39     DenisIV Цитата(zltigo @ Dec 26 2008, 16:39) Разум... Dec 26 2008, 16:26      zltigo Цитата(DenisIV @ Dec 26 2008, 19:26) Что ... Dec 26 2008, 16:41 rezident DenisIV, а такой вариант объявления
Код__no_init ... Dec 25 2008, 21:38 DenisIV Цитата(rezident @ Dec 26 2008, 00:38) Den... Dec 25 2008, 22:14 sergeeff Бьярн Страустрап, 1995 г. Введение в язык С++. Гл... Dec 26 2008, 14:29 sergeeff Уважаемый гуру! 1 - она и в Африке 1. А что та... Dec 26 2008, 20:02 zltigo Цитата(sergeeff @ Dec 26 2008, 23:02) Как... Dec 26 2008, 23:10 rezident А не пора ли уже прекратить "религиозные... Dec 26 2008, 23:34 zltigo Цитата(rezident @ Dec 27 2008, 02:34) А н... Dec 26 2008, 23:51  rezident Цитата(zltigo @ Dec 27 2008, 04:51) в слу... Dec 27 2008, 22:18   zltigo Цитата(rezident @ Dec 28 2008, 01:18) В п... Dec 27 2008, 22:38    rezident Цитата(zltigo @ Dec 28 2008, 03:38) После... Dec 27 2008, 23:16     zltigo Цитата(rezident @ Dec 28 2008, 02:16) Про... Dec 28 2008, 00:09      rezident Цитата(zltigo @ Dec 28 2008, 05:09) Значи... Dec 28 2008, 01:23       dch Цитата(rezident @ Dec 28 2008, 04:23) ни ... Dec 28 2008, 01:42       zltigo Цитата(rezident @ Dec 28 2008, 04:23) Спе... Dec 28 2008, 08:37        AHTOXA Цитата(zltigo @ Dec 28 2008, 13:37) Если ... Dec 28 2008, 08:55 sergeeff Да надо плюнуть на все эти глупости, написать:
Ко... Dec 28 2008, 01:49 _Pasha Думаю, что пишу в тему. История такая (WinAVR):
Вс... Dec 28 2008, 08:44 zltigo Цитата(_Pasha @ Dec 28 2008, 11:44) Т.е. ... Dec 28 2008, 09:00 Сергей Борщ Цитата(_Pasha @ Dec 28 2008, 10:44) после... Dec 28 2008, 11:56  _Pasha Цитата(Сергей Борщ @ Dec 28 2008, 15:56) ... Dec 29 2008, 12:33 SysRq Если main() вызывается единожды и до разрешения пр... Dec 29 2008, 11:12 DenisIV Подскажите ещё плиз: У меня на асме для оптимизаци... Dec 30 2008, 20:19 DenisIV Народ, это действительно засада или лыжи не едут..... Jan 18 2009, 10:28 ARV по идее в стандартной библиотеке Си предусмотрен м... Jan 18 2009, 16:54
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|