我想用Undef值替换一条指令的所有用法,这是一个我要删除的函数调用。
首先,我声明我的undef值如此
UndefValue *undefval;
然后我尝试替换我的指令的所有用途
currentInst->replaceAllUsesWith(undefval);
currentInst 是
Instruction* currentInst;
值指的是我当前的指令。这会导致LLVM产生以下错误和断言:
opt:/home/troulakis/Documents/LLVM_Project/llvm/llvm/lib/IR/Value.cpp:332:void llvm :: Value :: replaceAllUsesWith(llvm :: Value *):断言`New-> getType()== getType()&& “将所有价值替换为不同类型的新价值!”'失败。
0 0x160e678 llvm :: sys :: PrintStackTrace(_IO_FILE *) (/ usr / local / bin / opt + 0x160e678)1 0x160fbdb (/ usr / local / bin / opt + 0x160fbdb)2 0x7f7752596340 __restore_rt (/lib/x86_64-linux-gnu/libpthread.so.0+0x10340)3 0x7f77515aacc9 gsignal(/lib/x86_64-linux-gnu/libc.so.6+0x36cc9)4 0x7f77515ae0d8 中止(/lib/x86_64-linux-gnu/libc.so.6+0x3a0d8)5 0x7f77515a3b86 (/lib/x86_64-linux-gnu/libc.so.6+0x2fb86)6 0x7f77515a3c32 (/lib/x86_64-linux-gnu/libc.so.6+0x2fc32)7 0x15be04f (/ usr / local / bin / opt + 0x15be04f)8 0x7f775136fda7(匿名 命名空间)::为mypass :: runOnFunction(LLVM ::功能与安培) (../../../Release+Asserts/lib/PassRAF.so+0x6da7)9 0x15a1ab4 LLVM :: FPPassManager :: runOnFunction(LLVM ::功能与安培) (/ usr / local / bin / opt + 0x15a1ab4)10 0x15a1d3b LLVM :: FPPassManager :: runOnModule(LLVM ::模块&安培) (/ usr / local / bin / opt + 0x15a1d3b)11 0x15a22d7 LLVM ::遗留:: PassManagerImpl ::运行(LLVM ::模块&安培) (/ usr / local / bin / opt + 0x15a22d7)12 0x5af6db main (/ usr / local / bin / opt + 0x5af6db)13 0x7f7751595ec5 __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x21ec5)14 0x59f559 _start (/ usr / local / bin / opt + 0x59f559)
堆栈转储:
程序参数:opt -load ../../../Release+Asserts/lib/PassRAF.so -time-passes -instnamer -PassRAF
在模块''上运行'功能通过管理器'。
- 在函数'@main'
上运行'R A F' 醇>./ PassRAF:第15行:7227中止(核心倾销)
任何想法有什么不对?我有错误的undef值声明吗?
答案 0 :(得分:3)
当你这样写:
UndefValue *undefval;
您只是声明一个类型为UndefValue
的指针,而不是在其中存储任何内容。相反,您需要使用UndefValue::get
工厂函数为要替换的指令类型获取UndefValue
的实例。像这样:
currentInst->replaceAllUsesWith(UndefValue::get(currentInst->getType())