用llvm上的Undef值替换要删除指令的所有用法?
我想用一个Undef值替换指令的所有用途,这是一个我想要删除的函数调用。
首先,我宣布我的undef值是这样的
UndefValue *undefval;
然后我尝试替换我的指令的所有用途
currentInst->replaceAllUsesWith(undefval);
currentInst是一个
Instruction* currentInst;
值是指我目前的指令。 这会导致LLVM产生以下错误ans断言:
opt:/home/troulakis/Documents/LLVM_Project/llvm/llvm/lib/IR/Value.cpp:332:void llvm :: Value :: replaceAllUsesWith(llvm :: Value *):断言`New-> getType()= = getType()&&“replaceAllUses使用不同类型的新值!”'失败。
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 /本地/仓的/ 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主目录(/ 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
在模块“'上运行'功能通过管理器'。
./PassRAF:第15行:7227中止(核心转储)
任何想法有什么不对? 我错误地声明了undef值?
当你写这个:
UndefValue *undefval;
你只是声明一个类型为UndefValue
的指针,而不是在其中存储任何东西。 相反,您需要使用UndefValue::get
factory函数为您要替换的指令的类型获取UndefValue
的实例。 像这样的东西:
currentInst->replaceAllUsesWith(UndefValue::get(currentInst->getType())
链接地址: http://www.djcxy.com/p/68693.html
上一篇: Replace all uses of an instruction to delete with an Undef value at llvm?