gpt4 book ai didi

llvm - 如何删除未使用的 basicblocks llvm

转载 作者:行者123 更新时间:2023-12-05 05:27:14 41 4
gpt4 key购买 nike

我正在尝试从 llvm 中间代码中删除未使用的 block 。

首先,我通过从入口 basicblock 开始并从它们的终止符指令添加所有 basicblock 后继者来构建可访问的 basicblocks 的集合:

bbset.insert(bbterm->getSuccessor(i));

之后,我遍历无法访问的基本 block 并使用删除它们

DeleteDeadBlock(bb);

来自 Utils/BasicBlockUtils.cpp

它有效,但在某些情况下我会遇到段错误。以下是核心转储:

opt: /home/user/llvm-3.3.src/lib/Transforms/Utils/BasicBlockUtils.cpp:38: void llvm::DeleteDeadBlock(llvm::BasicBlock*): Assertion `(pred_begin(BB) == pred_end(BB) || BB->getSinglePredecessor() == BB) && "Block is not dead!"' failed.
0 opt 0x0000000001756825 llvm::sys::PrintStackTrace(_IO_FILE*) + 38
1 opt 0x0000000001756aa2
2 opt 0x000000000175651e
3 libpthread.so.0 0x00007fe1fe76dbb0
4 libc.so.6 0x00007fe1fdbaef77 gsignal + 55
5 libc.so.6 0x00007fe1fdbb25e8 abort + 328
6 libc.so.6 0x00007fe1fdba7d43
7 libc.so.6 0x00007fe1fdba7df2
8 opt 0x000000000138b004 llvm::DeleteDeadBlock(llvm::BasicBlock*) + 139
9 opt 0x0000000000d49c2e
10 opt 0x0000000001652942 llvm::FPPassManager::runOnFunction(llvm::Function&) + 290
11 opt 0x0000000001652ab2 llvm::FPPassManager::runOnModule(llvm::Module&) + 84
12 opt 0x0000000001652dd0 llvm::MPPassManager::runOnModule(llvm::Module&) + 502
13 opt 0x00000000016533a0 llvm::PassManagerImpl::run(llvm::Module&) + 244
14 opt 0x00000000016535ab llvm::PassManager::run(llvm::Module&) + 39
15 opt 0x00000000008c6cb6 main + 5698
16 libc.so.6 0x00007fe1fdb99de5 __libc_start_main + 245
17 opt 0x00000000008b8a39

任何想法可能是什么问题?

最佳答案

这不是段错误,而是断言错误,它告诉您问题所在:前导列表不为空。你得到这个断言错误是因为 DeleteDeadBlock 验证你正在删除的 block 没有直接的前辈(除了它本身)。

但是,这个测试并不意味着这个 block 是活着的;例如,在这种情况下(假设线条是向下的箭头):

entry
/
A B
| |
C D
\ /
E

B 和 D 都已死,但如果您尝试在 B 之前删除 D,您将得到断言,因为 D 有一个前任(不是它本身)。

如何解决?您可以执行以下操作之一:

  1. 按拓扑顺序处理 block
  2. 从您要删除的 block 中删除所有前任(例如,通过将其所有前任的终止符替换为 unreachable 指令)
    • 您也可以对所有您首先确定为死的 block 执行此操作,然后以任意顺序删除它们

关于llvm - 如何删除未使用的 basicblocks llvm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21195499/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com