Skip to content

Commit e4b7f51

Browse files
committed
Add unique reference tracking to JIT, optimize tuple unpacking
1 parent 979d92f commit e4b7f51

File tree

8 files changed

+1021
-860
lines changed

8 files changed

+1021
-860
lines changed

Include/internal/pycore_optimizer.h

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -206,7 +206,8 @@ static inline uint16_t uop_get_error_target(const _PyUOpInstruction *inst)
206206

207207
#define REF_IS_BORROWED 1
208208
#define REF_IS_INVALID 2
209-
#define REF_TAG_BITS 3
209+
#define REF_IS_UNIQUE 4
210+
#define REF_TAG_BITS 7
210211

211212
#define JIT_BITS_TO_PTR_MASKED(REF) ((JitOptSymbol *)(((REF).bits) & (~REF_TAG_BITS)))
212213

@@ -237,6 +238,30 @@ PyJitRef_IsInvalid(JitOptRef ref)
237238
return (ref.bits & REF_IS_INVALID) == REF_IS_INVALID;
238239
}
239240

241+
static inline JitOptRef
242+
PyJitRef_MakeUnique(JitOptRef ref)
243+
{
244+
return (JitOptRef){ ref.bits | REF_IS_UNIQUE };
245+
}
246+
247+
static inline JitOptRef
248+
PyJitRef_RemoveUnique(JitOptRef ref)
249+
{
250+
return (JitOptRef){ ref.bits & (~REF_IS_UNIQUE) };
251+
}
252+
253+
static inline bool
254+
PyJitRef_IsUnique(JitOptRef ref)
255+
{
256+
return (ref.bits & REF_IS_UNIQUE) == REF_IS_UNIQUE;
257+
}
258+
259+
static inline JitOptRef
260+
PyJitRef_StripBorrowInfo(JitOptRef ref)
261+
{
262+
return (JitOptRef){ .bits = ref.bits & ~(REF_IS_BORROWED | REF_IS_INVALID) };
263+
}
264+
240265
static inline JitOptRef
241266
PyJitRef_StripReferenceInfo(JitOptRef ref)
242267
{

0 commit comments

Comments
 (0)