2017-01-28 84 views
0

我正在爲llvm生成具有定製RISCV後端的代碼。當我沒有優化編譯(-O0)時,程序是可用的。當我使用優化編譯(-O2)時,沒有任何臨時寄存器(保存的調用者)在調用後重新加載。經過優化的代碼看起來似乎具有良好的寄存器分配,但它可以執行諸如使用類初始化程序的地址加載臨時寄存器,然後多次調用初始化程序而不重新加載寄存器的操作。函數調用後,llvm調用者保存的寄存器未重新載入

load t1 %(foo) 
jal t1 
... 
jal t1 
... 
jal t1 

的.BC文件看起來基本上是相同的,因爲這僞代碼,正確地宣佈生存區間(lifetime.start和lifetime.end)跨越所有的函數調用。

我認爲寄存器分配器的策略是首先使用調用者保存的寄存器,所以我不認爲這是錯誤地聲明我的寄存器的問題。在較老的寄存器分配器中,我看到loadRegFromStackSlot()或assignVirt2StackSlot()函數用於溢出需要在重載後重新加載的寄存器。但是在貪婪的寄存器分配器中,我沒有看到發生這種情況的明顯位置,所以我不知道如何調試我的後端可能會丟失的內容。

也許我需要添加另一個通行證或不同的通行證到代碼生成器。也許我的註冊聲明有問題,但我不這麼認爲。任何洞察力將不勝感激。

回答