Issue 96411
Summary [PPC][AIX] Local variable needing higher alignment shows r31 not saved with r30 as required by ABI
Labels backend:PowerPC
Assignees
Reporter hubert-reinterpretcast
    When a local variable requires alignment higher than 16, Clang/LLVM appears to use `r30` to hold the stack pointer on entry to the function.

As a callee-saved register, the value of `r30` is saved; however, the AIX ABI requires that callee-saved (a.k.a. "non-volatile") registers are saved from highest to lowest, meaning that `r31` should also be saved. The save of `r31` does not appear to be done (with optimization enabled) as required.

When the ABI rule is violated, the value of `r31` can be corrupted during EH unwinding.

### Source (`<stdin>`):
```cpp
struct A { char x alignas(32); };

void g(void *);
void f() {
  A a;
  g(&a);
}
```

### Compiler invocation:
```
clang++ --target=powerpc64-ibm-aix -O -Xclang -disable-llvm-passes -S -o - -xc++ -
```

### Compiler output (partial):
```
._Z1fv:
# %bb.0:
        mflr 0
        std 30, -16(1)
        mr      30, 1
        std 0, 16(1)
        clrldi  0, 1, 59
        subfic 0, 0, -192
        stdux 1, 1, 0
        addi 3, 1, 128
        bl ._Z1gPv[PR]
        nop
        mr      1, 30
        ld 0, 16(1)
        ld 30, -16(1)
        mtlr 0
 blr
```

### Compiler version info (`clang++ -v`):
```
clang version 19.0.0git (https://github.com/llvm/llvm-project.git 91db7add6d72d411a50c1d7265e7d115d6e4a882)
Target: x86_64-unknown-linux-gnu
Thread model: posix
InstalledDir: /opt/wandbox/clang-head/bin
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Found candidate GCC installation: /usr/lib/gcc/x86_64-linux-gnu/9
Selected GCC installation: /usr/lib/gcc/x86_64-linux-gnu/10
Candidate multilib: .;@m64
Selected multilib: .;@m64
```
_______________________________________________
llvm-bugs mailing list
llvm-bugs@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to