Skip to content

Commit 42e14d6

Browse files
committed
ircode: small optimization for nearby ssavalue
Since most ssavalue are used just after their def, this gives a small memory savings on compressed IR (a fraction of a percent).
1 parent 6a0de34 commit 42e14d6

File tree

1 file changed

+25
-3
lines changed

1 file changed

+25
-3
lines changed

src/ircode.c

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ extern "C" {
2121
#define TAG_DATATYPE 4
2222
#define TAG_SLOTNUMBER 5
2323
#define TAG_SVEC 6
24-
// #define TAG_UNUSED 7
24+
#define TAG_NEARBYSSAVALUE 7
2525
#define TAG_NULL 8
2626
#define TAG_EXPR 9
2727
#define TAG_PHINODE 10
@@ -82,6 +82,7 @@ extern "C" {
8282

8383
typedef struct {
8484
ios_t *s;
85+
size_t ssaid;
8586
// method we're compressing for
8687
jl_method_t *method;
8788
jl_svec_t *edges;
@@ -307,6 +308,10 @@ static void jl_encode_value_(jl_ircode_state *s, jl_value_t *v, int as_literal)
307308
jl_encode_value(s, jl_globalref_name(v));
308309
}
309310
}
311+
else if (jl_is_ssavalue(v) && s->ssaid - ((jl_ssavalue_t*)v)->id < 256) {
312+
write_uint8(s->s, TAG_NEARBYSSAVALUE);
313+
write_uint8(s->s, s->ssaid - ((jl_ssavalue_t*)v)->id);
314+
}
310315
else if (jl_is_ssavalue(v) && ((jl_ssavalue_t*)v)->id < 256 && ((jl_ssavalue_t*)v)->id >= 0) {
311316
write_uint8(s->s, TAG_SSAVALUE);
312317
write_uint8(s->s, ((jl_ssavalue_t*)v)->id);
@@ -807,6 +812,9 @@ static jl_value_t *jl_decode_value(jl_ircode_state *s)
807812
case TAG_SSAVALUE:
808813
v = jl_box_ssavalue(read_uint8(s->s));
809814
return v;
815+
case TAG_NEARBYSSAVALUE:
816+
v = jl_box_ssavalue(s->ssaid - read_uint8(s->s));
817+
return v;
810818
case TAG_LONG_SSAVALUE:
811819
v = jl_box_ssavalue(read_uint16(s->s));
812820
return v;
@@ -1014,6 +1022,7 @@ JL_DLLEXPORT jl_string_t *jl_compress_ir(jl_method_t *m, jl_code_info_t *code)
10141022
jl_value_t *edges = code->edges;
10151023
jl_ircode_state s = {
10161024
&dest,
1025+
0,
10171026
m,
10181027
(!isdef && jl_is_svec(edges)) ? (jl_svec_t*)edges : jl_emptysvec,
10191028
jl_current_task->ptls,
@@ -1043,7 +1052,13 @@ JL_DLLEXPORT jl_string_t *jl_compress_ir(jl_method_t *m, jl_code_info_t *code)
10431052
write_int32(s.s, (int32_t)nargs);
10441053
}
10451054

1046-
jl_encode_value_(&s, (jl_value_t*)code->code, 1);
1055+
size_t i, l = jl_array_dim0(code->code);
1056+
write_uint64(s.s, l);
1057+
for (i = 0; i < l; i++) {
1058+
s.ssaid = i;
1059+
jl_encode_value(&s, jl_array_ptr_ref(code->code, i));
1060+
}
1061+
s.ssaid = 0;
10471062
jl_encode_value_(&s, (jl_value_t*)code->ssavaluetypes, 1);
10481063
jl_encode_value_(&s, (jl_value_t*)code->ssaflags, 1);
10491064

@@ -1092,6 +1107,7 @@ JL_DLLEXPORT jl_code_info_t *jl_uncompress_ir(jl_method_t *m, jl_code_instance_t
10921107
src.size = jl_string_len(data);
10931108
jl_ircode_state s = {
10941109
&src,
1110+
0,
10951111
m,
10961112
metadata == NULL ? NULL : jl_atomic_load_relaxed(&metadata->edges),
10971113
jl_current_task->ptls,
@@ -1123,8 +1139,14 @@ JL_DLLEXPORT jl_code_info_t *jl_uncompress_ir(jl_method_t *m, jl_code_instance_t
11231139
code->nargs = read_int32(s.s);
11241140
}
11251141

1126-
code->code = (jl_array_t*)jl_decode_value(&s);
1142+
size_t i, n = read_uint64(s.s);
1143+
code->code = jl_alloc_array_1d(jl_array_any_type, n);
11271144
jl_gc_wb(code, code->code);
1145+
for (i = 0; i < n; i++) {
1146+
s.ssaid = i;
1147+
jl_array_ptr_set(code->code, i, jl_decode_value(&s));
1148+
}
1149+
s.ssaid = 0;
11281150
code->ssavaluetypes = jl_decode_value(&s);
11291151
jl_gc_wb(code, code->ssavaluetypes);
11301152
code->ssaflags = (jl_array_t*)jl_decode_value(&s);

0 commit comments

Comments
 (0)