Оптимизировать добавить ноль с проходом llvm - PullRequest
0 голосов
/ 13 января 2019
int func(int i){                                                                     
     int j;
     j = i + 0;
     return j;                                                                                                                       
 } 

Я хочу попрактиковаться в прохождении LLVM. Для приведенной выше простой функции c я хочу реализовать оптимизацию алгебраической идентификации X+0 -> X

Я ожидаю, что оптимизированная программа будет

int func(int i){                                                                     
     int j;                                                                       
     j = i // remove the add instruction                                                                     
     return j;                                                                        
 } 

Я читал о IRBuilder, я могу создать Add / Sub / Mul .... много инструкций. Но для обработки вышеуказанного случая я не могу найти никаких совпадений.

что мне делать, чтобы разобраться с вышеуказанным случаем?

Я также думаю, смогу ли я просто удалить инструкцию.

И программа будет

int func(int i){                                                                                                                                       
     return i;                                                                        
 } 

Я не уверен, что llvm сделает это автоматически, как только я удалю бесполезную инструкцию add.

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Для реализации избегайте добавления нулевой оптимизации Необходимые вещи:

  • Найти инструкцию где y=x+0
  • Заменить ВСЕ использование y на x
  • Запись указателя инструкции
  • Удалите потом
0 голосов
/ 14 января 2019

Запуск clang -O0 -S -emit-llvm -o - test.c в вашем коде приводит к следующему IR:

define i32 @func(i32 %i) #0 {
entry:
  %i.addr = alloca i32, align 4
  %j = alloca i32, align 4
  store i32 %i, i32* %i.addr, align 4
  %0 = load i32, i32* %i.addr, align 4
  %add = add nsw i32 %0, 0
  store i32 %add, i32* %j, align 4
  %1 = load i32, i32* %j, align 4
  ret i32 %1
}

Как видите, есть инструкция add nsw i32 %0, 0. Это означает, что clang не оптимизирует его сразу (по крайней мере, на -O0), и это инструкция, которую мы собираемся обработать нашим проходом.

Я опущу шаблонный код, необходимый для добавления вашего собственного прохода, как это подробно описано в документации LLVM.

Пропуск должен делать что-то вроде (псевдокод)

runOnFunction(Function& F)
{
  for(each instruction in F)
    if(isa<BinaryOperator>(instruction))
      if(instruction.getOpcode() == BinaryInstruction::Add)
         if(isa<ConstantInt>(instruction.getOperand(1))
            if(extract value from constant operand and check if it is 0)
              instruction.eraseFromParent()
}
...