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是否会自动执行此操作。
答案 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
替换