@@ -102,40 +102,58 @@ define void @varargs_many_argscalleer() nounwind {
102102
103103define void @varargs_caller_tail () nounwind {
104104; CHECK-LABEL: varargs_caller_tail:
105- ; CHECK: // %bb.0:
106- ; CHECK-NEXT: sub sp, sp, #48
107- ; CHECK-NEXT: mov x4, sp
108- ; CHECK-NEXT: add x8, sp, #16
109- ; CHECK-NEXT: mov x9, #4617315517961601024 // =0x4014000000000000
110- ; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000
111- ; CHECK-NEXT: mov w1, #2 // =0x2
112- ; CHECK-NEXT: mov x2, #4613937818241073152 // =0x4008000000000000
113- ; CHECK-NEXT: mov w3, #4 // =0x4
114- ; CHECK-NEXT: mov w5, #16 // =0x10
115- ; CHECK-NEXT: stp xzr, x30, [sp, #24] // 8-byte Folded Spill
116- ; CHECK-NEXT: stp x9, x8, [sp]
117- ; CHECK-NEXT: str xzr, [sp, #16]
118- ; CHECK-NEXT: .weak_anti_dep varargs_callee
119- ; CHECK-NEXT:.set varargs_callee, "#varargs_callee"@WEAKREF
120- ; CHECK-NEXT: .weak_anti_dep "#varargs_callee"
121- ; CHECK-NEXT:.set "#varargs_callee", varargs_callee@WEAKREF
122- ; CHECK-NEXT: bl "#varargs_callee"
123- ; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
124- ; CHECK-NEXT: add x4, sp, #48
125- ; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000
126- ; CHECK-NEXT: mov w1, #4 // =0x4
127- ; CHECK-NEXT: mov w2, #3 // =0x3
128- ; CHECK-NEXT: mov w3, #2 // =0x2
129- ; CHECK-NEXT: mov x5, xzr
130- ; CHECK-NEXT: add sp, sp, #48
131- ; CHECK-NEXT: .weak_anti_dep varargs_callee
132- ; CHECK-NEXT:.set varargs_callee, "#varargs_callee"@WEAKREF
133- ; CHECK-NEXT: .weak_anti_dep "#varargs_callee"
134- ; CHECK-NEXT:.set "#varargs_callee", varargs_callee@WEAKREF
135- ; CHECK-NEXT: b "#varargs_callee"
105+ ; CHECK: // %bb.0:
106+ ; CHECK-NEXT: sub sp, sp, #48
107+ ; CHECK-NEXT: mov x4, sp
108+ ; CHECK-NEXT: add x8, sp, #16
109+ ; CHECK-NEXT: mov x9, #4617315517961601024 // =0x4014000000000000
110+ ; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000
111+ ; CHECK-NEXT: mov w1, #2 // =0x2
112+ ; CHECK-NEXT: mov x2, #4613937818241073152 // =0x4008000000000000
113+ ; CHECK-NEXT: mov w3, #4 // =0x4
114+ ; CHECK-NEXT: mov w5, #16 // =0x10
115+ ; CHECK-NEXT: stp xzr, x30, [sp, #24] // 8-byte Folded Spill
116+ ; CHECK-NEXT: stp x9, x8, [sp]
117+ ; CHECK-NEXT: str xzr, [sp, #16]
118+ ; CHECK-NEXT: .weak_anti_dep varargs_callee
119+ ; CHECK-NEXT: .set varargs_callee, "#varargs_callee"@WEAKREF
120+ ; CHECK-NEXT: .weak_anti_dep "#varargs_callee"
121+ ; CHECK-NEXT: .set "#varargs_callee", varargs_callee@WEAKREF
122+ ; CHECK-NEXT: bl "#varargs_callee"
123+ ; CHECK-NEXT: ldr x30, [sp, #32] // 8-byte Folded Reload
124+ ; CHECK-NEXT: add x4, sp, #48
125+ ; CHECK-NEXT: mov x0, #4607182418800017408 // =0x3ff0000000000000
126+ ; CHECK-NEXT: mov w1, #4 // =0x4
127+ ; CHECK-NEXT: mov w2, #3 // =0x3
128+ ; CHECK-NEXT: mov w3, #2 // =0x2
129+ ; CHECK-NEXT: mov x5, xzr
130+ ; CHECK-NEXT: add sp, sp, #48
131+ ; CHECK-NEXT: .weak_anti_dep varargs_callee
132+ ; CHECK-NEXT: .set varargs_callee, "#varargs_callee"@WEAKREF
133+ ; CHECK-NEXT: .weak_anti_dep "#varargs_callee"
134+ ; CHECK-NEXT: .set "#varargs_callee", varargs_callee@WEAKREF
135+ ; CHECK-NEXT: b "#varargs_callee"
136136 call void (double , ...) @varargs_callee (double 1 .0 , i32 2 , double 3 .0 , i32 4 , double 5 .0 , <2 x double > <double 0 .0 , double 0 .0 >)
137137 tail call void (double , ...) @varargs_callee (double 1 .0 , i32 4 , i32 3 , i32 2 )
138138 ret void
139139}
140140
141- declare void @llvm.va_start (ptr )
141+ ; Check we spill/restore x4 and x5, and don't dereference x4.
142+ define void @varargs_thunk (ptr noundef %0 , ...) "thunk" {
143+ ; CHECK-LABEL: varargs_thunk:
144+ ; CHECK: // %bb.0:
145+ ; CHECK-NEXT: ldr x11, [x0]
146+ ; CHECK-NEXT: mov x9, x5
147+ ; CHECK-NEXT: mov x10, x4
148+ ; CHECK-NEXT: //APP
149+ ; CHECK-NEXT: //NO_APP
150+ ; CHECK-NEXT: ldr x11, [x11]
151+ ; CHECK-NEXT: mov x4, x10
152+ ; CHECK-NEXT: mov x5, x9
153+ ; CHECK-NEXT: br x11
154+ call void asm "" ,"~{x4},~{x5}" ()
155+ %vtable = load ptr , ptr %0 , align 8
156+ %vtablefn = load ptr , ptr %vtable , align 8
157+ musttail call void (ptr , ...) %vtablefn (ptr noundef %0 , ...)
158+ ret void
159+ }
0 commit comments