Skip to content

Commit 3ae6d7c

Browse files
committed
runtime/IRGen: return the argument from swift_retain family of functions
On architectures where the calling convention uses the same argument register as return register this allows the argument register to be live through the calls. We use LLVM's 'returned' attribute on the parameter to facilitate this. We used to perform this optimization via an optimization pass. This was ripped out some time ago around commit 955e4ed. By using LLVM's 'returned' attribute on swift_*retain, we get the same optimization from the LLVM backend.
1 parent c95598d commit 3ae6d7c

30 files changed

+305
-272
lines changed

include/swift/Runtime/HeapObject.h

Lines changed: 33 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -204,6 +204,10 @@ void swift_slowDealloc(void *ptr, size_t bytes, size_t alignMask)
204204
///
205205
/// \param object - may be null, in which case this is a no-op
206206
///
207+
/// \return object - we return the object because this enables tail call
208+
/// optimization and the argument register to be live through the call on
209+
/// architectures whose argument and return register is the same register.
210+
///
207211
/// POSSIBILITIES: We may end up wanting a bunch of different variants:
208212
/// - the general version which correctly handles null values, swift
209213
/// objects, and ObjC objects
@@ -213,34 +217,35 @@ void swift_slowDealloc(void *ptr, size_t bytes, size_t alignMask)
213217
/// It may also prove worthwhile to have this use a custom CC
214218
/// which preserves a larger set of registers.
215219
SWIFT_RT_ENTRY_VISIBILITY
216-
void swift_retain(HeapObject *object)
220+
HeapObject *swift_retain(HeapObject *object)
217221
SWIFT_CC(RegisterPreservingCC);
218222

219223
SWIFT_RUNTIME_EXPORT
220-
void (*SWIFT_CC(RegisterPreservingCC) _swift_retain)(HeapObject *object);
224+
HeapObject *(*SWIFT_CC(RegisterPreservingCC) _swift_retain)(HeapObject *object);
221225

222226
SWIFT_RT_ENTRY_VISIBILITY
223-
void swift_retain_n(HeapObject *object, uint32_t n)
227+
HeapObject *swift_retain_n(HeapObject *object, uint32_t n)
224228
SWIFT_CC(RegisterPreservingCC);
225229

226230
SWIFT_RUNTIME_EXPORT
227-
void (*SWIFT_CC(RegisterPreservingCC) _swift_retain_n)(HeapObject *object,
228-
uint32_t n);
231+
HeapObject *(*SWIFT_CC(RegisterPreservingCC)
232+
_swift_retain_n)(HeapObject *object, uint32_t n);
229233

230234
SWIFT_RT_ENTRY_VISIBILITY
231-
void swift_nonatomic_retain(HeapObject *object)
235+
HeapObject *swift_nonatomic_retain(HeapObject *object)
232236
SWIFT_CC(RegisterPreservingCC);
233237

234238
SWIFT_RUNTIME_EXPORT
235-
void (*SWIFT_CC(RegisterPreservingCC) _swift_nonatomic_retain)(HeapObject *object);
239+
HeapObject *(*SWIFT_CC(RegisterPreservingCC)
240+
_swift_nonatomic_retain)(HeapObject *object);
236241

237242
SWIFT_RT_ENTRY_VISIBILITY
238-
void swift_nonatomic_retain_n(HeapObject *object, uint32_t n)
243+
HeapObject* swift_nonatomic_retain_n(HeapObject *object, uint32_t n)
239244
SWIFT_CC(RegisterPreservingCC);
240245

241246
SWIFT_RUNTIME_EXPORT
242-
void (*SWIFT_CC(RegisterPreservingCC) _swift_nonatomic_retain_n)(HeapObject *object,
243-
uint32_t n);
247+
HeapObject *(*SWIFT_CC(RegisterPreservingCC)
248+
_swift_nonatomic_retain_n)(HeapObject *object, uint32_t n);
244249

245250
/// Atomically increments the reference count of an object, unless it has
246251
/// already been destroyed. Returns nil if the object is dead.
@@ -525,7 +530,7 @@ struct UnownedReference {
525530

526531
/// Increment the unowned retain count.
527532
SWIFT_RT_ENTRY_VISIBILITY
528-
void swift_unownedRetain(HeapObject *value)
533+
HeapObject *swift_unownedRetain(HeapObject *value)
529534
SWIFT_CC(RegisterPreservingCC);
530535

531536
/// Decrement the unowned retain count.
@@ -535,7 +540,7 @@ void swift_unownedRelease(HeapObject *value)
535540

536541
/// Increment the unowned retain count.
537542
SWIFT_RT_ENTRY_VISIBILITY
538-
void swift_nonatomic_unownedRetain(HeapObject *value)
543+
void *swift_nonatomic_unownedRetain(HeapObject *value)
539544
SWIFT_CC(RegisterPreservingCC);
540545

541546
/// Decrement the unowned retain count.
@@ -545,7 +550,7 @@ void swift_nonatomic_unownedRelease(HeapObject *value)
545550

546551
/// Increment the unowned retain count by n.
547552
SWIFT_RT_ENTRY_VISIBILITY
548-
void swift_unownedRetain_n(HeapObject *value, int n)
553+
HeapObject *swift_unownedRetain_n(HeapObject *value, int n)
549554
SWIFT_CC(RegisterPreservingCC);
550555

551556
/// Decrement the unowned retain count by n.
@@ -555,7 +560,7 @@ void swift_unownedRelease_n(HeapObject *value, int n)
555560

556561
/// Increment the unowned retain count by n.
557562
SWIFT_RT_ENTRY_VISIBILITY
558-
void swift_nonatomic_unownedRetain_n(HeapObject *value, int n)
563+
HeapObject *swift_nonatomic_unownedRetain_n(HeapObject *value, int n)
559564
SWIFT_CC(RegisterPreservingCC);
560565

561566
/// Decrement the unowned retain count by n.
@@ -566,13 +571,13 @@ void swift_nonatomic_unownedRelease_n(HeapObject *value, int n)
566571
/// Increment the strong retain count of an object, aborting if it has
567572
/// been deallocated.
568573
SWIFT_RT_ENTRY_VISIBILITY
569-
void swift_unownedRetainStrong(HeapObject *value)
574+
HeapObject *swift_unownedRetainStrong(HeapObject *value)
570575
SWIFT_CC(RegisterPreservingCC);
571576

572577
/// Increment the strong retain count of an object, aborting if it has
573578
/// been deallocated.
574579
SWIFT_RT_ENTRY_VISIBILITY
575-
void swift_nonatomic_unownedRetainStrong(HeapObject *value)
580+
HeapObject *swift_nonatomic_unownedRetainStrong(HeapObject *value)
576581
SWIFT_CC(RegisterPreservingCC);
577582

578583
/// Increment the strong retain count of an object which may have been
@@ -770,46 +775,46 @@ void *swift_nonatomic_bridgeObjectRetain_n(void *value, int n)
770775
/// Increment the strong retain count of an object which might not be a native
771776
/// Swift object.
772777
SWIFT_RUNTIME_EXPORT
773-
void swift_unknownRetain(void *value)
778+
void *swift_unknownRetain(void *value)
774779
SWIFT_CC(DefaultCC);
775780
/// Increment the strong retain count of an object which might not be a native
776781
/// Swift object by n.
777782
SWIFT_RUNTIME_EXPORT
778-
void swift_unknownRetain_n(void *value, int n)
783+
void *swift_unknownRetain_n(void *value, int n)
779784
SWIFT_CC(DefaultCC);
780785

781786
/// Increment the strong retain count of an object which might not be a native
782787
/// Swift object.
783788
SWIFT_RUNTIME_EXPORT
784-
void swift_nonatomic_unknownRetain(void *value)
789+
void *swift_nonatomic_unknownRetain(void *value)
785790
SWIFT_CC(DefaultCC);
786791
/// Increment the strong retain count of an object which might not be a native
787792
/// Swift object by n.
788793
SWIFT_RUNTIME_EXPORT
789-
void swift_nonatomic_unknownRetain_n(void *value, int n)
794+
void *swift_nonatomic_unknownRetain_n(void *value, int n)
790795
SWIFT_CC(DefaultCC);
791796

792797

793798
#else
794799

795-
static inline void swift_unknownRetain(void *value)
800+
static inline void *swift_unknownRetain(void *value)
796801
SWIFT_CC(DefaultCC) {
797-
swift_retain(static_cast<HeapObject *>(value));
802+
return swift_retain(static_cast<HeapObject *>(value));
798803
}
799804

800-
static inline void swift_unknownRetain_n(void *value, int n)
805+
static inline void *swift_unknownRetain_n(void *value, int n)
801806
SWIFT_CC(DefaultCC) {
802-
swift_retain_n(static_cast<HeapObject *>(value), n);
807+
return swift_retain_n(static_cast<HeapObject *>(value), n);
803808
}
804809

805-
static inline void swift_nonatomic_unknownRetain(void *value)
810+
static inline void *swift_nonatomic_unknownRetain(void *value)
806811
SWIFT_CC(DefaultCC) {
807-
swift_nonatomic_retain(static_cast<HeapObject *>(value));
812+
return swift_nonatomic_retain(static_cast<HeapObject *>(value));
808813
}
809814

810-
static inline void swift_nonatomic_unknownRetain_n(void *value, int n)
815+
static inline void *swift_nonatomic_unknownRetain_n(void *value, int n)
811816
SWIFT_CC(DefaultCC) {
812-
swift_nonatomic_retain_n(static_cast<HeapObject *>(value), n);
817+
return swift_nonatomic_retain_n(static_cast<HeapObject *>(value), n);
813818
}
814819

815820

include/swift/Runtime/InstrumentsSupport.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,11 @@ SWIFT_RUNTIME_EXPORT
2929
BoxPair::Return (*_swift_allocBox)(Metadata const *type);
3030

3131
SWIFT_RUNTIME_EXPORT
32-
void (*_swift_retain)(HeapObject *object);
32+
HeapObject *(*_swift_retain)(HeapObject *object);
3333
SWIFT_RUNTIME_EXPORT
34-
void (*_swift_retain_n)(HeapObject *object, uint32_t n);
34+
HeapObject *(*_swift_retain_n)(HeapObject *object, uint32_t n);
3535
SWIFT_RUNTIME_EXPORT
36-
void (*_swift_nonatomic_retain)(HeapObject *object);
36+
HeapObject *(*_swift_nonatomic_retain)(HeapObject *object);
3737
SWIFT_RUNTIME_EXPORT
3838
HeapObject *(*_swift_tryRetain)(HeapObject *object);
3939
SWIFT_RUNTIME_EXPORT

0 commit comments

Comments
 (0)