GCC не тонет назначения и не устраняет частично мертвые коды - PullRequest
2 голосов
/ 20 июня 2019

Я пытаюсь выяснить, применяет ли 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: Если да, то где я могу это увидеть?

1 Ответ

0 голосов
/ 20 июня 2019

Похоже, что то, что вы используете в качестве источника ссылки, не соответствует форме статического одиночного назначения (SSA). На самом раннем этапе GCC преобразует программу в форму SSA (в проходе ssa). В форме SSA этот вид затухания назначения не имеет значения, потому что затухание неявно представлено в том, как работают фи-узлы. Если перед преобразованием в форму SSA было выполнено уменьшение назначения, это просто увеличило бы количество имен SSA и, таким образом, создало бы больше работы для дальнейшей оптимизации.

...