@@ -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