使用llvm pass优化添加零

时间:2019-01-13 20:56:43

标签: llvm llvm-ir llvm-c++-api

if there is a date given:
   time.sleep(until the date and time)

我想练习和学习LLVM转换过程。 对于上述简单的c函数,我想实现代数标识优化int func(int i){ int j; j = i + 0; return j; }

我希望优化后的程序是

X+0 -> X

我阅读了有关IRBuilder的信息,可以创建Add / Sub / Mul ....很多说明。但是为了处理上述情况,我找不到任何匹配项。

该如何处理上述情况?

我还认为我是否可以删除指令。

程序将是

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

一旦删除无用的添加指令,我不确定llvm是否会自动执行此操作。

2 个答案:

答案 0 :(得分:1)

在代码上运行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()
}

答案 1 :(得分:0)

要实现避免加零优化 所需要做的事情是:

  • y=x+0
  • 处查找说明
  • y的所有使用x替换
  • 记录指令的指针
  • 随后将其删除