12得票1回答
编译器(特别是rustc)是否能真正简化三角形求和过程,避免使用循环?如何实现?

在Blandy和Orendorff的《Programming Rust》的322页上提到了如下说法: ......Rust认识到,计算从1到n的数字的和有一种更简单的方法:总和始终等于n *(n + 1)/ 2。 当然,这是一个相当著名的等式,但编译器如何识别它呢?我猜这是在LLVM优化中...

10得票1回答
为什么Rust编译器不能优化掉Box::downcast的Err分支?

我有一个 Box<dyn Any>,并且我知道其中的基础类型,因此我想优化掉Box::downcast()中的测试(源代码)。 首先我尝试使用 std::hint::unreachable_unchecked():pub unsafe fn downcast() -> B...

11得票3回答
LLVM为什么会分配冗余变量?

这是一个带有枚举定义和main函数的简单C文件:enum days {MON, TUE, WED, THU}; int main() { enum days d; d = WED; return 0; } 它被转译为以下LLVM IR:define dso_local...

406得票1回答
为什么Rust编译器不会优化假设两个可变引用不会别名的代码?

据我所知,引用/指针别名可以阻碍编译器生成优化代码的能力,因为它们必须确保在两个引用/指针确实是别名的情况下生成的二进制代码表现正确。例如,在以下C代码中,void adds(int *a, int *b) { *a += *b; *a += *b; } 使用clang版本6....

21得票2回答
如何使用“ffast-math”进行编译?

我正在尝试对一些Rust代码进行基准测试,但我不知道如何设置"ffast-math"选项。% rustc -C opt-level=3 -C llvm-args='-enable-unsafe-fp-math' unrolled.rs rustc: Unknown command line a...

27得票1回答
LLVM的整数类型

LLVM语言将整数类型指定为iN,其中N是整数的位宽,范围从1到2^23-1(参见:http://llvm.org/docs/LangRef.html#integer-type) 我有两个问题: 将C程序编译为LLVM IR级别时,可能降低哪些类型为 i1、i2、i3等?看起来像是 i8...

12得票1回答
为什么使用-O0选项(针对这个简单的浮点数求和)时,clang生成效率低下的汇编代码?

我正在使用 llvm clang Apple LLVM 版本 8.0.0 (clang-800.0.42.1) 对这段代码进行反汇编: Translated text: Using llvm clang Apple LLVM version 8.0.0 (clang-800.0.42.1),...

259得票2回答
为什么循环遍历一个有240个或更多元素的数组会对性能产生巨大影响?

在 Rust 中对数组运行求和循环时,我注意到当 CAPACITY >= 240 时性能急剧下降。大约以 CAPACITY = 239 的速度快了80倍。 是否有 Rust 对“短”数组进行的特殊编译优化? 使用rustc -C opt-level=3编译。use std::time::I...

10得票1回答
在 Rust 的 release 模式中,有符号整数溢出被视为未定义行为吗?

Rust在Debug模式和Release模式下对待带符号整数溢出的方式不同。当发生溢出时,Rust会在 Debug 模式下 panic,而在 Release 模式下则静默地进行二进制补码包装。 据我所知,C/C++将有符号整数溢出视为未定义行为的部分原因是: 1. 在 C 标准化时期,使用...

15得票2回答
LLVM opt mem2reg没有效果

我目前在研究LLVM,并尝试编写一些优化器,以便熟悉opt和clang。我编写了一个名为test.c的文件,内容如下:int foo(int aa, int bb, int cc){ int sum = aa + bb; return sum/cc; } 我编译了源代码并生成了...