主要观点:编译器中间表示(IR)需有精确语义,以确保优化正确;指针除地址外还有来源(provenance),不同优化组合可能导致错误;LLVM存在相关 bug 需明确指针和整数的 provenance 情况来修复。
关键信息:
- 以计算
n * (i+j)
的 C 代码为例,说明编译器优化需单独正确,不同优化组合可能导致意外结果,如整数溢出问题,而在 LLVM IR 中情况不同。 - 对一段 C 代码进行一系列看似合理的优化,最终结果与原程序行为不同,表明这些优化组合不正确,揭示了指针的 provenance 等问题。
- 指出要解决此问题,需明确指针有 provenance 而整数没有,如 LLVM bug #34548 所提议,这也对应了一些标准提案。
重要细节: - 介绍了暖身示例,强调编译器优化要单独正确,避免引入未定义行为(UB)。
- 详细分析三个优化步骤及其中涉及的指针和整数的 provenance 问题,如最后一个优化中对
q[0]
的替换,以及前两个优化中对指针和整数的处理。 - 讨论了不同选项来修复问题,如认为指针和整数都有 provenance 等,认为指针有 provenance 而整数没有更合理。
- 提到 Rust 的 Miri 解释器和 LLVM 的 Alive 工具在规范制定方面的进展,以及相关规范工作的缓慢和困难。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。