【问题标题】:Not able to erase LLVM instruction无法擦除 LLVM 指令
【发布时间】:2015-08-07 23:12:14
【问题描述】:

我有关注 LLVM sn-p。

invoke.cont22:                                    ; preds = %invoke.cont14
  %coerce.dive34 = getelementptr %"class.thrust::iterator_adaptor.33"* %coerce.dive33, i32 0, i32 0
  %8 = load i32** %coerce.dive34
  %coerce.dive39 = getelementptr %"class.thrust::iterator_adaptor.33"* %coerce.dive38, i32 0, i32 0
  %9 = load i32** %coerce.dive39
  %coerce.dive44 = getelementptr %"class.thrust::iterator_adaptor.33"* %coerce.dive43, i32 0, i32 0
  %10 = load i32** %coerce.dive44
  %coerce.dive45 = getelementptr %struct.my_functor* %agg.tmp29, i32 0, i32 0
  %11 = load i32* %coerce.dive45
  %call47 = invoke i32* @_ZN6thrust9transformINS_6detail15normal_iteratorINS_10device_ptrIiEEEES5_10my_functorEET0_T_S8_S7_T1_(i32* %8, i32* %9, i32* %10, i32 %11)
          to label %invoke.cont46 unwind label %lpad

我想从这里删除

%call47 = invoke i32* @_ZN6thrust9transformINS_6detail15normal_iteratorINS_10device_ptrIiEEEES5_10my_functorEET0_T_S8_S7_T1_(i32* %8, i32* %9, i32* %10, i32 %11)

但是当我在这条指令上调用 eraseFromParent() 时,它会抛出以下错误:

函数'main'中的基本块没有终结符!

如何正确删除?

【问题讨论】:

    标签: llvm llvm-ir


    【解决方案1】:

    我猜是因为你的BasicBlock 以invoke 指令结尾,所以它充当了BB 的终结者。所以当你删除它时,你的 BB 会失去它的终止符,这是一个错误,因为每个 BasicBlock 都应该以终止符指令结尾。

    作为解决方案,您可以在删除invoke后添加ret指令。

    【讨论】:

    • 正确。此外,作为一种快速破解,您可以使用 unreacheable 指令,它也是一个终止符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-01
    • 2013-08-20
    • 2017-09-04
    • 1970-01-01
    • 2012-06-19
    • 2018-01-12
    相关资源
    最近更新 更多