why 8-byte Spill happens?


我有一段求阶乘的C代码如下:


 long int rfact(long int x)
{
    if(x <= 1)
    {
        return 1;
    }
    long int temp = x-1;
    return x * rfact(temp);
}

temp变量只是为了看gcc怎么分配栈的
然后我 gcc -S rfact.c 得到的汇编代码部分如下


 subq    $32, %rsp
    movq    %rdi, -16(%rbp)
    cmpq    $1, -16(%rbp)
    jg    LBB0_2
## BB#1:
    movq    $1, -8(%rbp)
    jmp    LBB0_3
LBB0_2:
    movq    -16(%rbp), %rax
    subq    $1, %rax
    movq    %rax, -24(%rbp)
    movq    -16(%rbp), %rax
    movq    -24(%rbp), %rdi
    movq    %rax, -32(%rbp)         ## 8-byte Spill
    callq    _rfact
    movq    -32(%rbp), %rdi         ## 8-byte Reload
    imulq    %rax, %rdi
    movq    %rdi, -8(%rbp)
LBB0_3:
    movq    -8(%rbp), %rax
    addq    $32, %rsp
    popq    %rbp
    retq

可以看到gcc自己在两行代码后面加了注释 ## 8-byte Spill
不太明白它为什么要这么做,因为有几句代码是冗余的,对于下面几行


 movq -16(%rbp), %rax
    ...
    movq %rax, -32(%rbp)    ## 8-byte Spill
    callq _rfact
    moveq -32(%rbp), %rdi   ## 8-byte Reload

上面代码其实就是又存了一个参数x的副本,删掉前面两句movq改成以下似乎也没有问题,代码运行后结果正常


 ...
    callq _rfact
    movq -16(%rbp), %rdi

那么,请问下gcc自己给的那个8-byte Spill是什么意思呢,如果我这么改汇编代码会给最终生成的可执行文件带来什么隐患吗?

c asm gcc

hwbest 9 years, 2 months ago
梅尔西迪斯 answered 9 years, 2 months ago

Your Answer