2017-01-28 68 views
0

我正在为llvm生成具有定制RISCV后端的代码。当我没有优化编译(-O0)时,程序是可用的。当我使用优化编译(-O2)时,没有任何临时寄存器(保存的调用者)在调用后重新加载。经过优化的代码看起来似乎具有良好的寄存器分配,但它可以执行诸如使用类初始化程序的地址加载临时寄存器,然后多次调用初始化程序而不重新加载寄存器的操作。函数调用后,llvm调用者保存的寄存器未重新载入

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

的.BC文件看起来基本上是相同的,因为这伪代码,正确地宣布生存区间(lifetime.start和lifetime.end)跨越所有的函数调用。

我认为寄存器分配器的策略是首先使用调用者保存的寄存器,所以我不认为这是错误地声明我的寄存器的问题。在较老的寄存器分配器中,我看到loadRegFromStackSlot()或assignVirt2StackSlot()函数用于溢出需要在重载后重新加载的寄存器。但是在贪婪的寄存器分配器中,我没有看到发生这种情况的明显位置,所以我不知道如何调试我的后端可能会丢失的内容。

也许我需要添加另一个通行证或不同的通行证到代码生成器。也许我的注册声明有问题,但我不这么认为。任何洞察力将不胜感激。

回答