LLVM 每周 - 第 124 期,2016 年 5 月 16 日
欢迎来到 LLVM 每周的第 124 期,这是一个每周发布的新闻简报(每周一发布),涵盖 LLVM、Clang 和相关项目的最新进展。LLVM 每周由 Alex Bradbury 为您带来。订阅未来的期刊,请访问 http://llvmweekly.org,并将其转发给您认为可能感兴趣的任何其他人。请将任何提示或反馈发送到 [email protected],或在 Twitter 上发送到 @llvmweekly 或 @asbradbury。
本期文章的规范来源 可在 llvmweekly.org 上找到.
来自网络的新闻和文章
本周的主要新闻是 Scala-native 的发布,这是一个使用 LLVM 的 Scala 预先编译器。如果您想编译它并尝试它,Jos Dirkens 已经写了一份 入门指南。您还可以从 公告演讲的幻灯片 中找到更多信息。
在邮件列表中
更多参与 Google Summer of Code 的学生使用与 LLVM 相关的项目介绍了自己和他们的计划。Vivek Pandya 将致力于 跨过程寄存器分配。Scott Egerton 将致力于 捕获跟踪改进。陈杰将致力于 更好的别名分析,特别是改进 cfl-aa。Matthias Reisinger 将致力于 在 Julia 中启用多面体优化,郑延刘计划进行 SAFECode 内存加固。
Renato Golin 启动了一场关于 LLVM 的发布过程是否可以更好地与下游用户保持一致 的讨论。这个主题涵盖了广泛的主题并引发了大量讨论,但幸运的是,无需对其进行总结,因为 Renato 已经 为我们完成了这项工作。
Nicolai Hähnle 指出,目前 libLLVM.so 在其 .data.rel.ro 部分中包含大约 1.7MB,其中约 1.3MB 来自 tablegen 创建的 MCInstrDesc 表,代表大量需要重新定位的指针。他建议使用偏移量来减少这种情况。减少重新定位将既能减少二进制文件的大小,又能增加可以映射为共享的二进制文件部分。到目前为止,对该主题的回复都支持这一想法。
James Knight 撰写了一篇关于 为什么目前在 LLVM IR 中编写保证在 LLVM IR 中向前进度的 LL/SC 循环实际上是不可能的 的详细文章。对 load-linked 和 store-conditional 指令之间可以执行的操作存在限制,代码生成器可能无法满足这些限制。
一个公共的 llvm-foundation 邮件列表已 发布,旨在促进与基金会相关的讨论。
除了每周都有的长篇、技术细节和精确的主题之外,能够突出显示简单问题有简单答案的案例也很不错。如何将一个传递注册为基于命令行标志的可选传递?答案:每次都让它运行,但如果所需的命令行标志不存在,则立即返回。
Sanjoy Das 分享了一份关于 添加被调用者保存寄存器验证器 的 RFC。正如在该主题后面澄清的那样,其目的是确保不是由 LLVM 生成(例如,来自其他 JIT 或手工编写的汇编)的代码能够正确遵守调用约定,并且不会错误地覆盖寄存器。建议的传递只会添加代码来检查写入被调用者保存寄存器的测试值是否被修改。
为了响应有关传递顺序的疑问,Mehdi Amini 编写了一段关于 当您执行 opt -mymodulepass0 -myfunctionpass -mymodulepass1 时,确切发生了什么 的有用说明。
Konstantin Vladimirov 质疑 是否有一个选项可以强制寄存器分配器尽可能多地使用体系结构寄存器来减少依赖关系。简短的答案是目前还没有,但对此进行研究将会很有趣。
Diana Picus 分享了一份关于 修改 llc 以便它不再在第一个错误后退出 的 RFC。总体来说,人们都赞成这个想法,并且该补丁有望很快落地(在它暴露了 lldb 中的一些测试用例失败之后,它不得不暂时撤回)。
Nico Weber 指出,现在有了 AVX512,Clang 的内联函数头文件变得很大。这会导致编译时间问题,例如,Nico 报告说,在删除 avx512 包含文件之后,构建整个 v8 JS 引擎的速度提高了 6%。主题参与者尚未决定解决此问题的最佳方法,除了可能立即采取的步骤,即添加包含保护,以便在不为 AVX512 平台编译时,不会包含 AVX512 内联函数头文件。
LLVM 提交
过时的 LLVM 交叉编译指南已更新。 r269054.
WebAssembly 后端获得了初步的快速指令选择(fast-isel)支持。 r269083,r269203,r269273.
现在在 LLVM 中,循环展开(除了显式 pragma 的情况)在
-Os
时被禁用。您可能还记得上周它在 Clang 中针对-Os
被启用,但阈值不同。 r269124.循环展开器已实施了一个新的成本跟踪系统。 r269388.
LLVM 的 Sparc 后端添加了更多 LEON 特定的功能,例如带符号和无符号乘加。 r268908.
llc 的
-run-pass
选项现在将与传递注册表中已知的任何传递一起使用。以前,如果您指定间接添加的分析传递或优化管道中不存在的传递,它会静默地不执行任何操作。 r269003.WebAssembly 寄存器堆栈化和着色现在在优化管道中非常晚地运行。提交信息建议将这些传递视为基于生命周期的特定于域的压缩,而不是传统的优化。 r269012.
在文本 LLVM IR 中声明全局变量时,现在必须为其赋值,例如使用
@0 = global i32 42
。 r269096.内部汇编器现在默认情况下针对 32 位 MIPS 目标启用。 r269560.
Clang 提交
Clang 现在支持
__float128
。 r268898.Clang 获得了一个新的警告,当从函数中删除调用约定时触发。 r269116.
最近开发的 include-fixer 工具现在有文档。 r269167.