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:
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user