LLVM 做了哪些类型的优化以及其前端必须自行实现哪些类型的优化?

2023-12-30

注意:我注意到了这个问题 https://stackoverflow.com/questions/6672008/llvm-and-the-future-of-optimization与这个问题有很多相关性,所以如果您对我的问题感兴趣,您绝对应该阅读另一个问题及其答案。

我可以想到 OOP 语言前端可以做的一些优化,例如创建临时变量来保存按顺序调用的 const 方法调用的值,而不需要对相关对象进行中间非常量调用,以切断函数调用,但我可以想不到更多。我想请人们创建一个更长的示例列表。

我问这个问题是因为我想创建一种小语言作为宠物项目,并且我不确定如何很好地研究这个主题。也许这是社区维基的一个例子? LLVM 后端所做的优化以及前端应该自行进行的优化的综合列表,您认为如何?

哦,我知道不同的前端可能有截然不同的需求,但我的重点是过程/OOP 语言。


这可能因语言而异... clang (C/C++) 在前端优化方面做得很少。我能想到的针对生成代码性能的唯一优化是 clang 在前端对 C++ 方法进行了一些去虚拟化。 clang 还进行了一些其他优化,例如常量折叠和死代码消除,但这主要是为了加快编译时间,而不是为了提高生成代码的性能。

EDIT:实际上,再想一想,我只记得 clang 对 C++ 所做的一项更重要的优化:clang 知道一些在 C++ 中消除复制构造函数的技巧(google for NRVO)。

在某些情况下,特定于语言的 IR 优化过程可能很有用。有一个 SimplifyLibCalls 传递,它知道如何优化对 C 标准库的调用。对于新的 Objective-C ARC 语言功能,clang 将一些特定于 ARC 的通道放入管道中;这些优化了对各种 Objective-C 运行时函数的调用。

一般来说,只有当代码具有无法编码到 IR 中的属性时(例如 C++ 对象具有常量 vtable 指针),在前端实现优化通常才有用。在实践中,您很可能希望首先实现哑代码生成,然后看看是否存在未优化的重要情况。优化器可以执行一些令人惊讶的复杂转换。

也可以看看http://llvm.org/docs/tutorial/LangImpl7.html http://llvm.org/docs/tutorial/LangImpl7.html;适当地使用 alloca 是对优化器有很大帮助的一件事,尽管它本身并不是真正的优化。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LLVM 做了哪些类型的优化以及其前端必须自行实现哪些类型的优化? 的相关文章

  • 如何嵌入LLVM?

    LLVM 核心项目包括 编译器 将源代码转换为 LLVM IR VM 执行编译后的IR代码 如何将 VM 嵌入到 C 应用程序中 LLVM 实际上是一个可以链接到的库的集合 因此嵌入起来非常容易 更多时候 LLVM 会获取您生成的 IR 并
  • 未优化的 clang++ 代码在简单的 main() 中生成不需要的“movl $0, -4(%rbp)”

    我创建了一个最小的 C 程序 int main return 1234 并使用 clang 5 0 禁用优化 默认 O0 得到的汇编代码是 https gcc godbolt org z OYLghAFBqd5QCxAYwPYBMCmBRd
  • 有谁能够在 iOS 上使用 Address-Sanitizer(称为 asan 或 -fsanitize=address)吗?

    地址消毒剂https code google com p address sanitizer wiki AddressSanitizer https code google com p address sanitizer wiki Addr
  • 为什么编译器会生成这个程序集?

    在逐步执行一些 Qt 代码时 我遇到了以下情况 功能QMainWindowLayout invalidate 有以下实现 void QMainWindowLayout invalidate QLayout invalidate minSiz
  • 如何在 Mac 上使用 Emscripten emcc 和 make 时包含 ncurses

    我正在尝试构建一个项目 即 Angband 的源代码 http rephial org downloads 3 3 angband v3 3 2 tar gz http rephial org downloads 3 3 angband v
  • 识别 IR 中的阵列类型

    我一直在尝试使用以下代码来识别 IR 中的数组访问 for BasicBlock iterator ii BB gt begin ii2 ii BB gt end ii Instruction I ii if GetElementPtrIn
  • 如何使用自定义 llc 编译 Rust 程序?

    我有一个自定义 LLVM 后端 并且想为该自定义 nostd 目标交叉编译 Rust 我想分两步编译 Rust 程序 Using rustc生成 LLVM IR 用我自己的opt and llc将 LLVM IR 转换为机器代码 我尝试使用
  • 编译器优化导致性能下降

    我有一个奇怪的问题 我有以下代码 template
  • 为什么 GCC 不将 a*a*a*a*a*a 优化为 (a*a*a)*(a*a*a)?

    我正在对科学应用程序进行一些数值优化 我注意到的一件事是 GCC 会优化调用pow a 2 通过将其编译成a a 但是调用pow a 6 没有优化 实际会调用库函数pow 这大大降低了性能 相比之下 英特尔 C 编译器 http en wi
  • 如何让 clangd 转向 c++20

    当没有其他信息时 如何让 clangd 回退到 c 20 例如 在第一次构建之前 cmake 可以生成一个 这是在带有最新 LLVM 的 Arch Linux 上 这是通过 Emacs LSP 运行的 但这应该没有什么区别 你可以加 Com
  • Xcode 3.1.4 中内置分析器

    我想知道 Xcode 3 1 4 中内置的分析器是否使得单独使用 LLVM Clang 静态分析器变得多余 请参考这里的原文 使用 LLVM Clang 静态分析器查找内存泄漏 http www fruitstandsoftware com
  • android ndk 硬件调试内存

    背景 我对 C 很有经验 对 Android 和 Java 还很陌生 但这是编程的环境问题 我已经用 ANSI C 开发了一个管理应用程序 可以移植到任何操作系统 只需在依赖于操作系统的代码中添加 UI 即可 它使用相当多的内存 特别是对于
  • 如何从 LLVM 指令获取文件名和目录?

    我需要在 llvm 过程中提取目录和文件名 当前版本的 llvm 已移动getFilename and getDirectory from DebugLoc to DebugInfoMetadata 我找不到班级成员getFilename直
  • C++ 标准是否允许未初始化的 bool 导致程序崩溃?

    我知道一个 未定义的行为 C 几乎可以让编译器做任何它想做的事情 然而 我遇到了一次令我惊讶的崩溃 因为我认为代码足够安全 在这种情况下 真正的问题仅发生在使用特定编译器的特定平台上 并且仅在启用优化的情况下发生 我尝试了几种方法来重现问题
  • 如何在 Haskell 中使 CAF 不是 CAF?

    如何将常量应用形式变成 而不是常量应用形式 以阻止它在程序的生命周期中保留 我尝试过这种方法 Dummy parameter to avoid creating a CAF twoTrues gt Bool twoTrues map Tru
  • gcc 删除内联汇编代码

    看起来 gcc 4 6 2 删除了它认为函数中未使用的代码 test c int main void goto exit handler asm volatile jmp 0x0 exit return 0 拆解main 0x0804840
  • 为什么 GCC 不将这个“printf”优化为“puts”?

    这是我的测试代码 include
  • 如何用gcc进行矢量化?

    v4系列的gcc编译器可以使用以下方法自动向量化循环SIMD http en wikipedia org wiki SIMD某些现代 CPU 上的处理器 例如 AMD Athlon 或 Intel Pentium Core 芯片 这是怎么做
  • C 中的浮点运算是否具有结合律?

    加法在数学上具有结合律 a b c a b c 在一般情况下 此属性不适用于浮点数 因为它们表示有限精度的值 作为优化的一部分 从 C 程序生成机器代码时 编译器是否允许进行上述替换 C标准中到底在哪里说的 不允许编译器执行 优化 这将导致
  • 值传递和复制省略优化

    我遇到了https web archive org web 20120707045924 cpp next com archive 2009 08 want speed pass by value https web archive org

随机推荐

  • 使用 SSH.NET 库从 .NET 连接到 MySQL

    我正在开发一个网页 ASP NET C 通过 SSH 查询远程服务器上的 MySQL 数据库 我正在使用这两个库 mysql connector net 6 9 7 和 Renci SshNet dll 我可以通过 SSH 连接使用远程服务
  • NineOldAndroids 动画不适用于 API > 10

    我在用NineOldAndroid执行动画的库 对于 API10 应用程序强制关闭 这是我的代码 import static com nineoldandroids view ViewPropertyAnimator animate imp
  • 如何阻止 Intellij 创建 src/main/java 和 src/main/scala-x 文件夹?

    我在 Intellij 15 0 2 中有一个仅用于 scala 编程的 SBT 项目 由于某种原因 该项目不断在我的项目中创建以下文件夹 src 主 java src main scala 2 10 src main scala 2 11
  • 如何获取从 PUT 方法传递的数据

    我正在为 Laravel 创建一个 API 我使用 PUT 方法来更新数据 我使用 PUT 方法通过 Postman 发送数据 在我的控制器中 我有一个空数组 如何访问传递的数据 在我的路线中 我有 Route put vehicletyp
  • 如何在 FastAPI 中上传 CSV 文件并将其转换为 Pandas Dataframe?

    我想将文件上传到 FastAPI 后端并将其转换为 Pandas DataFrame 但是 我似乎不明白如何使用 FastAPI 来做到这一点UploadFile https fastapi tiangolo com tutorial re
  • React Router Switch 和确切路径

    我读过这份文件反应路由器开关 https github com ReactTraining react router blob master packages react router docs api Switch md 我了解交换机和路
  • 周围物体算法

    我正在开发一款游戏 该位置可能只存在一个对象 x y where x and y are ints 例如 一个对象可能存在于 0 0 也可能不存在 但不可能同时存在多个对象 我正在尝试决定使用哪个 STL 容器来解决当前的问题以及解决此问题
  • iPhone 相机对焦

    我使用下面的代码来对焦 iPhone 相机 但它不起作用 我从Apple的AVCam示例代码中获取了这段代码 我做错了什么吗 有什么方法可以 检测iPhone是否对焦 void focusAtPoint CGPoint point AVCa
  • Chrome 有内置的调用堆栈吗?

    在 Visual Studio 中 我习惯于在任何断点处显示调用堆栈 Chrome 是否具有调用堆栈功能 可以让我查看断点之前的函数 如果没有 是否有替代方案 适用于 Chrome 的第三方解决方案 供开发人员用来查看哪些函数导致了断点 编
  • Microsoft SQL Server 中表的事务隔离级别

    这更多的是对我想法的确认 而不是一个问题 可以在 SQL Server 中以表为基础更改隔离级别 还是只能在会话级别上定义 更改 如下面的语句所示 SET TRANSACTION ISOLATION LEVEL SERIALIZABLE 那
  • 点击 NavigationLink 后如何执行操作?

    我的第一个视图中有一个加号按钮 看起来像一个 FAB 按钮 我想在点击 NavigationLink 中包含的某个步骤后隐藏它 到目前为止我有这样的事情 ForEach 0 lt 12 item in NavigationLink dest
  • Winforms ListView - 双击时停止自动检查

    如何使列表视图在双击某个项目时不自动检查该项目 我可以尝试挂钩 MouseDoubleClick 事件 并将 Checked 属性设置为 false 但这感觉有点像黑客 当实际检查某个项目时 我还会运行相当昂贵的计算 并且不希望此代码在双击
  • java中如何识别检查异常和非检查异常?

    在阅读有关异常的内容时 我总是会遇到受控异常和非受控异常 所以想知道如何区分哪个是什么 编辑 我想知道我是否创建任何异常类 那么如何创建为已检查或未检查的异常类 每个的意义是什么 All Throwables 除了以下子类java lang
  • 在未安装 Excel 的服务器上生成 Excel 文件

    我在用Microsoft Office Interop Excel并使用生成 Excel 文件SaveAs方法 这一切都可以在安装了 Excel 的计算机上正常运行 但是 我的服务器没有安装 Excel 如何生成我的文件 If you ge
  • 从 Shell 脚本将日期传递给 C 程序

    我想将用户以 YYYY MM DD HH24 MI SS 格式输入的日期传递给 C 程序 该程序进一步在数据库中输入条目 当我将命令行参数中输入的日期作为 2010 07 15 12 13 14 传递时 C 程序将其视为 2 个参数而不是
  • 当针对 ES5 / ES3 时,Typescript 会转译什么?

    我试图了解 Typescript 编译器何时会转译代码以使其与我指定的目标 ECMAScript 版本 ES5 或 ES3 兼容 例如 TSC 将转译for var int of intArray 很好 但它不转译Number isInte
  • 时间:2019-03-17 标签:c#EnumFunctionParameters

    作为后续这个问题 https stackoverflow com questions 492115 c enums as function parameters 如何调用函数并传入枚举 例如我有以下代码 enum e1 public voi
  • 生成器无法按特定标识符分割字符串。蟒蛇2

    到目前为止 我已经找到了一种生成名称 字符串和额外字符串的方法 它适用于第二个但不适用于第一个 这很奇怪 因为格式非常相似 是因为它是多行吗 我以为if line pass将绕过该问题 我在打印中添加了 n 以显示差异 Input firs
  • 计算统计模式

    我目前正在尝试验证 给定一个长度为 N 的未排序数组 A 和一个整数 k 是否存在某个元素出现 n k 次或更多次 我对这个问题的想法是计算众数 然后将其与 n k 进行比较 但是 我不知道如何快速计算此模式 我的最终结果需要是nlog k
  • LLVM 做了哪些类型的优化以及其前端必须自行实现哪些类型的优化?

    注意 我注意到了这个问题 https stackoverflow com questions 6672008 llvm and the future of optimization与这个问题有很多相关性 所以如果您对我的问题感兴趣 您绝对应