我已经开始玩 LLVM,制作一种宠物语言。 我正在使用 C-API。 我有一个解析器和基本的 AST,但我在 LLVM 方面遇到了一些障碍。 以下是我的代码的缩小版本,用于说明我当前的问题: 我可以使用以下命令编译它: 或者,我也尝试过: 无论哪种方式,我都会得到这个结果: 我也试过使用 clang ...
我已经开始玩 LLVM,制作一种宠物语言。 我正在使用 C-API。 我有一个解析器和基本的 AST,但我在 LLVM 方面遇到了一些障碍。 以下是我的代码的缩小版本,用于说明我当前的问题: 我可以使用以下命令编译它: 或者,我也尝试过: 无论哪种方式,我都会得到这个结果: 我也试过使用 clang ...
我对 LLVM 比较陌生,我正在尝试生成调用 C 函数( growDictionary )的 LLVM IR。 这是在 x86_64 Linux 上,使用 llvm 12: 函数(在 C++ 中定义为extern "C" ,用 clang 12 编译): 该函数按值获取 StringDict ...
尝试使用 LLVM-C 生成一个非常简单的 object 文件。 不幸的是,我仍然坚持“TargetMachine 无法发出这种类型的文件”尝试重新排序代码和 CPU 的各种东西(x64-64、通用和 LLVMGetHostCPUName())。 显然这里缺少一些东西(希望是显而易见的)。 下面的 ...
LLVM MISched 指令调度程序使用处理器功能单元、管道和延迟的声明性 TableGen 描述。 想象一下,试图从这些声明中确定与英特尔优化参考手册中的编码指南等效的情况。 从广义上讲,静态调度 OOO 处理器的目标/技术是什么? 对于OOO处理器,它什么时候会在B之前调度指令A,什么时候在 ...
Rust 在调试和发布模式下以不同的方式处理有符号整数溢出。 当它发生时,Rust 在调试模式下会发生恐慌,而在发布模式下默默地执行二进制补码包装。 据我所知,C/C++ 将有符号整数溢出视为未定义行为,部分原因是: 在 C 标准化的那个时候,表示有符号整数的不同底层体系结构,例如补码,可 ...
这是一个带有枚举定义和main函数的简单 C 文件: 它转换为以下 LLVM IR: %2显然是d变量,它被分配了 2。 如果直接返回零, %1对应什么? ...
我写了这个非常简单的 Rust 函数: 我编写了一个基本的基准测试,它使用一个有序数组和一个无序数组调用该方法: 我很惊讶这两个基准测试的运行时间几乎完全相同,而 Java 中的类似基准测试显示了两者之间的明显差异,这大概是由于在 shuffled 情况下分支预测失败。 我已经看到提到条件 ...
当在Rust中的数组上运行求和循环时,我注意到当CAPACITY > = 240时性能下降很大CAPACITY = 239大约快80倍。 是否有特殊的编译优化Rust正在为“短”数组做什么? 用rustc -C opt-level=3编译。 use std::time::In ...
Rust 有 128 位整数,它们用数据类型i128 (和u128表示无符号整数)表示: Rust 如何让这些i128值在 64 位系统上工作; 例如,它如何对这些进行算术运算? 因为,据我所知,该值无法放入 x86-64 CPU 的一个寄存器中,编译器是否以某种方式将 2 个寄存器用于一 ...
据我所知,引用/指针别名会阻碍编译器生成优化代码的能力,因为它们必须确保生成的二进制文件在两个引用/指针确实别名的情况下正确运行。 例如,在下面的 C 代码中, void adds(int *a, int *b) { *a += *b; *a += *b; } 当使用-O3标志 ...
在 Blandy 和 Orendorff 的Programming Rust第 322 页上是这样的声明: ...Rust...认识到有一种更简单的方法可以将数字从 1 加到n :总和始终等于n * (n+1) / 2 。 这当然是一个众所周知的等价,但是编译器是如何识别它的呢? 我猜它 ...
我知道 C++ 中的“未定义行为”几乎可以让编译器做任何它想做的事情。 然而,我遇到了一次让我感到惊讶的崩溃,因为我认为代码足够安全。 在这种情况下,真正的问题只发生在使用特定编译器的特定平台上,并且只有在启用优化的情况下才会发生。 我尝试了几种方法来重现问题并将其简化到最大程度。 这是一个名为 ...
我正在 llvm clang Apple LLVM 版本 8.0.0 (clang-800.0.42.1) 上反汇编此代码: 我编译时没有使用 -O 规范,但我也尝试使用 -O0(给出相同的值)和 -O2(实际上计算值并存储它预先计算的值) 由此产生的拆卸如下(我删除了不相关的部分) 显然 ...
该代码是幼稚的: use std::time; fn main() { const NUM_LOOP: u64 = std::u64::MAX; let mut sum = 0u64; let now = time::Instant::now(); for i ...
我有两个(等价的?)程序,一个在 Go 中,另一个在 Rust 中。 平均执行时间为: 去~169ms 锈~201ms 走 package main import ( "fmt" "time" ) func main() { work := []float6 ...
我有一个Box<dyn Any> ,我知道底层类型,所以我想在Box::downcast() ( 源代码 )中优化测试。 首先我尝试使用std::hint::unreachable_unchecked() : 和 使用rustc -C opt-level=3都会 ...
如果我使用cargo rustc -- --emit=llvm-ir编译,编译器将发出LLVM IR。 下面是 Rust 使用的 LLVM pass。 对发出的 IR 执行了哪些 LLVM 传递(如果有)? 有什么方法可以指定在发出 IR 之前要执行哪些传递? ...
如果循环的类型不同,那么我可以轻松地用名称来标识它们,但是如果有多个相同类型的循环(例如5个while循环),那么如何识别LLVM IR中的哪个基本块对应于源代码中的哪个循环码? 手动识别很容易,因为我们可以顺序访问代码和LLVM IR,但是我正在寻找如何以编程方式识别相同的对象。 ...
我目前正在玩LLVM,我正在尝试编写一些优化器来熟悉opt和clang。 我写了一个test.c文件,如下所示: 我编译了源代码并生成了2个.ll文件,一个未经优化,一个用mem2reg优化器传递: 两个.ll文件都给了我以下输出: 所以看来我的mem2reg传递不起作 ...
执行rustc -C help显示(除其他外): 我认为 0 到 3 级相当直观:级别越高,执行的优化就越积极。 但是,我不知道s和z选项在做什么,而且我找不到关于它们的 Rust 相关信息。 ...