以下是我在LLVM LoopPass中的代码。在LLVM LOOP PASS中,我想复制并粘贴一组指令。复制icmp和分支指令时发生错误
virtual bool runOnLoop(Loop* L, LPPassManager &LPM) {
BasicBlock& loopCondBlock = *(L->getHeader());
BasicBlock& loopIncBlock = *(L->getLoopLatch());
BranchInst* brInsInLoopInc = dyn_cast<BranchInst>(loopIncBlock.getTerminator());
for (auto &inst: loopCondBlock) {
auto *new_inst = inst.clone();
new_inst->insertBefore(brInsInLoopInc);
llvm::ValueToValueMapTy vmap;
llvm::RemapInstruction(new_inst, vmap, RF_NoModuleLevelChanges | RF_IgnoreMissingLocals);
}
return true;
}
我想在for.cond中复制指令并将它们粘贴到for.inc上,然后再转到for.cond指令。
例原IR:
for.cond: ; preds = %for.inc, %entry
%0 = load i32, i32* %i, align 4
%cmp = icmp ult i32 %0, 50000000
br i1 %cmp, label %for.body, label %for.end
for.body: ; preds = %for.cond
...
for.inc: ; preds = %for.body
...
br label %for.cond
IR预计:
for.cond: ; preds = %for.inc, %entry
%0 = load i32, i32* %i, align 4
%cmp = icmp ult i32 %0, 50000000
br i1 %cmp, label %for.body, label %for.end
for.body: ; preds = %for.cond
...
for.inc: ; preds = %for.body
...
// ******PASS ADDED******
%4 = load i32, i32* %i, align 4
%cmp2 = icmp ult i32 %4, 50000000
br i1 %cmp2, label %for.body, label %for.end
// ******PASS ADDED******
我的循环及格成绩:
for.cond: ; preds = %for.inc, %entry
%0 = load i32, i32* %i, align 4
%cmp = icmp ult i32 %0, 50000000
br i1 %cmp, label %for.body, label %for.end
for.body: ; preds = %for.inc, %for.cond
...
for.inc: ; preds = %for.body
...
// ******PASS ADDED******
%4 = load i32, i32* %i, align 4
%5 = icmp ult i32 %0, 50000000
br i1 %cmp, label %for.body, label %for.end
// ******PASS ADDED******
br label %for.cond
如何修复ICMP和相关的分支指令是正确的,删除“br标签%for.cond”?
谢谢你的帮助。
谢谢你。我在另一篇文章中看到了这一点,但是它在这一行“vmap [inst] = newInst;”上造成了更多的错误。 –
看到编辑,我忘了“&”。如果您发布了错误消息,我可以早点解决这个问题:-) – PaulR
感谢您的回复。但它也会产生如下错误的IR: “%5 = icmp ult i32%0,50000000”和“br i1%5,标签%for.body,标签%for.end”。它应该使用%cmp进行更正。 –