LINUX.ORG.RU

gcc. man врет про -O1


0

0

имеется кросскомпилятор (gcc 3.3.6, патченый на предмет iwmmxt).

при сборке с -O1 у программы (sqlite3 разных версий) напрочь убивается логика. нужно вычислить, какая из включающихся по -O1 оптимизаций к этому приводит и отключить ее.

сборка с -O0 и включением всех оптимизаций, якобы включающихся по -O1 и , согласно ману, не приводит к багу (программа работает правильно).

сборка с -O1 и последующим выключеним всех оптимизаций, якобы влючающихся по -O1, _приводит_ к багу.

отсюда делаю вывод, что man врет про оптимизации.

как выянить, что именно происходит при -O1?

anonymous

gcc -Q -O1 --help=optimizers

Выдаст все опции оптимизации и их состояние (вкл/выкл). Для удобства можно селать примерно так:

gcc -Q -O1 --help=optimizers | grep enabled

Deleted
()
Ответ на: комментарий от anonymous

Хм... Видимо в GCC 3.3.6 эта опция как-то по-другому работает или
вообще не работает. Посмотри man на тему -Q и --help. Вот например
что выдаёт gcc 4.3.1:

ivan@localhost ~ $ gcc -Q -O1 --help=optimizers
Следующие ключи контролируют оптимизацию:
  -falign-jumps                         [выключено]
  -falign-labels                        [выключено]
  -falign-loops                         [включено]
  -fargument-alias                      [включено]
  -fargument-noalias                    [выключено]
  -fargument-noalias-anything           [выключено]
  -fargument-noalias-global             [выключено]
  -fasynchronous-unwind-tables          [включено]
  -fbranch-count-reg                    [включено]
  -fbranch-probabilities                [выключено]
  -fbranch-target-load-optimize         [выключено]
  -fbranch-target-load-optimize2        [выключено]
  -fbtr-bb-exclusive                    [выключено]
  -fcaller-saves                        [выключено]
  -fcommon                              [включено]
  -fcprop-registers                     [включено]
  -fcrossjumping                        [выключено]
  -fcse-follow-jumps                    [выключено]
  -fcse-skip-blocks                     [выключено]
  -fcx-limited-range                    [выключено]
  -fdata-sections                       [выключено]
  -fdce                                 [включено]
  -fdefer-pop                           [включено]
  -fdelayed-branch                      [выключено]
  -fdelete-null-pointer-checks          [выключено]
  -fdse                                 [включено]
  -fearly-inlining                      [включено]
  -fexceptions                          [выключено]
  -fexpensive-optimizations             [выключено]
  -ffinite-math-only                    [выключено]
  -ffloat-store                         [выключено]
  -fforward-propagate                   [выключено]
  -fgcse                                [выключено]
  -fgcse-after-reload                   [выключено]
  -fgcse-las                            [выключено]
  -fgcse-lm                             [включено]
  -fgcse-sm                             [выключено]
  -fguess-branch-probability            [включено]
  -fhandle-exceptions
  -fif-conversion                       [включено]
  -fif-conversion2                      [включено]
  -finline-functions                    [выключено]
  -finline-functions-called-once        [включено]
  -finline-small-functions              [выключено]
  -fipa-cp                              [выключено]
  -fipa-matrix-reorg                    [выключено]
  -fipa-pta                             [выключено]
  -fipa-pure-const                      [включено]
  -fipa-reference                       [включено]
  -fipa-type-escape                     [выключено]
  -fivopts                              [включено]
  -fjump-tables                         [включено]
  -fmerge-all-constants                 [выключено]
  -fmerge-constants                     [включено]
  -fmodulo-sched                        [выключено]
  -fmove-loop-invariants                [включено]
  -fnon-call-exceptions                 [выключено]
  -fomit-frame-pointer                  [включено]
  -foptimize-register-move              [выключено]
  -foptimize-sibling-calls              [выключено]
  -fpack-struct                         [выключено]
  -fpack-struct=<number>
  -fpeel-loops                          [выключено]
  -fpeephole                            [включено]
  -fpeephole2                           [выключено]
  -fpredictive-commoning                [выключено]
  -fprefetch-loop-arrays                [выключено]
  -freg-struct-return                   [выключено]
  -fregmove                             [выключено]
  -frename-registers                    [включено]
  -freorder-blocks                      [выключено]
  -freorder-blocks-and-partition        [выключено]
  -freorder-functions                   [выключено]
  -frerun-cse-after-loop                [включено]
  -freschedule-modulo-scheduled-loops   [выключено]
  -frounding-math                       [выключено]
  -frtl-abstract-sequences              [выключено]
  -frtti
  -fsched-interblock                    [включено]
  -fsched-spec                          [включено]
  -fsched-spec-load                     [выключено]
  -fsched-spec-load-dangerous           [выключено]
  -fsched-stalled-insns                 [выключено]
  -fsched-stalled-insns-dep             [включено]
  -fsched2-use-superblocks              [выключено]
  -fsched2-use-traces                   [выключено]
  -fschedule-insns                      [выключено]
  -fschedule-insns2                     [выключено]
  -fsection-anchors                     [выключено]
  -fshort-double
  -fshort-enums
  -fshort-wchar
  -fsignaling-nans                      [выключено]
  -fsigned-zeros                        [включено]
  -fsingle-precision-constant           [выключено]
  -fsplit-ivs-in-unroller               [включено]
  -fsplit-wide-types                    [включено]
  -fstrict-aliasing                     [выключено]
  -fthread-jumps                        [выключено]
  -fno-threadsafe-statics
  -ftoplevel-reorder                    [включено]
  -ftrapping-math                       [включено]
  -ftrapv                               [выключено]
  -ftree-ccp                            [включено]
  -ftree-ch                             [включено]
  -ftree-copy-prop                      [включено]
  -ftree-copyrename                     [включено]
  -ftree-cselim                         [включено]
  -ftree-dce                            [включено]
  -ftree-dominator-opts                 [включено]
  -ftree-dse                            [включено]
  -ftree-fre                            [включено]
  -ftree-loop-im                        [включено]
  -ftree-loop-ivcanon                   [включено]
  -ftree-loop-linear                    [выключено]
  -ftree-loop-optimize                  [включено]
  -ftree-lrs                            [выключено]
  -ftree-pre                            [выключено]
  -ftree-reassoc                        [включено]
  -ftree-salias                         [включено]
  -ftree-scev-cprop                     [включено]
  -ftree-sink                           [включено]
  -ftree-sra                            [включено]
  -ftree-store-ccp                      [выключено]
  -ftree-ter                            [включено]
  -ftree-vect-loop-version              [включено]
  -ftree-vectorize                      [выключено]
  -ftree-vrp                            [выключено]
  -funit-at-a-time                      [включено]
  -funroll-all-loops                    [выключено]
  -funroll-loops                        [выключено]
  -funsafe-loop-optimizations           [выключено]
  -funsafe-math-optimizations           [выключено]
  -funswitch-loops                      [выключено]
  -funwind-tables                       [выключено]
  -fvar-tracking                        [включено]
  -fvar-tracking-uninit                 [выключено]
  -fvariable-expansion-in-unroller      [выключено]
  -fvect-cost-model                     [включено]
  -fvpt                                 [выключено]
  -fweb                                 [включено]
  -fwhole-program                       [выключено]
  -fwrapv                               [выключено]

Deleted
()

Use the Source, Luke

> имеется кросскомпилятор (gcc 3.3.6, патченый на предмет iwmmxt).

Боюсь, Вам мало кто поможет со столь старым компилятором.

> отсюда делаю вывод, что man врет про оптимизации.

Возможно, но не обязательно. Как вариант -- код библиотеки использует
gccизмы, которые по-разному работают в зависивости от того, включена
оптимизация или нет.

> как выянить, что именно происходит при -O1?

Кроме очевидного (RTFS), можно попробовать вот что. Собрать библиотеку
с CFLAGS="-v -save-temps -O1 -fno-foo -fno-bar", сохранить весь получившийся
asm (*.s файлы), потом собрать ее с CFLAGS="-v -save-temps -O0", и сравнить,
как поменялся asm. И втыкать все новые и новые -fno-*, пока он не станет
одинаковым (если вообще такое будет).

Dselect ★★★
()
Ответ на: Use the Source, Luke от Dselect

>Как вариант -- код библиотеки использует gccизмы, которые по-разному работают в зависивости от того, включена оптимизация или нет.

то есть у gcc есть разница между -Oномер и простым перечислением соответствующих оптимизаций, или нет?

>CFLAGS="-v -save-temps -O1 -fno-foo -fno-bar"

ага. попробую

anonymous
()
Ответ на: комментарий от alex_custov

>а какая версия компилятора ?

написал же в первом посте. 3.3.6 патченый.

anonymous
()
Ответ на: комментарий от anonymous

>> то есть у gcc есть разница между -Oномер и простым перечислением соответствующих оптимизаций, или нет?

Разницы нет. -On - это просто "метафлаг", который включает в себя определённый набор более мелких флагов оптимизации.

Deleted
()
Ответ на: комментарий от Deleted

>Разницы нет. -On - это просто "метафлаг", который включает в себя определённый набор более мелких флагов оптимизации.

ага. ну вот мне список этих мелких флагов и нужен.

anonymous
()
Ответ на: комментарий от anonymous

попробуй вот так:
gcc -O1 -S -fverbose-asm a.c

и в a.s в самом начале будет что-то типа такого:
        .file   "a.c"
# GNU C version 3.3.6 (Debian 1:3.3.6-15) (i486-linux-gnu)
#       compiled by GNU C version 3.3.6 (Debian 1:3.3.6-15).
# GGC heuristics: --param ggc-min-expand=100 --param ggc-min-heapsize=131072
# options passed:  -D__GNUC__=3 -D__GNUC_MINOR__=3 -D__GNUC_PATCHLEVEL__=6
# -auxbase -O1 -fverbose-asm
# options enabled:  -fdefer-pop -fthread-jumps -fpeephole -ffunction-cse
# -fkeep-static-consts -fpcc-struct-return -fgcse-lm -fgcse-sm
# -floop-optimize -fcrossjumping -fif-conversion -fif-conversion2
# -fsched-interblock -fsched-spec -fbranch-count-reg -fcprop-registers
# -fcommon -fverbose-asm -fgnu-linker -fargument-alias -fmerge-constants
# -fzero-initialized-in-bss -fident -fguess-branch-probability -fmath-errno
# -ftrapping-math -m80387 -mhard-float -mno-soft-float -mieee-fp
# -mfp-ret-in-387 -maccumulate-outgoing-args -mcpu=pentiumpro -march=i486

        .section        .rodata.str1.1,"aMS",@progbits,1

Eshkin_kot ★★
()
Ответ на: комментарий от Eshkin_kot

--- 0/sqlite3.o   2008-06-18 03:51:51.000000000 +0300
+++ 1/sqlite3.o   2008-06-18 03:51:05.000000000 +0300
@@ -24,7 +24,7 @@
 @ -DQT_QWS_DISABLE_FLUSHCLIPPING -DQPE_NO_COMPAT
 @ -DBUILDER="muromec@lightmare" -DNDEBUG -DSQLITE_OMIT_LOAD_EXTENSION
 @ -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQTOPIA_TARGET="sqlite"
-@ -march=iwmmxt -mtune=iwmmxt -mapcs-32 -auxbase-strip -O0 -Wall -W
+@ -march=iwmmxt -mtune=iwmmxt -mapcs-32 -auxbase-strip -O1 -Wall -W
 @ -fno-exceptions -fdefer-pop -fomit-frame-pointer -fthread-jumps
 @ -fpeephole -ffunction-cse -fkeep-static-consts -freg-struct-return
 @ -fgcse-lm -fgcse-sm -floop-optimize -fcrossjumping -fif-conversion

все параметры оптимизации перекрываются после -On, но код все равно получается разный. чтозанафиг?

-- makefile:
++ makefile
-               -O0  -fdefer-pop -fomit-frame-pointer -fthread-jumps \
+               -O1  -fdefer-pop -fomit-frame-pointer -fthread-jumps \
 -fpeephole -ffunction-cse -fkeep-static-consts -freg-struct-return  \
 -fgcse-lm -fgcse-sm -floop-optimize -fcrossjumping -fif-conversion \
  -fsched-interblock -fsched-spec -fbranch-count-reg \
 -fcprop-registers -fcommon -fverbose-asm -fgnu-linker -fargument-alias \
 -fmerge-constants -fzero-initialized-in-bss -fident \
 -fguess-branch-probability -fmath-errno -ftrapping-math -mapcs-32  -fno-if-conversion2\
 -S -fverbose-asm 

Muromec ☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.