- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试从 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 有一个前任(不是它本身)。
如何解决?您可以执行以下操作之一:
unreachable
指令)
关于llvm - 如何删除未使用的 basicblocks llvm,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21195499/
我正在尝试从 llvm 中间代码中删除未使用的 block 。 首先,我通过从入口 basicblock 开始并从它们的终止符指令添加所有 basicblock 后继者来构建可访问的 basicblo
我阅读了 LoopInfoBase(BlockT, LoopT) 上的llvm页面,并了解它包含所有顶级循环的信息。它还在类模板中定义了迭代器(和反向迭代器等)。 我不太了解迭代器正在迭代什么?例如,
我正在使用 LLVM 编写编译器前端。如果我创建一个 BasicBlock ,添加一些说明,最后设置插入点,一切正常。但是当我调用 SetInsertPoint然后添加一些这样的指令: Fun
获取 BasicBlock 的前辈的最简单方法是什么?在 LLVM 框架中? 我看过DepthFirstIterator和 idf_iterator ,但实际上我需要对控制流图进行广度优先搜索。 我觉
假设我有一个 llvm::Instruction* inst,如何获取指向其 basicblock 的指针?我在LLVM API中搜索并没有发现像inst.getBasicBlock()这样的接口(i
假设我有一个带标签的 BasicBlock,例如 entry。 现在,我想在此 BasicBlock 中插入一个“子”标签,而不会将 block 分成两部分。 在汇编中,它看起来像: entry: .
我想创建一个外部函数调用,这个函数正在获取参数作为 int 和 const char*(特别是 BASICBLOCK NAME,而不是自定义字符串)(或 std::string 可能没问题)。 但我不
我正在编写一个 LLVM pass,用于分析和修改生成的 IR 代码。有没有办法识别后边,我的意思是知道 BasicBlock 的后继者是否实际上在路径中的某个位置。 最佳答案 是的,有。 首先,请注
假设 IR 代码如下所示: define void @_Z1mbb(i1 zeroext %r, i1 zeroext %y) nounwind { entry: %r.addr = alloca
Does LLVM support for branch instructions with a variable BasicBlock target? 更具体地说,假设我将所有无条件 br 指令转换
我正在尝试通过这样做从 torchvision.models.resnet 导入类 BasicBlock from torchvision.models.resnet import * 它没有给出任何
我是一名优秀的程序员,十分优秀!