llvm-codegen相关内容

为什么LLVM分配一个冗余变量?

下面是一个简单的C文件,其中包含一个枚举定义和一个main函数: enum days {MON, TUE, WED, THU}; int main() { enum days d; d = WED; return 0; } 它转换为以下LLVM IR: define dso_local i32 @main() #0 { %1 = alloca i32, ..
发布时间:2022-07-01 18:56:05 其他开发

编译器(特别是rustc)真的可以简化三角求和以避免循环吗?多么?

在Blandy和Orendorff的Programming Rust的第322页上是这样的声明: ...Rust...认识到有一种更简单的方法将数字从1加到n:总和始终等于n * (n+1) / 2。 这当然是众所周知的等价物,但是编译器如何识别它呢?我猜它是在LLVM优化过程中进行的,但是LLVM是以某种方式从基本原理中推导出等价性,还是它只有一组可以简化为算术运算的“公共循环计算”? ..

为什么 clang 使用 -O0 产生低效的 asm(对于这个简单的浮点和)?

我正在 llvm clang Apple LLVM version 8.0.0 (clang-800.0.42.1) 上反汇编此代码: int main() {浮动 a=0.151234;浮动 b=0.2;浮动 c=a+b;printf("%f", c);} 我编译时没有使用 -O 规范,但我也尝试使用 -O0(给出相同的值)和 -O2(实际上计算值并存储它预先计算的值) 拆解结果如下( ..
发布时间:2021-11-30 11:04:08 其他开发

Rust 的 128 位整数 `i128` 如何在 64 位系统上工作?

Rust 有 128 位整数,用数据类型 i128 表示(对于无符号整数,u128): 让a: i128 = 170141183460469231731687303715884105727; Rust 如何使这些 i128 值在 64 位系统上工作;例如它如何对这些进行算术运算? 由于,据我所知,该值无法放入 x86-64 CPU 的一个寄存器中,编译器是否以某种方式将 2 个寄存器用于 ..
发布时间:2021-07-13 20:44:08 其他开发

假设两个可变引用都不能别名,Rust编译器为什么不优化代码?

据我所知,引用/指针别名会阻碍编译器生成优化代码的能力,因为它们必须确保在两个引用/指针确实为别名的情况下,生成的二进制文件的行为正确。例如,在以下C代码中, void add(int * a,int * b ){ * a + = * b; * a + = * b; } 由 clang版本6.0.0-1ubuntu2编译时(标签/ RELEASE_600 / fi ..
发布时间:2020-10-06 23:19:27 其他开发

LLVM opt mem2reg无效

我目前正在使用LLVM,并尝试编写一些优化器以熟悉opt和clang.我写了一个test.c文件,如下所示: int foo(int aa, int bb, int cc){ int sum = aa + bb; return sum/cc; } 我编译了源代码并生成了2个.ll文件,其中1个未经优化,而1个具有mem2reg优化程序通过: clang -emit- ..

LLVM的整数类型

LLVM语言将整数类型指定为iN,其中N是整数的位宽,范围为1到2 ^ 23-1(根据:我有2个问题: 将C程序编译到LLVM IR级别时,哪些类型可以降低到i1,i2,i3等?看来i8,i16,i32,i64类型必须足够,所以我想知道其他将近800万个整数类型又是什么. 有符号和无符号整数类型都降低到i32是真的吗?原因是什么?为什么它不适用于32位浮点数(在LLVM中用f32表示) ..
发布时间:2020-05-02 10:54:29 其他开发

C ++标准是否允许未初始化的bool导致程序崩溃?

我知道C ++中的“未定义的行为" 几乎可以使编译器执行其所需的任何操作.但是,由于我以为代码足够安全,所以发生了一次崩溃,这让我感到惊讶. 在这种情况下,真正的问题仅在使用特定编译器的特定平台上发生,并且仅在启用优化的情况下发生. 为了重现此问题并将其简化到最大程度,我尝试了几件事.这是一个名为Serialize的函数的摘录,该函数带有一个bool参数,并将字符串true或false ..
发布时间:2020-05-02 10:50:33 C/C++开发