@@ -203,30 +203,18 @@ STATIC_INLINE size_t JL_CONST_FUNC jl_gc_alignsz(size_t sz, size_t alignment)
203
203
}
204
204
205
205
// 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 )
207
207
{
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 ;
230
218
}
231
219
232
220
#ifdef __GNUC__
@@ -241,9 +229,12 @@ STATIC_INLINE jl_value_t *jl_gc_alloc_(jl_ptls_t ptls, size_t sz, size_t alignme
241
229
if (allocsz < sz) // overflow in adding offs, size was "negative"
242
230
jl_throw (jl_memory_exception);
243
231
const size_t alignsz = jl_gc_alignsz (allocsz, alignment);
232
+ assert (alignsz >= allocsz);
233
+ const int klass = jl_gc_szclass (alignsz, alignment);
244
234
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;
247
238
jl_gc_pool_t *p = &ptls->heap .norm_pools [pool_id];
248
239
int osize;
249
240
if (jl_is_constexpr (alignsz)) {
0 commit comments