Questions tagged «llvm-codegen»

5
C ++标准是否允许未初始化的bool使程序崩溃?
我知道C ++ 中的“未定义行为”几乎可以允许编译器执行其想要的任何操作。但是,由于我认为代码足够安全,因此发生了一次崩溃,这让我感到惊讶。 在这种情况下,真正的问题仅在使用特定编译器的特定平台上发生,并且仅在启用优化后才发生。 为了重现此问题并将其简化到最大程度,我尝试了几件事。下面是一个函数的提取物被称为Serialize,这将需要一个布尔参数,并复制字符串true或false到现有的目标缓冲区。 此功能是否在代码审查中,如果bool参数是未初始化的值,实际上没有办法告诉它崩溃吗? // Zero-filled global buffer of 16 characters char destBuffer[16]; void Serialize(bool boolValue) { // Determine which string to print based on boolValue const char* whichString = boolValue ? "true" : "false"; // Compute the length of the string we selected const size_t len = …

1
假设两个可变引用都不能别名,Rust编译器为什么不优化代码?
据我所知,引用/指针别名会阻碍编译器生成优化代码的能力,因为它们必须确保在两个引用/指针确实是别名的情况下,生成的二进制文件的行为正确。例如,在以下C代码中, void adds(int *a, int *b) { *a += *b; *a += *b; } 当clang version 6.0.0-1ubuntu2 (tags/RELEASE_600/final)用-O3标志编译时,它发出 0000000000000000 <adds>: 0: 8b 07 mov (%rdi),%eax 2: 03 06 add (%rsi),%eax 4: 89 07 mov %eax,(%rdi) # The first time 6: 03 06 add (%rsi),%eax 8: 89 07 mov %eax,(%rdi) # …

2
在具有240个或更多元素的数组上循环时,为什么会对性能产生较大影响?
当在Rust中的数组上运行求和循环时,当CAPACITY> = 240 时,我注意到性能大幅下降。CAPACITY= 239快80倍。 Rust对“短”数组进行了特殊的编译优化吗? 与编译rustc -C opt-level=3。 use std::time::Instant; const CAPACITY: usize = 240; const IN_LOOPS: usize = 500000; fn main() { let mut arr = [0; CAPACITY]; for i in 0..CAPACITY { arr[i] = i; } let mut sum = 0; let now = Instant::now(); for _ …

4
Rust的128位整数“ i128”如何在64位系统上工作?
Rust具有128位整数,这些整数用数据类型表示i128(u128对于无符号整数): let a: i128 = 170141183460469231731687303715884105727; Rust如何使这些i128值在64位系统上工作?例如,如何对它们进行算术运算? 据我所知,既然该值不能容纳在x86-64 CPU的一个寄存器中,那么编译器是否会以某种方式使用2个寄存器i128?还是他们改用某种大整数结构来表示它们?

1
何时应在Rust中使用内联?
Rust具有“内联”属性,可用于以下三种口味之一: #[inline] #[inline(always)] #[inline(never)] 什么时候应该使用它们? 在Rust参考中,我们看到一个内联属性部分, 编译器会根据内部启发法自动内联函数。不正确的内联函数实际上会使程序变慢,因此应谨慎使用。 在Rust内部知识论坛中,huon在指定inline方面也很保守。 但是我们在Rust源中看到了很多用法,包括标准库。许多内联属性被添加到单行函数中,对于编译器来说,根据参考文献,通过启发式方法可以很容易地发现并优化它们。实际上不需要那些吗?

3
LLVM为什么要分配冗余变量?
这是一个带有枚举定义和main函数的简单C文件: 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, align 4 %2 = alloca i32, align 4 store i32 0, i32* %1, align 4 store i32 2, i32* …
9 c  llvm  llvm-codegen 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.