我正在爲具有空語句的語言編寫一個編譯器。 對於像if-then-else這樣的結構,如果我可以在llvm中使用no-op語句但我沒有找到任何「官方」nop,這可能會很方便。我有一些想法,但理想情況下,我希望讓llvm優化代碼的這一部分並刪除指令;有什麼建議?LLVM無操作指令?
3
A
回答
6
IR中沒有無操作碼。但是,您可以安全地使用任何無副作用的死指令作爲替換(即,如果您真的需要發出無操作,則因爲優化程序會輕鬆刪除它們)。例如。 %nop = add i1 0, 0
或%nop = alloca i1, i1 0
可以工作。
3
看看這種內在的:
declare void @llvm.donothing() nounwind readnone
從LLVM語言參考手冊:
的llvm.donothing內在不執行任何操作。它是隻有兩個內部函數之一(除了llvm.experimental.patchpoint),它們可以通過調用指令調用。
0
代替noop或優化noop的語句,爲if條件創建標籤和分支。
- 這簡化了代碼生成,沒有什麼特別的情況下,什麼時候有或沒有。
- 優化器會將這些轉換爲phi指令。
- 它使意圖的代碼顯式給開發者。未來你或其他人將不再需要工作,爲什麼這個額外的指令在插入
例如:
%2 = icmp sgt i32 %0, %1
br i1 %2, label %3, label %7
; <label>:3
; ;; [instructions in block redacted for simplicity]
br label %8
; <label>:7
br label %8
; <label>:8
%9 = load i32* %x, align 4 ;; continue on our merry way
相關問題
- 1. 替換LLVM指令的操作數
- 2. 複製llvm指令
- 3. LLVM IR alloca指令
- 4. LLVM指令調度
- 5. LLVM:創建CallInst空指針操作
- 6. LLVM - 沒有BB的指令無效
- 7. invoke指令在LLVM中如何工作?
- 8. LLVM指令* - > getOperand()無法正常工作ICMP
- 9. LLVM IR指令插入
- 10. LLVM ICmpInst指令鑄造
- 11. 替換LLVM中的指令
- 12. 刪除一堆llvm指令
- 13. 如何插入LLVM指令?
- 14. LLVM擦除指令IR
- 15. LLVM找不到getelementptr指令
- 16. 操作組裝指令
- 17. ARM SUB指令操作數
- 18. 在LLVM中的運行時訪問操作數指令的內容
- 19. 如何在llvm-tablegen中將自己的寄存器操作數映射到指令的操作碼?
- 20. AngularJS指令DOM操作不起作用
- 21. X86'cmpps'指令和LLVM IR'fcmp'指令是否可互換?
- 22. LLVM分段錯誤/需要使用指令而不是指令*
- 23. LLVM「指令不稱霸所有用途」 - 插入新的指令
- 24. 無效的指針操作
- 25. 如何在LLVM中打印出指令?
- 26. 插入GetElementpointer指令在LLVM IR
- 27. 創建新的存儲指令LLVM
- 28. LLVM - 如何得到一個指令
- 29. 刪除llvm中的一系列指令
- 30. LLVM指令變量名稱和參數
預取和冗餘類型轉換,可以實現獲取無操作效果([ LangRef](http://llvm.org/docs/LangRef.html)) – sehe
爲什麼你需要不操作? –
我真的不需要*他們;但這將是一個簡單/快速的解決方案 –