Skip to content

Commit 1943cce

Browse files
committed
switch jl_gc_szclass to a while loop
1 parent 09bc48d commit 1943cce

File tree

2 files changed

+18
-26
lines changed

2 files changed

+18
-26
lines changed

src/gc.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1006,7 +1006,8 @@ int jl_gc_classify_pools(size_t sz, size_t alignment, int *osize)
10061006
return -1;
10071007
size_t allocsz = sz + sizeof(jl_taggedvalue_t);
10081008
size_t alignsz = jl_gc_alignsz(allocsz, alignment);
1009-
int klass = jl_gc_szclass(alignsz);
1009+
int klass = jl_gc_szclass(alignsz, alignment);
1010+
assert(klass != -1);
10101011
*osize = jl_gc_sizeclasses[klass];
10111012
return (int)(intptr_t)(&((jl_ptls_t)0)->heap.norm_pools[klass]);
10121013
}

src/julia_internal.h

Lines changed: 16 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -203,30 +203,18 @@ STATIC_INLINE size_t JL_CONST_FUNC jl_gc_alignsz(size_t sz, size_t alignment)
203203
}
204204

205205
// Use jl_gc_alignsz to obtain the right sz.
206-
STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass(size_t sz)
206+
STATIC_INLINE int JL_CONST_FUNC jl_gc_szclass(size_t sz, size_t alignment)
207207
{
208-
// Check that the object fits in the largest pool.
209-
assert(sz <= GC_MAX_SZCLASS + sizeof(jl_taggedvalue_t));
210-
#ifdef _P64
211-
if (sz <= 8)
212-
return 0;
213-
const int N = 0;
214-
#elif defined(_CPU_ARM_) || defined(_CPU_PPC_)
215-
if (sz <= 8)
216-
return (sz + 3) / 4 - 1;
217-
const int N = 1;
218-
#else
219-
if (sz <= 12)
220-
return (sz + 3) / 4 - 1;
221-
const int N = 2;
222-
#endif
223-
if (sz <= 256)
224-
return (sz + 15) / 16 + N;
225-
if (sz <= 496)
226-
return 16 - 16376 / 4 / LLT_ALIGN(sz, 16 * 4) + 16 + N;
227-
if (sz <= 1008)
228-
return 16 - 16376 / 2 / LLT_ALIGN(sz, 16 * 2) + 24 + N;
229-
return 16 - 16376 / 1 / LLT_ALIGN(sz, 16 * 1) + 32 + N;
208+
size_t klass = 0;
209+
while (klass < JL_GC_N_POOLS) {
210+
size_t osize = jl_gc_sizeclasses[klass];
211+
if (sz <= osize) {
212+
if (alignment == 1 || alignment == 0 || osize % alignment == 0)
213+
return klass;
214+
}
215+
klass++;
216+
}
217+
return -1;
230218
}
231219

232220
#ifdef __GNUC__
@@ -241,9 +229,12 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, size_t alignme
241229
if (allocsz < sz) // overflow in adding offs, size was "negative"
242230
jl_throw(jl_memory_exception);
243231
const size_t alignsz = jl_gc_alignsz(allocsz, alignment);
232+
assert(alignsz >= allocsz);
233+
const int klass = jl_gc_szclass(alignsz, alignment);
244234
jl_value_t *v;
245-
if (alignsz <= GC_MAX_SZCLASS + sizeof(jl_taggedvalue_t)) {
246-
int pool_id = jl_gc_szclass(alignsz);
235+
if (klass != -1){
236+
assert(alignsz <= GC_MAX_SZCLASS + sizeof(jl_taggedvalue_t));
237+
int pool_id = klass;
247238
jl_gc_pool_t *p = &ptls->heap.norm_pools[pool_id];
248239
int osize;
249240
if (jl_is_constexpr(alignsz)) {

0 commit comments

Comments
 (0)