IR LLVM形式与程序集
IR LLVM form vs assembly
https://idea.popcount.org/2013-07-24-ir-is-better-than-assembly/
你好,
我掌握了IR
的概念,但有一个问题不清楚。
为什么IR
比程序集更好?我读过作者对它的评价,我发现它在抽象意义上通常更高。它允许类型控制。但是,我想问一下其他问题:
特别是LLVM IR
是一种中间形式,为什么要对它进行优化呢?是否无法优化装配输出?确实,这是可能的吗?那么,为什么LLVM IR在这种情况下使用如此之好呢?我认为对IR
形式的分析只是更简单和"更有可能"。
我就是这样理解你的问题的:为什么编译器不快速转换到未优化的程序集,然后再进行优化。
优化装配会带来一些严重的限制。正如Chris Stathis所提到的,汇编优化器将被限制在一个平台上。IR优化器独立于平台。
此外,汇编中编码了太多硬件特定的细节。编译器优化已经很困难了,所以没有理由通过添加不相关的硬件细节来使问题变得更复杂。例如,在汇编代码中,特定大小的寄存器数量有限。在IR中,您可以使用任意数量的寄存器。没有理由强迫优化算法跟踪硬件寄存器,从而使优化算法更加复杂。
LLVM IR比我所知道的其他编译器IR有一些优势。一个重要的优点是LLVM IR是SSA形式的。这意味着一个变量只能定义一次,其值永远不会改变。这在很大程度上简化了编译器优化。
通过查看LLVM IR手册,可能不清楚它是SSA形式的。但一旦您查看了LLVM库中用于表示IR的数据结构,您就会发现您无法在LLVM IR中编写非SSA代码。
相关文章:
- 内联程序集printf将整数解释为地址
- 正在解码MSVC 32位版本的程序集(作业).没有手术做什么
- 具有外部"c"和程序集的未定义函数
- 用于将C++代码转换为 Web 程序集的脚本未终止
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- CoreCLR 中的检测探查器 - 将帮助程序程序集加载到 dotnet 进程的方法
- 不同于按值传递和常量引用传递的程序集
- 为什么在堆栈和堆上创建变量会产生相同的程序集代码?
- C++变量在调用 x64 程序集函数后重置为 0
- 如何将C++子例程链接到 x86 程序集程序?
- Qt 网页程序集缓存
- 测试操作系统时执行程序集"sti"时虚拟框崩溃
- 为什么从 constexpr 引用生成的程序集代码与从 constexpr 指针生成的程序集代码不同?
- 将内联程序集尾调用函数尾声替换为用于x86/x64 msvc的Intrinsics
- 解析 C# 中的C++程序集
- 64 位进程中的 AnyCPU C# DLL 无法引用 64 位C++ DLL(给出错误:无法加载文件或程序集)
- 使用CLANG内联程序集创建C++预增量操作
- 是否可以在C++中基于程序集输出(.dll或.exe)定义变量
- 用于比较基元类型的std::可选的有趣程序集
- IR LLVM形式与程序集