2011-11-18 107 views
3

我正在爲具有空語句的語言編寫一個編譯器。 對於像if-then-else這樣的結構,如果我可以在llvm中使用no-op語句但我沒有找到任何「官方」nop,這可能會很方便。我有一些想法,但理想情況下,我希望讓llvm優化代碼的這一部分並刪除指令;有什麼建議?LLVM無操作指令?

+0

預取和冗餘類型轉換,可以實現獲取無操作效果([ LangRef](http://llvm.org/docs/LangRef.html)) – sehe

+1

爲什麼你需要不操作? –

+0

我真的不需要*他們;但這將是一個簡單/快速的解決方案 –

回答

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條件創建標籤和分支。

  1. 這簡化了代碼生成,沒有什麼特別的情況下,什麼時候有或沒有。
  2. 優化器會將這些轉換爲phi指令。
  3. 它使意圖的代碼顯式給開發者。未來你或其他人將不再需要工作,爲什麼這個額外的指令在插入

例如:

%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