llvm调用者保存的寄存器在函数调用后没有重新加载

时间:2017-01-28 04:17:33

标签: llvm riscv register-allocation

我正在为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()函数用于溢出需要在被破坏后重新加载的寄存器。但是在贪婪的寄存器分配器中,我没有看到发生这种情况的明显位置,因此我不知道如何调试我的后端可能缺失的内容。

也许我需要在代码生成器中添加另一个传递或不同的传递。也许我的注册申报有问题,但我不这么认为。任何见解都将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果您使用GitHub中的riscv / riscv-llvm,则可能需要获取以下修复程序。没有它,我看到了类似的问题。

https://github.com/riscv/riscv-llvm/commit/ce8ac4e3ed8956a37bf330ee4a431c6fdfabac37

以下问题报告表明存在类似问题,其中一个答案指出了上述变化:

https://github.com/riscv/riscv-llvm/issues/32