2012-06-09 24 views
0

我一直在研究使用SSA指定的IR代碼,特別是在這種形式下生成LLVM IR。然而,當我提出一個具有非平凡複製語義的類型時,我對此是否有效感到困惑。例如,SSA表格在多大程度上允許使用非平凡複製的類型?

void f() { 
    std::string s = "Too long for you, short string optimization!"; 
    std::string s1 = s + " Also, goodbye SSA."; 
    some_other_function(s1); 
} 

在該SSA形式,至少在最明顯的水平,這導致拷貝的討厭的混亂(即使對於C++)。像LLVM這樣的優化器能夠真正優化這種情況嗎?即使對於具有非平凡複製/分配/等語義的類型,SSA是否可行?

編輯:問題是,如果我使用LLVM SSA寄存器表示複雜類型(在這種情況下,std:string),這裏通過手動使其SSA表示,可以LLVM自動轉化爲在一個突變+=呼叫此底層彙編在一般情況下,避免討厭的副本?

+0

您是否試圖查看LLVM是否可以對此進行優化? – rubenvb

+0

@rubenvb:我沒有LLVM編譯器。 – Puppy

+2

我不確定我是否理解這個問題?你問是否用單賦值變量編寫C++代碼是否有效?或者LLVM使用SSA後LLVM代碼是否有效?請注意,在LLVM中,寄存器是單一賦值,而不是內存位置。 – sepp2k

回答

1

SSA表示單個靜態分配。這是一種處理應用於寄存器的值語義的方法。每個對象都是一個機器指令的結果。

LLVM提供了一個通用的「移動」指令,這非常有用,因爲在移動8,32 N字節的體系結構範圍內有很多指令。它還提供了結構化的數據類型和數組,因爲將這些東西提供給寄存器是有用的,並且它們可以用來表示古怪的高級機器構造。意圖不是對OOP建模。

相關問題