【问题标题】:replacing use of one def with other def in llvm IR在 llvm IR 中将一个 def 替换为另一个 def
【发布时间】:2014-02-19 21:34:33
【问题描述】:

我有以下 IR:

%2 = load i32* %b, align 4
store i32 %2, i32* %a, align 4
%3 = load i32* %a, align 4
store i32 %3, i32* %b, align 4

本质上是

a=b; b=a;

现在,在复制传播之后,我想要这样的东西:

a=b; b=b;

所以,我这样做:

i->setOperand(0,op1)  //op1 points to %b, i points to  [%3 = load i32* %a, align 4]
i->replaceUsesOfWith(op2,op1); //op2 points to %a

这样做,我进入了上述 IR 的无限循环。所以我觉得从 op1 的使用中删除 i 并将 i 添加到 op2 的使用中存在一些问题。 但是,代码运行良好,例如:

a=b; c=a; 

转换后我得到:a=b; c=b;

【问题讨论】:

  • 我不知道它为什么挂起,但我确信您的代码没有按照您的想法执行。具体来说,i->setOperand(0,op1)i->replaceUsesOfWith(op2,op1) 在这种情况下做同样的事情,所以调用它们没有任何意义。
  • 是的,我删除了 setOperand() 和相同的结果。但是,关键是在 i 中将 op2 替换为 op1 之后,如何从 op2 的使用中删除指令 i。 (我也试过 ReplaceInstWithInst 但同样的无限循环)

标签: llvm llvm-ir


【解决方案1】:

ReplaceInstWithInst() 完成这项工作,问题是当 op1 和 op2 都指向同一个操作数时,它会不断替换并进入无限循环。所以,只需要添加一个检查 op1 != op2

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多