Skip to content

s0 clobber in inline assembly generates incorrect code when used with VLAΒ #157694

@nbdd0121

Description

@nbdd0121

This code:

int bar(int *x);

int foo(int s) {
    asm volatile("mv x8, x0" ::: "x8");
    int x[s];
    bar(x);
    return 0;
}

generates this assembly:

foo:
        addi    sp, sp, -16
        sw      ra, 12(sp)
        sw      s0, 8(sp)
        addi    s0, sp, 16
        li      s0, 0 ; asm code
        slli    a0, a0, 2
        addi    a0, a0, 15
        andi    a0, a0, -16
        sub     a0, sp, a0
        mv      sp, a0
        call    bar
        li      a0, 0
        addi    sp, s0, -16 ; use of `s0` while it's clobbered
        lw      ra, 12(sp)
        lw      s0, 8(sp)
        addi    sp, sp, 16
        ret

https://godbolt.org/z/5hKz8KxY8

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions