@@ -549,7 +549,8 @@ static void jl_encode_value_(jl_ircode_state *s, jl_value_t *v, int as_literal)
549
549
550
550
static jl_code_info_flags_t code_info_flags (uint8_t propagate_inbounds , uint8_t has_fcall ,
551
551
uint8_t nospecializeinfer , uint8_t isva ,
552
- uint8_t inlining , uint8_t constprop , uint8_t nargsmatchesmethod )
552
+ uint8_t inlining , uint8_t constprop , uint8_t nargsmatchesmethod ,
553
+ jl_array_t * ssaflags )
553
554
{
554
555
jl_code_info_flags_t flags ;
555
556
flags .bits .propagate_inbounds = propagate_inbounds ;
@@ -559,6 +560,11 @@ static jl_code_info_flags_t code_info_flags(uint8_t propagate_inbounds, uint8_t
559
560
flags .bits .inlining = inlining ;
560
561
flags .bits .constprop = constprop ;
561
562
flags .bits .nargsmatchesmethod = nargsmatchesmethod ;
563
+ flags .bits .has_ssaflags = 0 ;
564
+ const uint32_t * ssaflag_data = jl_array_data (ssaflags , uint32_t );
565
+ for (size_t i = 0 , l = jl_array_dim0 (ssaflags ); i < l ; i ++ )
566
+ if (ssaflag_data [i ])
567
+ flags .bits .has_ssaflags = 1 ;
562
568
return flags ;
563
569
}
564
570
@@ -1033,7 +1039,8 @@ JL_DLLEXPORT jl_string_t *jl_compress_ir(jl_method_t *m, jl_code_info_t *code)
1033
1039
jl_code_info_flags_t flags = code_info_flags (code -> propagate_inbounds , code -> has_fcall ,
1034
1040
code -> nospecializeinfer , code -> isva ,
1035
1041
code -> inlining , code -> constprop ,
1036
- nargsmatchesmethod );
1042
+ nargsmatchesmethod ,
1043
+ code -> ssaflags );
1037
1044
write_uint16 (s .s , checked_size (flags .packed , IR_DATASIZE_FLAGS ));
1038
1045
write_uint16 (s .s , checked_size (code -> purity .bits , IR_DATASIZE_PURITY ));
1039
1046
write_uint16 (s .s , checked_size (code -> inlining_cost , IR_DATASIZE_INLINING_COST ));
@@ -1060,7 +1067,11 @@ JL_DLLEXPORT jl_string_t *jl_compress_ir(jl_method_t *m, jl_code_info_t *code)
1060
1067
}
1061
1068
s .ssaid = 0 ;
1062
1069
jl_encode_value_ (& s , (jl_value_t * )code -> ssavaluetypes , 1 );
1063
- jl_encode_value_ (& s , (jl_value_t * )code -> ssaflags , 1 );
1070
+ assert (jl_typetagis (code -> ssaflags , jl_array_uint32_type ));
1071
+ assert (jl_array_dim0 (code -> ssaflags ) == l );
1072
+ const uint32_t * ssaflags_data = jl_array_data (code -> ssaflags , uint32_t );
1073
+ if (flags .bits .has_ssaflags )
1074
+ ios_write (s .s , (const char * )ssaflags_data , l * sizeof (* ssaflags_data ));
1064
1075
1065
1076
// For opaque closure, also save the slottypes. We technically only need the first slot type,
1066
1077
// but this is simpler for now. We may want to refactor where this gets stored in the future.
@@ -1139,18 +1150,23 @@ JL_DLLEXPORT jl_code_info_t *jl_uncompress_ir(jl_method_t *m, jl_code_instance_t
1139
1150
code -> nargs = read_int32 (s .s );
1140
1151
}
1141
1152
1142
- size_t i , n = read_uint64 (s .s );
1143
- code -> code = jl_alloc_array_1d (jl_array_any_type , n );
1153
+ size_t i , l = read_uint64 (s .s );
1154
+ code -> code = jl_alloc_array_1d (jl_array_any_type , l );
1144
1155
jl_gc_wb (code , code -> code );
1145
- for (i = 0 ; i < n ; i ++ ) {
1156
+ for (i = 0 ; i < l ; i ++ ) {
1146
1157
s .ssaid = i ;
1147
1158
jl_array_ptr_set (code -> code , i , jl_decode_value (& s ));
1148
1159
}
1149
1160
s .ssaid = 0 ;
1150
1161
code -> ssavaluetypes = jl_decode_value (& s );
1151
1162
jl_gc_wb (code , code -> ssavaluetypes );
1152
- code -> ssaflags = ( jl_array_t * ) jl_decode_value ( & s );
1163
+ code -> ssaflags = jl_alloc_array_1d ( jl_array_uint32_type , l );
1153
1164
jl_gc_wb (code , code -> ssaflags );
1165
+ uint32_t * ssaflags_data = jl_array_data (code -> ssaflags , uint32_t );
1166
+ if (flags .bits .has_ssaflags )
1167
+ ios_readall (s .s , (char * )ssaflags_data , l * sizeof (* ssaflags_data ));
1168
+ else
1169
+ memset (ssaflags_data , 0 , l * sizeof (* ssaflags_data ));
1154
1170
1155
1171
if (m -> is_for_opaque_closure ) {
1156
1172
code -> slottypes = jl_decode_value (& s );
0 commit comments