@@ -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
8383typedef 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