g ++ O1 não é igual a O0 com todos os sinalizadores de otimização relacionados

Eu sei que o título é um pouco confuso. Deixe-me esclarecer meu problema com um pouco de experiência:

Meu programa se comporta de maneira estranha quando eu o compilo com-O1 flag vs-O0 flag em termos de tempo de execução. Eu sei-O1 flag @ faz muitas otimizações comofauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments (Mais de 40 de acordo com a página de manual). Para descobrir quais otimizações causam esse comportamento, planejo remover sinalizadores um de cada vez, compilar e testar para ver se algo mud

Antes de fazer esse experimento, quero garantir que o programa compilado com-O1 e o programa compilado com-O0 mais todas as bandeiras que-O1 habilita (permite chamar-O0+) se comporta da mesma maneira. Na verdade, espero que ambos os métodos produzam o mesmo arquivo binário, pois os mesmos sinalizadores de otimização estão habilitado

Compilação comO1

CC = g++

CFLAGS = -std=c++11 -Wall -fopenmp
SOURCE = a_count_f.cpp
EXEC = run
INC = inc

all: $(EXEC)
.PHONY: all

$(EXEC): $(SOURCE)
    $(CC) $(CFLAGS) -O1 -o $(EXEC) -I$(INC) $^

Compilação comO0+

CC = g++

CFLAGS = -std=c++11 -Wall -fopenmp
SOURCE = a_count_f.cpp
EXEC = run
INC = inc

OPT_FLAGS = -fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -ftree-builtin-call-dce -fdse -fforward-propagate -fguess-branch-probability -fif-conversion2 -fif-conversion -finline-functions-called-once -fipa-pure-const -fipa-profile -fipa-reference -fmerge-constants -fmove-loop-invariants -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-pta -ftree-ter -funit-at-a-time

all: $(EXEC)
.PHONY: all

$(EXEC): $(SOURCE)
    $(CC) $(CFLAGS) -O0 $(OPT_FLAGS) -o $(EXEC) -I$(INC) $^

No entanto, acabou-O1 e-O0+ dá um resultado bem diferente. Apesar de todas as diferenças de otimizações,-O0 e-O0+ dê resultados muito semelhantes. (Por resultados, quero dizer o tempo de execução)

Verifiquei a compilação com-Q --help=optimizers e a saída confirmou que ambos ativam os mesmos sinalizadore

O próximo passo para mim é comparar os códigos de montagem. Antes de fazer isso, quero perguntar aqui se alguém tem uma idéia do por que isso acontece. Não incluí o código-fonte, pois parece que o problema não está relacionado ao código-fonte. Mas posso anexá-lo, se necessári

versão g ++:g++ (Ubuntu 7.3.0-27ubuntu1~18.04) 7.3.0

questionAnswers(1)

yourAnswerToTheQuestion