[英]LLVM C-API Lifecycles of core objects
我已經開始玩 LLVM,制作一種寵物語言。 我正在使用 C-API。 我有一個解析器和基本的 AST,但我在 LLVM 方面遇到了一些障礙。 以下是我的代碼的縮小版本,用於說明我當前的問題: 我可以使用以下命令編譯它: 或者,我也嘗試過: 無論哪種方式,我都會得到這個結果: 我也試過使用 clang ...
[英]LLVM C-API Lifecycles of core objects
我已經開始玩 LLVM,制作一種寵物語言。 我正在使用 C-API。 我有一個解析器和基本的 AST,但我在 LLVM 方面遇到了一些障礙。 以下是我的代碼的縮小版本,用於說明我當前的問題: 我可以使用以下命令編譯它: 或者,我也嘗試過: 無論哪種方式,我都會得到這個結果: 我也試過使用 clang ...
[英]x86_64 incorrect calling convention when calling function
我對 LLVM 比較陌生,我正在嘗試生成調用 C 函數( growDictionary )的 LLVM IR。 這是在 x86_64 Linux 上,使用 llvm 12: 函數(在 C++ 中定義為extern "C" ,用 clang 12 編譯): 該函數按值獲取 StringDict ...
[英]LLVM-C creating object file results in: “TargetMachine can't emit a file of this type”
嘗試使用 LLVM-C 生成一個非常簡單的 object 文件。 不幸的是,我仍然堅持“TargetMachine 無法發出這種類型的文件”嘗試重新排序代碼和 CPU 的各種東西(x64-64、通用和 LLVMGetHostCPUName())。 顯然這里缺少一些東西(希望是顯而易見的)。 下面的 ...
[英]Statically scheduling OOO processors
LLVM MISched 指令調度程序使用處理器功能單元、管道和延遲的聲明性 TableGen 描述。 想象一下,試圖從這些聲明中確定與英特爾優化參考手冊中的編碼指南等效的情況。 從廣義上講,靜態調度 OOO 處理器的目標/技術是什么? 對於OOO處理器,它什么時候會在B之前調度指令A,什么時候在 ...
[英]Is signed integer overflow in safe Rust in release mode considered as undefined behavior?
Rust 在調試和發布模式下以不同的方式處理有符號整數溢出。 當它發生時,Rust 在調試模式下會發生恐慌,而在發布模式下默默地執行二進制補碼包裝。 據我所知,C/C++ 將有符號整數溢出視為未定義行為,部分原因是: 在 C 標准化的那個時候,表示有符號整數的不同底層體系結構,例如補碼,可 ...
[英]Why does LLVM allocate a redundant variable?
這是一個帶有枚舉定義和main函數的簡單 C 文件: 它轉換為以下 LLVM IR: %2顯然是d變量,它被分配了 2。 如果直接返回零, %1對應什么? ...
[英]Why isn't there a branch prediction failure penalty in this Rust code?
我寫了這個非常簡單的 Rust 函數: 我編寫了一個基本的基准測試,它使用一個有序數組和一個無序數組調用該方法: 我很驚訝這兩個基准測試的運行時間幾乎完全相同,而 Java 中的類似基准測試顯示了兩者之間的明顯差異,這大概是由於在 shuffled 情況下分支預測失敗。 我已經看到提到條件 ...
[英]Why is there a large performance impact when looping over an array with 240 or more elements?
當在Rust中的數組上運行求和循環時,我注意到當CAPACITY > = 240時性能下降很大CAPACITY = 239大約快80倍。 是否有特殊的編譯優化Rust正在為“短”數組做什么? 用rustc -C opt-level=3編譯。 use std::time::In ...
[英]How does Rust's 128-bit integer `i128` work on a 64-bit system?
Rust 有 128 位整數,它們用數據類型i128 (和u128表示無符號整數)表示: Rust 如何讓這些i128值在 64 位系統上工作; 例如,它如何對這些進行算術運算? 因為,據我所知,該值無法放入 x86-64 CPU 的一個寄存器中,編譯器是否以某種方式將 2 個寄存器用於一 ...
[英]Why does the Rust compiler not optimize code assuming that two mutable references cannot alias?
據我所知,引用/指針別名會阻礙編譯器生成優化代碼的能力,因為它們必須確保生成的二進制文件在兩個引用/指針確實別名的情況下正確運行。 例如,在下面的 C 代碼中, void adds(int *a, int *b) { *a += *b; *a += *b; } 當使用-O3標志 ...
[英]Can compilers (specifically rustc) really simplify triangle-summation to avoid a loop? How?
在 Blandy 和 Orendorff 的Programming Rust第 322 頁上是這樣的聲明: ...Rust...認識到有一種更簡單的方法可以將數字從 1 加到n :總和始終等於n * (n+1) / 2 。 這當然是一個眾所周知的等價,但是編譯器是如何識別它的呢? 我猜它 ...
[英]Does the C++ standard allow for an uninitialized bool to crash a program?
我知道 C++ 中的“未定義行為”幾乎可以讓編譯器做任何它想做的事情。 然而,我遇到了一次讓我感到驚訝的崩潰,因為我認為代碼足夠安全。 在這種情況下,真正的問題只發生在使用特定編譯器的特定平台上,並且只有在啟用優化的情況下才會發生。 我嘗試了幾種方法來重現問題並將其簡化到最大程度。 這是一個名為 ...
[英]Why does clang produce inefficient asm with -O0 (for this simple floating point sum)?
我正在 llvm clang Apple LLVM 版本 8.0.0 (clang-800.0.42.1) 上反匯編此代碼: 我編譯時沒有使用 -O 規范,但我也嘗試使用 -O0(給出相同的值)和 -O2(實際上計算值並存儲它預先計算的值) 由此產生的拆卸如下(我刪除了不相關的部分) 顯然 ...
[英]What optimization techniques are applied to Rust code that sums up a simple arithmetic sequence?
該代碼是幼稚的: use std::time; fn main() { const NUM_LOOP: u64 = std::u64::MAX; let mut sum = 0u64; let now = time::Instant::now(); for i ...
[英]Why is swapping elements of a []float64 in Go faster than swapping elements of a Vec<f64> in Rust?
我有兩個(等價的?)程序,一個在 Go 中,另一個在 Rust 中。 平均執行時間為: 去~169ms 銹~201ms 走 package main import ( "fmt" "time" ) func main() { work := []float6 ...
[英]Why can the Rust compiler not optimize away the Err arm of Box::downcast?
我有一個Box<dyn Any> ,我知道底層類型,所以我想在Box::downcast() ( 源代碼 )中優化測試。 首先我嘗試使用std::hint::unreachable_unchecked() : 和 使用rustc -C opt-level=3都會 ...
[英]What LLVM passes are performed on emitted LLVM IR?
如果我使用cargo rustc -- --emit=llvm-ir編譯,編譯器將發出LLVM IR。 下面是 Rust 使用的 LLVM pass。 對發出的 IR 執行了哪些 LLVM 傳遞(如果有)? 有什么方法可以指定在發出 IR 之前要執行哪些傳遞? ...
[英]How to map multiple same type loops under a function to the generated basic block in LLVM IR?
如果循環的類型不同,那么我可以輕松地用名稱來標識它們,但是如果有多個相同類型的循環(例如5個while循環),那么如何識別LLVM IR中的哪個基本塊對應於源代碼中的哪個循環碼? 手動識別很容易,因為我們可以順序訪問代碼和LLVM IR,但是我正在尋找如何以編程方式識別相同的對象。 ...
[英]LLVM opt mem2reg has no effect
我目前正在玩LLVM,我正在嘗試編寫一些優化器來熟悉opt和clang。 我寫了一個test.c文件,如下所示: 我編譯了源代碼並生成了2個.ll文件,一個未經優化,一個用mem2reg優化器傳遞: 兩個.ll文件都給了我以下輸出: 所以看來我的mem2reg傳遞不起作 ...
[英]What do the optimization levels `-Os` and `-Oz` do in rustc?
執行rustc -C help顯示(除其他外): 我認為 0 到 3 級相當直觀:級別越高,執行的優化就越積極。 但是,我不知道s和z選項在做什么,而且我找不到關於它們的 Rust 相關信息。 ...