从LLVM IR中清除基本块中的第一条指令?

问题描述:

我有followint LLVM IR文件从LLVM IR中清除基本块中的第一条指令?

%1 = load i32* %i, align 4 
    %2 = load i32* %j, align 4 
    %3 = icmp sgt i32 %1, %2 
    br i1 %3, label %4, label %6 

; <label>:4          ; preds = %0 
    %5 = load i32* %i, align 4 
    store i32 %5, i32* %k, align 4 
    br label %6 

; <label>:6          ; preds = %5, %0 
    ret i32 0 

在它我第一加载vairable%1和变量 “j” 以%2则 “i” 的我比较大于条件为(i> j)的。基于该分支要么标签4或标签6.我的问题是有两个加载指令为变量“我”一个在第一个基本块和其他在第二个基本块。这里我想删除第二个加载指令。 对此我这样做,因为当我达到第二个加载指令的变量“我”我第二条指令的第一条指令代替了所有用途,然后我删除当前的指令,即第二条。在这里我无法设置指令迭代器指针。我不想为下一条指令设置(存储i32%5,i32 *%k,对齐4)。有其他方法吗? 如果你知道,请让我知道。

+0

不知道我理解你的问题。但我很确定后续的传球应该能够轻松地将你的负荷移除,所以我不会真的打扰。如果您有一个令人信服的理由来删除负载,请重新提出您的问题,因为我无法理解您的问题究竟是什么。 – CAFxX 2012-03-14 05:53:53

+0

我的问题是,删除第二个加载指令后,我想设置指令迭代器,以便在下一次迭代中它应该达到(存储i32%5,i32 *%k,align 4),因为在for循环中,我正在递增指令迭代器。 – damrudhard 2012-03-14 10:04:51

+0

为什么不直接在'inst-> eraseFromParent()'之后调用'BB-> begin()'来获得新的迭代器呢? – CAFxX 2012-03-14 10:58:59

如果我正确地理解了你,你只需要擦除一条指令并不断迭代代码。如果这是正确的,看看这个例子从DeadInstElimintation通(其居lib/Transforms/Scalar/DCE.cpp):

virtual bool runOnBasicBlock(BasicBlock &BB) { 
    bool Changed = false; 
    for (BasicBlock::iterator DI = BB.begin(); DI != BB.end();) { 
    Instruction *Inst = DI++; 
    if (isInstructionTriviallyDead(Inst)) { 
     Inst->eraseFromParent(); 
     Changed = true; 
     ++DIEEliminated; 
    } 
    } 
    return Changed; 
} 

有趣的事情要注意的是迭代器是如何递增。 DI++不是在for的最后一个条款内部完成的,而是分开的,当前的DI分配给Inst。这确保即使删除了InstDI也已经指向下一条指令,因此循环将继续在下一条指令上运行。

+0

我从CAFxX得到了一个解决方案。感谢你也为你提供帮助。 – damrudhard 2012-03-14 13:16:24

+0

@damrudhard:将新迭代器设置为'BB-> begin()'只有在新指令是基本块中的第一个时才会起作用。否则,你会回到几条指示。如果这对你没问题,那就没问题。不过,我认为我的答案中显示的解决方案更通用。 – 2012-03-14 13:34:42

+0

在其他情况下,我将指令迭代器设置为前一条指令,以便在下一次迭代中指向刚刚删除指令后的指令 。 – damrudhard 2012-03-14 14:19:45