@@ -21,7 +21,7 @@ extern "C" {
21
21
#define TAG_DATATYPE 4
22
22
#define TAG_SLOTNUMBER 5
23
23
#define TAG_SVEC 6
24
- // #define TAG_UNUSED 7
24
+ #define TAG_NEARBYSSAVALUE 7
25
25
#define TAG_NULL 8
26
26
#define TAG_EXPR 9
27
27
#define TAG_PHINODE 10
@@ -82,6 +82,7 @@ extern "C" {
82
82
83
83
typedef struct {
84
84
ios_t * s ;
85
+ size_t ssaid ;
85
86
// method we're compressing for
86
87
jl_method_t * method ;
87
88
jl_svec_t * edges ;
@@ -307,6 +308,10 @@ static void jl_encode_value_(jl_ircode_state *s, jl_value_t *v, int as_literal)
307
308
jl_encode_value (s , jl_globalref_name (v ));
308
309
}
309
310
}
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
+ }
310
315
else if (jl_is_ssavalue (v ) && ((jl_ssavalue_t * )v )-> id < 256 && ((jl_ssavalue_t * )v )-> id >= 0 ) {
311
316
write_uint8 (s -> s , TAG_SSAVALUE );
312
317
write_uint8 (s -> s , ((jl_ssavalue_t * )v )-> id );
@@ -807,6 +812,9 @@ static jl_value_t *jl_decode_value(jl_ircode_state *s)
807
812
case TAG_SSAVALUE :
808
813
v = jl_box_ssavalue (read_uint8 (s -> s ));
809
814
return v ;
815
+ case TAG_NEARBYSSAVALUE :
816
+ v = jl_box_ssavalue (s -> ssaid - read_uint8 (s -> s ));
817
+ return v ;
810
818
case TAG_LONG_SSAVALUE :
811
819
v = jl_box_ssavalue (read_uint16 (s -> s ));
812
820
return v ;
@@ -1014,6 +1022,7 @@ JL_DLLEXPORT jl_string_t *jl_compress_ir(jl_method_t *m, jl_code_info_t *code)
1014
1022
jl_value_t * edges = code -> edges ;
1015
1023
jl_ircode_state s = {
1016
1024
& dest ,
1025
+ 0 ,
1017
1026
m ,
1018
1027
(!isdef && jl_is_svec (edges )) ? (jl_svec_t * )edges : jl_emptysvec ,
1019
1028
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)
1043
1052
write_int32 (s .s , (int32_t )nargs );
1044
1053
}
1045
1054
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 ;
1047
1062
jl_encode_value_ (& s , (jl_value_t * )code -> ssavaluetypes , 1 );
1048
1063
jl_encode_value_ (& s , (jl_value_t * )code -> ssaflags , 1 );
1049
1064
@@ -1092,6 +1107,7 @@ JL_DLLEXPORT jl_code_info_t *jl_uncompress_ir(jl_method_t *m, jl_code_instance_t
1092
1107
src .size = jl_string_len (data );
1093
1108
jl_ircode_state s = {
1094
1109
& src ,
1110
+ 0 ,
1095
1111
m ,
1096
1112
metadata == NULL ? NULL : jl_atomic_load_relaxed (& metadata -> edges ),
1097
1113
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
1123
1139
code -> nargs = read_int32 (s .s );
1124
1140
}
1125
1141
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 );
1127
1144
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 ;
1128
1150
code -> ssavaluetypes = jl_decode_value (& s );
1129
1151
jl_gc_wb (code , code -> ssavaluetypes );
1130
1152
code -> ssaflags = (jl_array_t * )jl_decode_value (& s );
0 commit comments