2016-02-03 92 views
0

我想复制指令(例如加法二进制操作),并在LLVM IR中显示它们,但以下代码仅返回我构建的第1条指令(add1)。如何返回两者都构建说明?复制llvm指令

 IRBuilder<> builder(op); 

     Value *lhs = op->getOperand(0); 
     Value *rhs = op->getOperand(1); 
     Value *add1 = builder.CreateAdd(lhs, rhs); 
     Value *add2 = builder.CreateAdd(lhs, rhs); 

     for (auto &U : op->uses()) { 
      User *user = U.getUser(); // A User is anything with operands. 
      user->setOperand(U.getOperandNo(), add1); 
      user->setOperand(U.getOperandNo(), add2); 
     } 

回答

1

假设add指令。你有一个BinaryOperator它有两个操作数e.g,:%op = add i32 10, 32 你把它们作为Value *lhs = op->getOperand(0);Value *rhs = op->getOperand(1);

所以票价这么好。现在您在实际添加之前创建两个新的add tnstructions,因为您正在构建您的IRBuilder,op为插入点。

%add1 = add i32 10, 32 
%add2 = add i32 10, 32 
%op = add i32 10, 32 

最后更新您的原始指令如的用户,像其他BinaryOperator%0 = mul i32 %op, %op

当您在循环仔细观察你会发现,你都(ADD1和ADD2)设置为相同的用户的操作数。你的循环之后,乘法会像%0 = mul i32 %add2, %add2

如果转储将指令插入后直接插入BasicBlock,你应该看到类似:

%add1 = add i32 10, 32 
%add2 = add i32 10, 32 
%op = add i32 10, 32 
%0 = mul i32 %add2, %add2 

但是,如果你运行另一个LLVM通执行死代码消除(例如,InstCombine),您将结束:

%add2 = add i32 10, 32 
%0 = mul i32 %add2, %add2 

因为add1没有用户。您立即将add1的用途与add2替换。并且op也不见了,因为所有用户现在都使用add2而不是op

从你的问题很难猜测你的代码是什么意思,但这就是为什么你只能在最终的IR中看到你的指令之一。

+0

非常感谢你,最好使用clone()来复制指令 –