在这个2020年10月的LLVM开发人员会议上,我展示了一个帖子,讲述了我们如何通过一个简单得令人惊讶的工具,能够快速识别、隔离和修复LLVM的RISC-V后端中错过的一系列优化机会。
该工具的工作方式是生成随机的C程序,使用Clang和GCC(目标是RISC-V)编译每个程序,并比较两个编译器生成的汇编。如果它估计Clang/LLVM生成的代码比GCC更糟糕,那么它会保存该案例以供进一步分析。我们发现,即使使用简单的实现,该工具也出人意料地有效。
随机代码生成器(一个简单的递归下降生成器)直接发出代码,而不构建AST。这很容易定制,所以我们可以利用我们对RISC-V ISA和后端的知识来确保它生成的C代码更有可能识别出有问题的情况。
为了执行装配输出的质量评估和比较,该工具将成本分配给各个指令,并将整个装配序列的成本相加。单个指令的成本由其操作类型(加载/存储/分支/算术/…)决定。。该工具通过检查其组装输出的总成本是否高于GCC的总成本,来检测Clang可以改进的情况。
通过结合使用该工具运行C-Reduce可以最大限度地减少检测到的案例。通过最小化源程序,同时确保保留质量差异,我们产生了隔离代码质量问题的简明测试用例。
事实证明,这种直截了当的方法足以检测各种类别的问题。示例包括:
我们已经解决了我们发现的一系列问题。在我们处理所有容易获得的成果的同时,我们还可以不断改进该工具,以检测更多微妙的案件。
如果你错过了海报环节,你仍然可以观看5分钟的视频摘要,如下所示。