Skip to content

Commit fe5bd9f

Browse files
committed
switch jl_gc_szclass to a while loop
1 parent 794085a commit fe5bd9f

File tree

2 files changed

+16
-26
lines changed

2 files changed

+16
-26
lines changed

src/gc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -971,7 +971,8 @@ int jl_gc_classify_pools(size_t sz, size_t alignment, int *osize)
971971
return -1;
972972
size_t allocsz = sz + sizeof(jl_taggedvalue_t);
973973
size_t alignsz = jl_gc_alignsz(allocsz, alignment);
974-
int klass = jl_gc_szclass(alignsz);
974+
int klass = jl_gc_szclass(alignsz, alignment);
975+
assert(klass != -1);
975976
*osize = jl_gc_sizeclasses[klass];
976977
return (int)(intptr_t)(&((jl_ptls_t)0)->heap.norm_pools[klass]);
977978
}

src/julia_internal.h

Lines changed: 14 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -190,30 +190,18 @@ STATIC_INLINE int JL_CONST_FUNC jl_gc_alignsz(size_t sz, size_t alignment)
190190
}
191191

192192
// Use jl_gc_alignsz to obtain the right sz.
193-
STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass(size_t sz)
193+
STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass(size_t sz, size_t alignment)
194194
{
195-
// Check that the object fits in the largest pool.
196-
assert(sz <= GC_MAX_SZCLASS + sizeof(jl_taggedvalue_t));
197-
#ifdef _P64
198-
if (sz <= 8)
199-
return 0;
200-
const int N = 0;
201-
#elif defined(_CPU_ARM_) || defined(_CPU_PPC_) || defined(_CPU_X86_)
202-
if (sz <= 8)
203-
return (sz + 3) / 4 - 1;
204-
const int N = 1;
205-
#else
206-
if (sz <= 12)
207-
return (sz + 3) / 4 - 1;
208-
const int N = 2;
209-
#endif
210-
if (sz <= 256)
211-
return (sz + 15) / 16 + N;
212-
if (sz <= 496)
213-
return 16 - 16376 / 4 / LLT_ALIGN(sz, 16 * 4) + 16 + N;
214-
if (sz <= 1008)
215-
return 16 - 16376 / 2 / LLT_ALIGN(sz, 16 * 2) + 24 + N;
216-
return 16 - 16376 / 1 / LLT_ALIGN(sz, 16 * 1) + 32 + N;
195+
size_t klass = 0;
196+
while (klass < JL_GC_N_POOLS) {
197+
size_t osize = jl_gc_sizeclasses[klass];
198+
if (sz <= osize) {
199+
if (alignment == 1 || alignment == 0 || osize % alignment == 0)
200+
return klass;
201+
}
202+
klass++;
203+
}
204+
return -1;
217205
}
218206

219207
#ifdef __GNUC__
@@ -228,9 +216,10 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, size_t alignme
228216
if (allocsz < sz) // overflow in adding offs, size was "negative"
229217
jl_throw(jl_memory_exception);
230218
const size_t alignsz = jl_gc_alignsz(allocsz, alignment);
219+
const int klass = jl_gc_szclass(alignsz, alignment);
231220
jl_value_t *v;
232-
if (alignsz <= GC_MAX_SZCLASS + sizeof(jl_taggedvalue_t)) {
233-
int pool_id = jl_gc_szclass(alignsz);
221+
if (klass != -1 && alignsz <= GC_MAX_SZCLASS + sizeof(jl_taggedvalue_t)) {
222+
int pool_id = klass;
234223
jl_gc_pool_t *p = &ptls->heap.norm_pools[pool_id];
235224
int osize;
236225
if (jl_is_constexpr(alignsz)) {

0 commit comments

Comments
 (0)