2016-02-03 121 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()來複制指令 –