如何重排LLVM GEP指令并获取其完整使用链?
问题原因
Value::use_iterator 遍历的是所有使用当前Value的指令用户,不包含Value自身。你要获取%arrayidx4自身和它的直接用户load指令,需要主动把GEP指令本身加入结果集,再遍历它的使用链。
修复后的遍历代码
if (GetElementPtrInst *gep = dyn_cast<GetElementPtrInst>(inst1)) { // 先输出GEP指令本身 gep->dump(); // 遍历所有使用GEP的指令 for (Value::use_iterator i = gep->use_begin(), e = gep->use_end(); i != e; ++i) { if (Instruction *user = dyn_cast<Instruction>(*i)) { user->dump(); } } }
上述代码运行后,就能输出你预期的%arrayidx4定义和对应load指令两条结果。
GEP重排注意事项
你重排GEP指令时需要保证LLVM IR的def-use顺序约束:
- GEP依赖的索引sext指令(比如
%idxprom3 = sext ...)必须出现在对应GEP之前 - 使用GEP的load指令必须出现在对应GEP之后
- 建议先收集所有需要重排的指令组(每个组包含对应sext、GEP、load指令),按你预期的GEP顺序排序后,统一调用LLVM内置的
Instruction::moveBefore/moveAfter接口移动到目标位置,避免手动调整顺序导致的IR合法性问题。
内容的提问来源于stack exchange,提问作者Darshan Bhat
相关产品推荐
相关产品推荐

