Fix StructReturn handling: properly mark the clobber, and offset actual rets. (#5023)

* Fix StructReturn handling: properly mark the clobber, and offset actual rets.

The legalization of `StructReturn` was causing issues in the new
call-handling code: the `StructReturn` ret was included in the `SigData` as
if it were an actual CLIF-level return value, but it is not.

Prior to using regalloc constraints for return values, we
unconditionally included rax (or the architecture's usual return
register) as a def, so it would be properly handled as "clobbered" by
the regalloc. With the new scheme, we include defs on the call only for
CLIF-level outputs. Callees with `StructReturn` args were thus not known
to clobber the return-value register, and values might be corrupted.

This PR updates the code to include a `StructReturn` ret as a clobber
rather than a returned value in the relevant spots. I observed it
causing saves/restores of rax in some CLIF that @bjorn3 provided me, but
I was having difficulty minimizing this into a test-case that I would be
comfortable including as a precise-output case (including the whole
thing verbatim would lock down a bunch of other irrelevant details and
cause test-update noise later). If we can find a more minimized example
I'm happy to include it as a filetest.

Fixes #5018.
This commit is contained in:
Chris Fallin
2022-10-06 17:14:38 -07:00
committed by GitHub
parent b454110ac7
commit e95ffe4413
4 changed files with 38 additions and 9 deletions

View File

@@ -475,7 +475,6 @@ block0(v0: i64):
; mov x8, x0
; ldr x4, 8 ; b 12 ; data TestCase(%g) + 0
; blr x4
; mov x0, x8
; ldp fp, lr, [sp], #16
; ret

View File

@@ -33,6 +33,7 @@ block0(v0: i64, v1: i64):
; movq %rsi, %rdi
; load_ext_name %f2+0, %r8
; call *%r8
; movq %rdx, %rax
; movq %rbp, %rsp
; popq %rbp
; ret
@@ -47,10 +48,15 @@ block0(v0: i64):
; pushq %rbp
; movq %rsp, %rbp
; subq %rsp, $16, %rsp
; movq %r15, 0(%rsp)
; block0:
; movq %rdi, %rax
; movq %rdi, %r15
; load_ext_name %f4+0, %rdx
; call *%rdx
; movq %r15, %rax
; movq 0(%rsp), %r15
; addq %rsp, $16, %rsp
; movq %rbp, %rsp
; popq %rbp
; ret