用llvm上的Undef值替换要删除指令的所有用法?

我想用一个Undef值替换指令的所有用途,这是一个我想要删除的函数调用。

首先,我宣布我的undef值是这样的

UndefValue *undefval;

然后我尝试替换我的指令的所有用途

currentInst->replaceAllUsesWith(undefval);

currentInst是一个

Instruction* currentInst; 

值是指我目前的指令。 这会导致LLVM产生以下错误ans断言:

opt:/home/troulakis/D​​ocuments/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

  • 在模块“'上运行'功能通过管理器'。

  • 在'@main'函数上运行'RAF'
  • ./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?

    下一篇: LLVM ParseIR Segfault