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 做了哪些类型的优化以及其前端必须自行实现哪些类型的优化? 的相关文章

  • 在 CMake 中设置 Clang 库的路径

    我从 git 构建 llvm 并希望在项目中使用这些库 尤其是 libclang makefiles 是通过 CMake 生成的 对于 LLVM 部分 我找到了设置LLVM DIR重新路由 llvm 库的路径 但对于 Clang 我找不到这
  • gcc -O3 与 -Ofast 优化之间的差异

    我只是阅读 gcc 手册来找出两者之间的区别 O3 and Ofast For O3 O3 Optimize yet more O3 turns on all optimizations specified by O2 and also t
  • Clang 项目的 AST

    我使用 Clang python 绑定来提取 c c 文件的 AST 它非常适合我编写的一个简单程序 问题是当我想将它用于像 openssl 这样的大项目时 我可以为项目的任何单个文件运行 clang 但 clang 似乎错过了项目的一些标
  • 使用 python libclang 检索评论

    在下面的头文件中我想得到相应的 reflect对类和成员变量的注释 ifndef HEADER FOO define HEADER FOO reflect class Foo public private int m int reflect
  • Xcode“来自调试器的消息:对 k 数据包收到意外响应:正常”

    在模拟器上测试我的应用程序时收到此消息 来自调试器的消息 对 k 数据包收到意外响应 正常 这是什么意思 我的应用程序是否存在任何危险 使用 Xcode 6 4 和 7 2 如果你看一下文件进程GDBRemote cpp http llvm
  • 使用 llvm-prof 收集 LLVM 边缘分析

    我正在使用这些命令来编译下面的代码以收集 trunk llvm 中的边缘 块分析 clang emit llvm c sort c o sort bc opt insert edge profiling sort bc o sort pro
  • 如何使用 Clang 编码生成未使用的声明? [复制]

    这个问题在这里已经有答案了 我正在寻找代码生成一个llvm Module来自一些 C 代码 具体来说 我将混合 Clang 生成的代码和其他来源的代码 不幸的是 铿锵CodeGenModule如果存在使用它的定义 类似乎坚持只在模块中生成声
  • 如何强制 Xcode 使用自定义编译器?

    我想强制 Xcode 使用自定义编译器 从 src 构建的 clang llvm 以便我可以使用 clang 插件 我的Xcode版本是7 3 1 人们说使用自定义工具链是可能的 我没有对它们进行研究 因为更简单的解决方案对我来说效果很好
  • 可以从 LLVM-IR 自动生成 llvm c++ api 代码吗?

    clang 3 0 在线演示页面http llvm org demo index cgi http llvm org demo index cgi提供输出 LLVM C API 代码的选项 表示输入程序的 LLVM IR 生成 LLVM C
  • 如何告诉 Clang 不要冒充其他编译器?

    我过去遇到过这个问题 LLVM 定义 GNUC https www google com search q 22 GNUC 22 LLVM bug 但它不能使用 GCC 可以使用的程序 我在 Windows 上再次遇到它 LLVM 定义 M
  • 节省内存和编译时间

    有什么方法可以使用模块在 perl 中节省内存和编译时间吗 例如 不加载所有不必要的 未使用的子程序 或者 如果我将我的潜艇分成许多不同的 这是一个好方法pm文件 然后我只加载必要的模块 例如 usr bin perl w sub mysu
  • 当声明这样的指针时,“pointer[restrict static 1]”会带来什么优化好处?

    我正在阅读库 QNNPack 的源代码并注意到这一行 https github com pytorch QNNPACK blob 24d57f21503ba8ab0f8bb5d24148754a91266b9c src q8gemm 6x4
  • badref 是什么意思?

    IR线是什么意思 define i32
  • 如何使用 LLVM IRBuilder 从外部 DLL 调用函数?

    如何从 LLVM 调用外部 DLL 的函数 如何从 LLVM 代码调用 DLL 文件中定义的函数 由于您的问题缺少重要信息 我猜您想实现以下目标 我猜你会使用 c c 接口并且该函数有一个签名void fun void 我还猜测您将使用 L
  • 如果 C 编译器无法证明缺少 UB,为什么要禁止优化?

    如果 C 程序有未定义的行为 任何事情都可能发生 因此编译器可能会假设任何给定的程序不包含 UB 因此 假设我们的程序包含以下内容 x 5 Do something else without x in the meantime x 7 当然
  • 用于优化目的的简单编译器

    我想要一个简单编译器的源代码 通过交换延迟分支的代码来优化我的作业 我读了有没有针对小语言的简单编译器 https stackoverflow com questions 1913621 is there a simple compiler
  • 统一不同 clang-format 版本的输出

    我们尝试使用 clang format 工具稍微美化我们的代码 为了在我们所做的所有机器上获得统一的结果clang format style llvm dump config 已进行了一些调整并存储到 repo 中 问题是 clang 10
  • 是否有像 pygccxml 一样的 Python Clang 包装器来包装 GCC-XML?

    很长一段时间以来 我一直在使用 pygccxml 来解析和内省我的 C 源代码 它帮助我在构建过程中进行一些巧妙的代码生成 最近我读了很多关于 LLVM 堆栈的好处 特别是 LLVM Clang 解析器给 C 编译带来的好处 我现在想知道
  • 如何在 Xcode 中禁用一个文件的优化

    我的 Xcode 项目依赖于另一个库 当我使用以下命令构建项目时 这会导致项目出现错误 O3 option 这些错误仅存在于一个文件中 所以我想关掉 O3 该文件的选项 是否可以 打开目标 看下Build Phases 打开Compile
  • LLVM 尾调用优化

    以下是我对事情的理解 当函数 f 调用自身是其最后一个动作时 它是尾递归的 通过形成循环而不是再次调用函数 可以显着优化尾递归 函数的参数已就地更新 并且函数体再次运行 这称为递归尾调用优化 LLVM 在使用 fastcc GHC 或 Hi

随机推荐

  • 使用 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与这个问题有很多相关性 所以如果您对我的问题感兴趣 您绝对应