rnk wrote:

By the way, the x86 backend also miscompiles test cases like this:
```
struct ByVal { int large[5]; };
void f(ByVal a, ByVal b);
void g(ByVal a, ByVal b) {
  [[clang::musttail]] f(b, a);
}
```

I have an internal issue assigned to @aeubanks tracking that. I may have 
reported it upstream. It should be looked into. It uses the analogous 
copy-pasted "MatchingStackOffset" helpers which have been removed in this 
change, and any technique used for ARM is probably applicable to x86.

I think we'd get decent code by doing a sequence of `LOAD <all outgoing byval 
bytes to vregs> ; TOKENFACTOR ; STORE <all vregs to byval argument slots>`. 
This would allow the register allocator to use the register file as temporary 
storage to implement the swap, instead of having to conservatively allocate 
temporary stack space to copy every outgoing byval arguement, or implement 
complicated aliasing rules to avoid the need to do that.

https://github.com/llvm/llvm-project/pull/109943
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to