Запуск 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()
}