我正在为llvm生成带有自定义RISCV后端的代码。当我编译没有优化(-O0)时,程序是有效的。当我使用优化(-O2)进行编译时,调用后没有任何临时寄存器(调用者保存)被重新加载。优化的代码看起来确实具有良好的寄存器分配,但是它执行的操作包括使用类初始化程序的地址加载临时寄存器,然后多次调用初始化程序而无需重新加载寄存器。
document.getElementById('select-file').addEventListener('click',function(){
dialog.showOpenDialog(function (fileNames) {
if(fileNames === undefined){
console.log("No file selected");
}else{
document.getElementById("actual-file").value = fileNames[0];
readFile(fileNames[0], function(myData){
console.log(myData);
});
}
});
},false);
function readFile(filepath, callBack) {
fs.readFile(filepath, 'utf-8', function (err, data) {
if(err){
alert("An error ocurred reading the file :" + err.message);
return;
}
callBack(data);
//document.getElementById("content-editor").value = data;
});
}
.bc文件看起来与此伪代码基本相同,正确声明有效范围(lifetime.start和lifetime.end)以跨越所有函数调用。
我认为寄存器分配器的策略是首先使用调用者保存的寄存器,所以我认为这不是错误地声明寄存器的问题。在旧的寄存器分配器中,我看到loadRegFromStackSlot()或assignVirt2StackSlot()函数用于溢出需要在被破坏后重新加载的寄存器。但是在贪婪的寄存器分配器中,我没有看到发生这种情况的明显位置,因此我不知道如何调试我的后端可能缺失的内容。
也许我需要在代码生成器中添加另一个传递或不同的传递。也许我的注册申报有问题,但我不这么认为。任何见解都将不胜感激。
答案 0 :(得分:0)
如果您使用GitHub中的riscv / riscv-llvm,则可能需要获取以下修复程序。没有它,我看到了类似的问题。
https://github.com/riscv/riscv-llvm/commit/ce8ac4e3ed8956a37bf330ee4a431c6fdfabac37
以下问题报告表明存在类似问题,其中一个答案指出了上述变化: