Skip to content

Commit 663ebe5

Browse files
authored
Hoist Wosize_val from end conditions of loops (#2301)
1 parent 21358fd commit 663ebe5

File tree

9 files changed

+30
-13
lines changed

9 files changed

+30
-13
lines changed

ocaml/runtime/backtrace.c

+7-4
Original file line numberDiff line numberDiff line change
@@ -278,7 +278,9 @@ CAMLprim value caml_convert_raw_backtrace(value bt)
278278
if (!caml_debug_info_available())
279279
caml_failwith("No debug information available");
280280

281-
for (i = 0, index = 0; i < Wosize_val(bt); ++i)
281+
mlsize_t bt_size = Wosize_val(bt);
282+
283+
for (i = 0, index = 0; i < bt_size; ++i)
282284
{
283285
debuginfo dbg;
284286
for (dbg = caml_debuginfo_extract(Backtrace_slot_val(Field(bt, i)));
@@ -289,7 +291,7 @@ CAMLprim value caml_convert_raw_backtrace(value bt)
289291

290292
array = caml_alloc(index, 0);
291293

292-
for (i = 0, index = 0; i < Wosize_val(bt); ++i)
294+
for (i = 0, index = 0; i < bt_size; ++i)
293295
{
294296
debuginfo dbg;
295297
for (dbg = caml_debuginfo_extract(Backtrace_slot_val(Field(bt, i)));
@@ -359,8 +361,9 @@ CAMLprim value caml_get_exception_backtrace(value unit)
359361
} else {
360362
backtrace = caml_get_exception_raw_backtrace(Val_unit);
361363

362-
arr = caml_alloc(Wosize_val(backtrace), 0);
363-
for (i = 0; i < Wosize_val(backtrace); i++) {
364+
mlsize_t backtrace_size = Wosize_val(backtrace);
365+
arr = caml_alloc(backtrace_size, 0);
366+
for (i = 0; i < backtrace_size; i++) {
364367
backtrace_slot slot = Backtrace_slot_val(Field(backtrace, i));
365368
debuginfo dbg = caml_debuginfo_extract(slot);
366369
Store_field(arr, i, caml_convert_debuginfo(dbg));

ocaml/runtime/caml/mlvalues.h

+6
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,12 @@ where 0 <= R <= 31 is HEADER_RESERVED_BITS, set with the
172172
#define Num_tags (1ull << HEADER_TAG_BITS)
173173
#define Max_wosize ((1ull << HEADER_WOSIZE_BITS) - 1ull)
174174

175+
// Note that Wosize_val and the other macros that read headers will not
176+
// be optimized by common subexpression elimination, because of the
177+
// atomic header loads. It is best to bind the results of such macros
178+
// to variables if they will be tested repeatedly, e.g. as the end condition
179+
// in a for-loop.
180+
175181
#define Wosize_val(val) (Wosize_hd (Hd_val (val)))
176182
#define Wosize_op(op) (Wosize_val (op))
177183
#define Wosize_bp(bp) (Wosize_val (bp))

ocaml/runtime/globroots.c

+4-2
Original file line numberDiff line numberDiff line change
@@ -251,7 +251,8 @@ static void scan_native_globals(scanning_action f, void* fdata)
251251
for(glob = caml_globals[i]; *glob != 0; glob++) {
252252
glob_block = *glob;
253253
compute_index_for_global_root_scan(&glob_block, &start);
254-
for (j = start; j < Wosize_val(glob_block); j++) {
254+
mlsize_t size = Wosize_val(glob_block);
255+
for (j = start; j < size; j++) {
255256
f(fdata, Field(glob_block, j), &Field(glob_block, j));
256257
}
257258
}
@@ -262,7 +263,8 @@ static void scan_native_globals(scanning_action f, void* fdata)
262263
for(glob = (value *) lnk->data; *glob != 0; glob++) {
263264
glob_block = *glob;
264265
compute_index_for_global_root_scan(&glob_block, &start);
265-
for (j = start; j < Wosize_val(glob_block); j++) {
266+
mlsize_t size = Wosize_val(glob_block);
267+
for (j = start; j < size; j++) {
266268
f(fdata, Field(glob_block, j), &Field(glob_block, j));
267269
}
268270
}

ocaml/runtime/memory.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -328,7 +328,8 @@ CAMLexport void caml_set_fields (value obj, value v)
328328
int i;
329329
CAMLassert (Is_block(obj));
330330

331-
for (i = 0; i < Wosize_val(obj); i++) {
331+
mlsize_t size = Wosize_val(obj);
332+
for (i = 0; i < size; i++) {
332333
caml_modify(&Field(obj, i), v);
333334
}
334335
}

ocaml/runtime/meta.c

+3-2
Original file line numberDiff line numberDiff line change
@@ -67,14 +67,15 @@ static char* buffer_of_bytes_array(value ls, asize_t *len)
6767
int i;
6868

6969
*len = 0;
70-
for (i = 0; i < Wosize_val(ls); i++) {
70+
mlsize_t ls_size = Wosize_val(ls);
71+
for (i = 0; i < ls_size; i++) {
7172
s = Field(ls, i);
7273
*len += caml_string_length(s);
7374
}
7475

7576
ret = caml_stat_alloc(*len);
7677
off = 0;
77-
for (i = 0; i < Wosize_val(ls); i++) {
78+
for (i = 0; i < ls_size; i++) {
7879
size_t s_len;
7980
s = Field(ls, i);
8081
s_len = caml_string_length(s);

ocaml/runtime/minor_gc.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -416,7 +416,8 @@ static void oldify_mopup (struct oldify_state* st, int do_ephemerons)
416416
if (Is_block (f) && Is_young(f)) {
417417
oldify_one (st, f, Op_val (new_v));
418418
}
419-
for (i = 1; i < Wosize_val (new_v); i++){
419+
mlsize_t new_v_size = Wosize_val (new_v);
420+
for (i = 1; i < new_v_size; i++){
420421
f = Field(v, i);
421422
CAMLassert (!Is_debug_tag(f));
422423
if (Is_block (f) && Is_young(f)) {

ocaml/runtime/printexc.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,8 @@ CAMLexport char * caml_format_exception(value exn)
7474
start = 1;
7575
}
7676
add_char(&buf, '(');
77-
for (i = start; i < Wosize_val(bucket); i++) {
77+
mlsize_t bucket_size = Wosize_val(bucket);
78+
for (i = start; i < bucket_size; i++) {
7879
if (i > start) add_string(&buf, ", ");
7980
v = Field(bucket, i);
8081
if (Is_long(v)) {

ocaml/runtime/shared_heap.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -808,7 +808,8 @@ static void verify_object(struct heap_verify_state* st, value v) {
808808
if (Tag_val(v) == Closure_tag) {
809809
i = Start_env_closinfo(Closinfo_val(v));
810810
}
811-
for (; i < Wosize_val(v); i++) {
811+
mlsize_t size = Wosize_val(v);
812+
for (; i < size; i++) {
812813
value f = Field(v, i);
813814
if (Is_block(f)) verify_push(st, f, Op_val(v)+i);
814815
}

ocaml/runtime/weak.c

+2-1
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,8 @@ static void ephe_copy_and_darken(value from, value to)
304304

305305
/* Copy and darken scannable fields */
306306
caml_domain_state* domain_state = Caml_state;
307-
while (i < Wosize_val(to)) {
307+
mlsize_t to_size = Wosize_val(to);
308+
while (i < to_size) {
308309
value field = Field(from, i);
309310
caml_darken (domain_state, field, 0);
310311
Store_field(to, i, field);

0 commit comments

Comments
 (0)