Finding Missed Code Size Optimizations in Compilers using LLMs

📄 arXiv: 2501.00655v1 📥 PDF

作者: Davide Italiano, Chris Cummins

分类: cs.SE, cs.LG, cs.PL

发布日期: 2024-12-31

备注: Accepted to appear in The International Conference on Compiler Construction (CC) 2025


💡 一句话要点

利用LLM辅助的差分测试发现编译器中遗漏的代码大小优化

🎯 匹配领域: 支柱九:具身大模型 (Embodied Foundation Models)

关键词: 编译器测试 差分测试 大型语言模型 代码优化 代码大小优化

📋 核心要点

  1. 现有编译器测试主要集中在验证代码正确性,而忽略了性能优化,导致潜在的优化遗漏。
  2. 该方法利用LLM生成随机代码,结合差分测试策略,自动检测编译器在代码大小优化方面的不足。
  3. 实验在C/C++、Rust和Swift编译器中发现了24个已确认的bug,证明了该方法在检测优化错误方面的有效性。

📝 摘要(中文)

编译器非常复杂,对其进行测试已投入了大量精力。随机程序生成和差分测试等技术已被证明非常有效,并发现了生产编译器中的数千个错误。 大部分精力都花在了验证编译器是否为给定输入生成正确的代码上,而较少关注确保编译器生成高性能的代码。本文将差分测试应用于识别编译器中遗漏的优化机会。 我们开发了一种新颖的测试方法,该方法将大型语言模型 (LLM) 与一系列差分测试策略相结合,并使用它们来查找 C / C++ 编译器中缺失的代码大小优化。 我们的方法的优点是它的简单性。 我们将生成随机代码的复杂任务转移到现成的 LLM,并使用启发式方法和分析来识别异常的编译器行为。 我们的方法需要少于 150 行代码来实现。 这种简单性使其具有可扩展性。 通过简单地更改目标编译器和初始 LLM 提示,我们将该方法从 C / C++ 移植到 Rust 和 Swift,并在两者中都发现了错误。 迄今为止,我们已报告了生产编译器中的 24 个已确认的错误,并得出结论,LLM 辅助测试是检测现实世界编译器中优化错误的一种有希望的途径。

🔬 方法详解

问题定义:论文旨在解决编译器测试中对代码大小优化关注不足的问题。现有编译器测试方法主要验证代码的正确性,而忽略了代码的性能,特别是代码大小的优化。这导致编译器可能存在遗漏的优化机会,使得生成的代码不是最优的。传统的测试方法难以有效地发现这些优化遗漏。

核心思路:论文的核心思路是利用大型语言模型(LLM)生成随机代码,并结合差分测试策略,通过比较不同编译器或同一编译器的不同版本对同一段代码的编译结果,来发现代码大小上的差异,从而识别编译器中遗漏的优化机会。这种方法将复杂的代码生成任务交给LLM,简化了测试流程。

技术框架:该测试框架主要包含以下几个阶段:1) 使用LLM生成随机的C/C++、Rust或Swift代码;2) 将生成的代码输入到不同的编译器或同一编译器的不同版本中进行编译;3) 比较编译后的代码大小,如果差异超过预设的阈值,则标记为潜在的优化遗漏;4) 人工验证确认是否为真正的bug。

关键创新:该方法最重要的创新点在于将LLM引入到编译器测试中,利用LLM强大的代码生成能力,可以快速生成大量的随机代码,从而有效地覆盖编译器的各种代码路径,提高发现优化遗漏的概率。与传统的随机代码生成方法相比,LLM生成的代码更具多样性和复杂性,更容易触发编译器中的bug。

关键设计:该方法的关键设计包括:1) LLM的prompt设计,需要设计合适的prompt来引导LLM生成符合语法规则且具有一定复杂度的代码;2) 代码大小差异的阈值设定,需要根据不同的编译器和代码类型设定合适的阈值,以避免误报;3) bug的验证流程,需要人工验证确认是否为真正的bug,并将其报告给编译器开发者。

🖼️ 关键图片

fig_0
fig_1

📊 实验亮点

该研究成功地在生产编译器中发现了24个已确认的bug,证明了LLM辅助的差分测试在检测编译器优化错误方面的有效性。该方法实现简单,仅需不到150行代码,且易于扩展,可以应用于不同的编程语言和编译器。实验结果表明,该方法是一种有希望的编译器测试方法。

🎯 应用场景

该研究成果可应用于编译器开发和测试领域,帮助编译器开发者发现和修复代码大小优化方面的bug,提高编译器的代码生成质量和性能。此外,该方法也可以扩展到其他类型的编译器优化测试,例如速度优化、功耗优化等,具有广泛的应用前景。未来,该方法可以集成到持续集成/持续部署(CI/CD)流程中,实现编译器的自动化测试。

📄 摘要(原文)

Compilers are complex, and significant effort has been expended on testing them. Techniques such as random program generation and differential testing have proved highly effective and have uncovered thousands of bugs in production compilers. The majority of effort has been expended on validating that a compiler produces correct code for a given input, while less attention has been paid to ensuring that the compiler produces performant code. In this work we adapt differential testing to the task of identifying missed optimization opportunities in compilers. We develop a novel testing approach which combines large language models (LLMs) with a series of differential testing strategies and use them to find missing code size optimizations in C / C++ compilers. The advantage of our approach is its simplicity. We offload the complex task of generating random code to an off-the-shelf LLM, and use heuristics and analyses to identify anomalous compiler behavior. Our approach requires fewer than 150 lines of code to implement. This simplicity makes it extensible. By simply changing the target compiler and initial LLM prompt we port the approach from C / C++ to Rust and Swift, finding bugs in both. To date we have reported 24 confirmed bugs in production compilers, and conclude that LLM-assisted testing is a promising avenue for detecting optimization bugs in real world compilers.