Я пытаюсь выяснить, применяет ли GCC частичное устранение мертвого кода оптимизация.
Частичное удаление мертвого кода может рассматриваться как результат двух проходов отказа: назначение утоплено + устранение мертвого кода .Например,
x = 3;
y = p + q; y = p + q; y = p + q;
if(cond) then if(cond) then if(cond) then
x = 5; assn sinking x = 3; dead code eln x = 5;
p = p*q; -----------> x = 5; -------------> p = p*q;
else p = p*q; else
q = p*q; else x = 3;
end if; x = 3; q = p*q;
out(x); q = p*q; end if;
end if; out(x)
out(x)
Я попробовал следующее:
Примечание: все мои наблюдения основаны на файлах дампа, выгруженных на уровне Gimple, а не на уровне RTL.
Версия GCC на моем компьютере: gcc (Ubuntu 7.4.0-1ubuntu1 ~ 18.04.1) 7.4.0.
Я попытался скомпилировать свой код с помощью следующегокоманда:
gcc -O3 -fdump-tree-all pde.c
Я получаю следующие файлы дампа .Существует один с именем pde.c.134t.sink , в котором, как ожидается, будет отображаться поступательное движение хранилища в соответствии с документацией GCC 7.4.0.Но я не могу найти какой-либо тип движения кода ни в одном из файлов дампа уровня gimple.Я не уверен, делает ли он движение кода на уровне RTL?Я перепробовал множество тестов и никогда не видел, чтобы назначение / частичное удаление мертвого кода на уровне Gimple.
Вопрос1: Применяется ли в GCC уменьшение назначения / частичное устранение мертвого кода ?
Вопрос2: Если да, то где я могу это увидеть?