Skip to content

Commit 9208786

Browse files
efriedma-quictstellar
authored andcommitted
[Arm64EC] Correctly handle sret in entry thunks. (#92326)
I accidentally left out the code to transfer sret attributes to entry thunks, so values weren't being passed in the right registers, and the sret pointer wasn't returned in the correct register. Fixes #90229
1 parent bee6966 commit 9208786

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

llvm/lib/Target/AArch64/AArch64Arm64ECCallLowering.cpp

+8-1
Original file line numberDiff line numberDiff line change
@@ -514,7 +514,14 @@ Function *AArch64Arm64ECCallLowering::buildEntryThunk(Function *F) {
514514
// Call the function passed to the thunk.
515515
Value *Callee = Thunk->getArg(0);
516516
Callee = IRB.CreateBitCast(Callee, PtrTy);
517-
Value *Call = IRB.CreateCall(Arm64Ty, Callee, Args);
517+
CallInst *Call = IRB.CreateCall(Arm64Ty, Callee, Args);
518+
519+
auto SRetAttr = F->getAttributes().getParamAttr(0, Attribute::StructRet);
520+
auto InRegAttr = F->getAttributes().getParamAttr(0, Attribute::InReg);
521+
if (SRetAttr.isValid() && !InRegAttr.isValid()) {
522+
Thunk->addParamAttr(1, SRetAttr);
523+
Call->addParamAttr(0, SRetAttr);
524+
}
518525

519526
Value *RetVal = Call;
520527
if (TransformDirectToSRet) {

llvm/test/CodeGen/AArch64/arm64ec-entry-thunks.ll

+22-14
Original file line numberDiff line numberDiff line change
@@ -222,12 +222,12 @@ define i8 @matches_has_sret() nounwind {
222222
}
223223

224224
%TSRet = type { i64, i64 }
225-
define void @has_aligned_sret(ptr align 32 sret(%TSRet)) nounwind {
226-
; CHECK-LABEL: .def $ientry_thunk$cdecl$m16$v;
227-
; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m16$v
225+
define void @has_aligned_sret(ptr align 32 sret(%TSRet), i32) nounwind {
226+
; CHECK-LABEL: .def $ientry_thunk$cdecl$m16$i8;
227+
; CHECK: .section .wowthk$aa,"xr",discard,$ientry_thunk$cdecl$m16$i8
228228
; CHECK: // %bb.0:
229-
; CHECK-NEXT: stp q6, q7, [sp, #-176]! // 32-byte Folded Spill
230-
; CHECK-NEXT: .seh_save_any_reg_px q6, 176
229+
; CHECK-NEXT: stp q6, q7, [sp, #-192]! // 32-byte Folded Spill
230+
; CHECK-NEXT: .seh_save_any_reg_px q6, 192
231231
; CHECK-NEXT: stp q8, q9, [sp, #32] // 32-byte Folded Spill
232232
; CHECK-NEXT: .seh_save_any_reg_p q8, 32
233233
; CHECK-NEXT: stp q10, q11, [sp, #64] // 32-byte Folded Spill
@@ -236,17 +236,25 @@ define void @has_aligned_sret(ptr align 32 sret(%TSRet)) nounwind {
236236
; CHECK-NEXT: .seh_save_any_reg_p q12, 96
237237
; CHECK-NEXT: stp q14, q15, [sp, #128] // 32-byte Folded Spill
238238
; CHECK-NEXT: .seh_save_any_reg_p q14, 128
239-
; CHECK-NEXT: stp x29, x30, [sp, #160] // 16-byte Folded Spill
240-
; CHECK-NEXT: .seh_save_fplr 160
241-
; CHECK-NEXT: add x29, sp, #160
242-
; CHECK-NEXT: .seh_add_fp 160
239+
; CHECK-NEXT: str x19, [sp, #160] // 8-byte Folded Spill
240+
; CHECK-NEXT: .seh_save_reg x19, 160
241+
; CHECK-NEXT: stp x29, x30, [sp, #168] // 16-byte Folded Spill
242+
; CHECK-NEXT: .seh_save_fplr 168
243+
; CHECK-NEXT: add x29, sp, #168
244+
; CHECK-NEXT: .seh_add_fp 168
243245
; CHECK-NEXT: .seh_endprologue
246+
; CHECK-NEXT: mov x19, x0
247+
; CHECK-NEXT: mov x8, x0
248+
; CHECK-NEXT: mov x0, x1
244249
; CHECK-NEXT: blr x9
245250
; CHECK-NEXT: adrp x8, __os_arm64x_dispatch_ret
246251
; CHECK-NEXT: ldr x0, [x8, :lo12:__os_arm64x_dispatch_ret]
252+
; CHECK-NEXT: mov x8, x19
247253
; CHECK-NEXT: .seh_startepilogue
248-
; CHECK-NEXT: ldp x29, x30, [sp, #160] // 16-byte Folded Reload
249-
; CHECK-NEXT: .seh_save_fplr 160
254+
; CHECK-NEXT: ldp x29, x30, [sp, #168] // 16-byte Folded Reload
255+
; CHECK-NEXT: .seh_save_fplr 168
256+
; CHECK-NEXT: ldr x19, [sp, #160] // 8-byte Folded Reload
257+
; CHECK-NEXT: .seh_save_reg x19, 160
250258
; CHECK-NEXT: ldp q14, q15, [sp, #128] // 32-byte Folded Reload
251259
; CHECK-NEXT: .seh_save_any_reg_p q14, 128
252260
; CHECK-NEXT: ldp q12, q13, [sp, #96] // 32-byte Folded Reload
@@ -255,8 +263,8 @@ define void @has_aligned_sret(ptr align 32 sret(%TSRet)) nounwind {
255263
; CHECK-NEXT: .seh_save_any_reg_p q10, 64
256264
; CHECK-NEXT: ldp q8, q9, [sp, #32] // 32-byte Folded Reload
257265
; CHECK-NEXT: .seh_save_any_reg_p q8, 32
258-
; CHECK-NEXT: ldp q6, q7, [sp], #176 // 32-byte Folded Reload
259-
; CHECK-NEXT: .seh_save_any_reg_px q6, 176
266+
; CHECK-NEXT: ldp q6, q7, [sp], #192 // 32-byte Folded Reload
267+
; CHECK-NEXT: .seh_save_any_reg_px q6, 192
260268
; CHECK-NEXT: .seh_endepilogue
261269
; CHECK-NEXT: br x0
262270
; CHECK-NEXT: .seh_endfunclet
@@ -457,7 +465,7 @@ define %T2 @simple_struct(%T1 %0, %T2 %1, %T3, %T4) nounwind {
457465
; CHECK-NEXT: .symidx $ientry_thunk$cdecl$i8$v
458466
; CHECK-NEXT: .word 1
459467
; CHECK-NEXT: .symidx "#has_aligned_sret"
460-
; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m16$v
468+
; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m16$i8
461469
; CHECK-NEXT: .word 1
462470
; CHECK-NEXT: .symidx "#small_array"
463471
; CHECK-NEXT: .symidx $ientry_thunk$cdecl$m2$m2F8

0 commit comments

Comments
 (0)