@@ -787,6 +787,7 @@ impl EncodeContext<'a, 'tcx> {
787
787
self . encode_generics ( def_id) ;
788
788
self . encode_explicit_predicates ( def_id) ;
789
789
self . encode_inferred_outlives ( def_id) ;
790
+ self . encode_mir_for_ctfe ( def_id. expect_local ( ) ) ;
790
791
self . encode_optimized_mir ( def_id. expect_local ( ) ) ;
791
792
self . encode_promoted_mir ( def_id. expect_local ( ) ) ;
792
793
}
@@ -895,6 +896,7 @@ impl EncodeContext<'a, 'tcx> {
895
896
self . encode_explicit_predicates ( def_id) ;
896
897
self . encode_inferred_outlives ( def_id) ;
897
898
self . encode_optimized_mir ( def_id. expect_local ( ) ) ;
899
+ self . encode_mir_for_ctfe ( def_id. expect_local ( ) ) ;
898
900
self . encode_promoted_mir ( def_id. expect_local ( ) ) ;
899
901
}
900
902
@@ -1015,7 +1017,13 @@ impl EncodeContext<'a, 'tcx> {
1015
1017
// This should be kept in sync with `PrefetchVisitor.visit_trait_item`.
1016
1018
match trait_item. kind {
1017
1019
ty:: AssocKind :: Type => { }
1018
- ty:: AssocKind :: Const | ty:: AssocKind :: Fn => {
1020
+ ty:: AssocKind :: Const => {
1021
+ if self . tcx . mir_keys ( LOCAL_CRATE ) . contains ( & def_id. expect_local ( ) ) {
1022
+ self . encode_mir_for_ctfe ( def_id. expect_local ( ) ) ;
1023
+ self . encode_promoted_mir ( def_id. expect_local ( ) ) ;
1024
+ }
1025
+ }
1026
+ ty:: AssocKind :: Fn => {
1019
1027
if self . tcx . mir_keys ( LOCAL_CRATE ) . contains ( & def_id. expect_local ( ) ) {
1020
1028
self . encode_optimized_mir ( def_id. expect_local ( ) ) ;
1021
1029
self . encode_promoted_mir ( def_id. expect_local ( ) ) ;
@@ -1094,23 +1102,28 @@ impl EncodeContext<'a, 'tcx> {
1094
1102
1095
1103
// The following part should be kept in sync with `PrefetchVisitor.visit_impl_item`.
1096
1104
1097
- let mir = match ast_item. kind {
1098
- hir:: ImplItemKind :: Const ( ..) => true ,
1105
+ let ( mir, mir_const ) = match ast_item. kind {
1106
+ hir:: ImplItemKind :: Const ( ..) => ( false , true ) ,
1099
1107
hir:: ImplItemKind :: Fn ( ref sig, _) => {
1100
1108
let generics = self . tcx . generics_of ( def_id) ;
1101
1109
let needs_inline = ( generics. requires_monomorphization ( self . tcx )
1102
1110
|| tcx. codegen_fn_attrs ( def_id) . requests_inline ( ) )
1103
1111
&& !self . metadata_output_only ( ) ;
1104
1112
let is_const_fn = sig. header . constness == hir:: Constness :: Const ;
1105
1113
let always_encode_mir = self . tcx . sess . opts . debugging_opts . always_encode_mir ;
1106
- needs_inline || is_const_fn || always_encode_mir
1114
+ ( needs_inline || always_encode_mir, is_const_fn )
1107
1115
}
1108
- hir:: ImplItemKind :: TyAlias ( ..) => false ,
1116
+ hir:: ImplItemKind :: TyAlias ( ..) => ( false , false ) ,
1109
1117
} ;
1110
1118
if mir {
1111
1119
self . encode_optimized_mir ( def_id. expect_local ( ) ) ;
1120
+ }
1121
+ if mir || mir_const {
1112
1122
self . encode_promoted_mir ( def_id. expect_local ( ) ) ;
1113
1123
}
1124
+ if mir_const {
1125
+ self . encode_mir_for_ctfe ( def_id. expect_local ( ) ) ;
1126
+ }
1114
1127
}
1115
1128
1116
1129
fn encode_fn_param_names_for_body ( & mut self , body_id : hir:: BodyId ) -> Lazy < [ Ident ] > {
@@ -1121,9 +1134,9 @@ impl EncodeContext<'a, 'tcx> {
1121
1134
self . lazy ( param_names. iter ( ) )
1122
1135
}
1123
1136
1124
- fn encode_optimized_mir ( & mut self , def_id : LocalDefId ) {
1125
- debug ! ( "EntryBuilder::encode_mir ({:?})" , def_id) ;
1126
- record ! ( self . tables. mir [ def_id. to_def_id( ) ] <- self . tcx. optimized_mir ( def_id) ) ;
1137
+ fn encode_mir_for_ctfe ( & mut self , def_id : LocalDefId ) {
1138
+ debug ! ( "EntryBuilder::encode_mir_for_ctfe ({:?})" , def_id) ;
1139
+ record ! ( self . tables. mir_for_ctfe [ def_id. to_def_id( ) ] <- self . tcx. mir_for_ctfe ( def_id) ) ;
1127
1140
1128
1141
let unused = self . tcx . unused_generic_params ( def_id) ;
1129
1142
if !unused. is_empty ( ) {
@@ -1136,6 +1149,16 @@ impl EncodeContext<'a, 'tcx> {
1136
1149
}
1137
1150
}
1138
1151
1152
+ fn encode_optimized_mir ( & mut self , def_id : LocalDefId ) {
1153
+ debug ! ( "EntryBuilder::encode_optimized_mir({:?})" , def_id) ;
1154
+ record ! ( self . tables. mir[ def_id. to_def_id( ) ] <- self . tcx. optimized_mir( def_id) ) ;
1155
+
1156
+ let unused = self . tcx . unused_generic_params ( def_id) ;
1157
+ if !unused. is_empty ( ) {
1158
+ record ! ( self . tables. unused_generic_params[ def_id. to_def_id( ) ] <- unused) ;
1159
+ }
1160
+ }
1161
+
1139
1162
fn encode_promoted_mir ( & mut self , def_id : LocalDefId ) {
1140
1163
debug ! ( "EncodeContext::encode_promoted_mir({:?})" , def_id) ;
1141
1164
record ! ( self . tables. promoted_mir[ def_id. to_def_id( ) ] <- self . tcx. promoted_mir( def_id) ) ;
@@ -1407,8 +1430,8 @@ impl EncodeContext<'a, 'tcx> {
1407
1430
1408
1431
// The following part should be kept in sync with `PrefetchVisitor.visit_item`.
1409
1432
1410
- let mir = match item. kind {
1411
- hir:: ItemKind :: Static ( ..) | hir:: ItemKind :: Const ( ..) => true ,
1433
+ let ( mir, const_mir ) = match item. kind {
1434
+ hir:: ItemKind :: Static ( ..) | hir:: ItemKind :: Const ( ..) => ( false , true ) ,
1412
1435
hir:: ItemKind :: Fn ( ref sig, ..) => {
1413
1436
let generics = tcx. generics_of ( def_id) ;
1414
1437
let needs_inline = ( generics. requires_monomorphization ( tcx)
@@ -1417,14 +1440,21 @@ impl EncodeContext<'a, 'tcx> {
1417
1440
1418
1441
let is_const_fn = sig. header . constness == hir:: Constness :: Const ;
1419
1442
let always_encode_mir = self . tcx . sess . opts . debugging_opts . always_encode_mir ;
1420
- needs_inline || is_const_fn || always_encode_mir
1443
+ let mir = needs_inline || always_encode_mir;
1444
+ // We don't need the optimized MIR for const fns.
1445
+ ( mir, is_const_fn)
1421
1446
}
1422
- _ => false ,
1447
+ _ => ( false , false ) ,
1423
1448
} ;
1424
1449
if mir {
1425
1450
self . encode_optimized_mir ( def_id. expect_local ( ) ) ;
1451
+ }
1452
+ if mir || const_mir {
1426
1453
self . encode_promoted_mir ( def_id. expect_local ( ) ) ;
1427
1454
}
1455
+ if const_mir {
1456
+ self . encode_mir_for_ctfe ( def_id. expect_local ( ) ) ;
1457
+ }
1428
1458
}
1429
1459
1430
1460
/// Serialize the text of exported macros
@@ -1489,7 +1519,7 @@ impl EncodeContext<'a, 'tcx> {
1489
1519
self . encode_generics ( def_id. to_def_id ( ) ) ;
1490
1520
self . encode_explicit_predicates ( def_id. to_def_id ( ) ) ;
1491
1521
self . encode_inferred_outlives ( def_id. to_def_id ( ) ) ;
1492
- self . encode_optimized_mir ( def_id) ;
1522
+ self . encode_mir_for_ctfe ( def_id) ;
1493
1523
self . encode_promoted_mir ( def_id) ;
1494
1524
}
1495
1525
@@ -1954,6 +1984,12 @@ struct PrefetchVisitor<'tcx> {
1954
1984
}
1955
1985
1956
1986
impl < ' tcx > PrefetchVisitor < ' tcx > {
1987
+ fn prefetch_ctfe_mir ( & self , def_id : LocalDefId ) {
1988
+ if self . mir_keys . contains ( & def_id) {
1989
+ self . tcx . ensure ( ) . mir_for_ctfe ( def_id) ;
1990
+ self . tcx . ensure ( ) . promoted_mir ( def_id) ;
1991
+ }
1992
+ }
1957
1993
fn prefetch_mir ( & self , def_id : LocalDefId ) {
1958
1994
if self . mir_keys . contains ( & def_id) {
1959
1995
self . tcx . ensure ( ) . optimized_mir ( def_id) ;
@@ -1968,42 +2004,57 @@ impl<'tcx, 'v> ParItemLikeVisitor<'v> for PrefetchVisitor<'tcx> {
1968
2004
let tcx = self . tcx ;
1969
2005
match item. kind {
1970
2006
hir:: ItemKind :: Static ( ..) | hir:: ItemKind :: Const ( ..) => {
1971
- self . prefetch_mir ( tcx. hir ( ) . local_def_id ( item. hir_id ) )
2007
+ self . prefetch_ctfe_mir ( tcx. hir ( ) . local_def_id ( item. hir_id ) )
1972
2008
}
1973
2009
hir:: ItemKind :: Fn ( ref sig, ..) => {
1974
2010
let def_id = tcx. hir ( ) . local_def_id ( item. hir_id ) ;
1975
2011
let generics = tcx. generics_of ( def_id. to_def_id ( ) ) ;
1976
2012
let needs_inline = generics. requires_monomorphization ( tcx)
1977
2013
|| tcx. codegen_fn_attrs ( def_id. to_def_id ( ) ) . requests_inline ( ) ;
1978
- if needs_inline || sig . header . constness == hir :: Constness :: Const {
2014
+ if needs_inline {
1979
2015
self . prefetch_mir ( def_id)
1980
2016
}
2017
+ if sig. header . constness == hir:: Constness :: Const {
2018
+ self . prefetch_ctfe_mir ( def_id) ;
2019
+ }
1981
2020
}
1982
2021
_ => ( ) ,
1983
2022
}
1984
2023
}
1985
2024
1986
2025
fn visit_trait_item ( & self , trait_item : & ' v hir:: TraitItem < ' v > ) {
1987
2026
// This should be kept in sync with `encode_info_for_trait_item`.
1988
- self . prefetch_mir ( self . tcx . hir ( ) . local_def_id ( trait_item. hir_id ) ) ;
2027
+ let def_id = self . tcx . hir ( ) . local_def_id ( trait_item. hir_id ) ;
2028
+ match trait_item. kind {
2029
+ hir:: TraitItemKind :: Type ( ..) => { }
2030
+ hir:: TraitItemKind :: Const ( ..) => {
2031
+ self . prefetch_ctfe_mir ( def_id) ;
2032
+ }
2033
+ hir:: TraitItemKind :: Fn ( ..) => {
2034
+ self . prefetch_mir ( def_id) ;
2035
+ }
2036
+ }
1989
2037
}
1990
2038
1991
2039
fn visit_impl_item ( & self , impl_item : & ' v hir:: ImplItem < ' v > ) {
1992
2040
// This should be kept in sync with `encode_info_for_impl_item`.
1993
2041
let tcx = self . tcx ;
1994
2042
match impl_item. kind {
1995
2043
hir:: ImplItemKind :: Const ( ..) => {
1996
- self . prefetch_mir ( tcx. hir ( ) . local_def_id ( impl_item. hir_id ) )
2044
+ self . prefetch_ctfe_mir ( tcx. hir ( ) . local_def_id ( impl_item. hir_id ) )
1997
2045
}
1998
2046
hir:: ImplItemKind :: Fn ( ref sig, _) => {
1999
2047
let def_id = tcx. hir ( ) . local_def_id ( impl_item. hir_id ) ;
2000
2048
let generics = tcx. generics_of ( def_id. to_def_id ( ) ) ;
2001
2049
let needs_inline = generics. requires_monomorphization ( tcx)
2002
2050
|| tcx. codegen_fn_attrs ( def_id. to_def_id ( ) ) . requests_inline ( ) ;
2003
2051
let is_const_fn = sig. header . constness == hir:: Constness :: Const ;
2004
- if needs_inline || is_const_fn {
2052
+ if needs_inline {
2005
2053
self . prefetch_mir ( def_id)
2006
2054
}
2055
+ if is_const_fn {
2056
+ self . prefetch_ctfe_mir ( def_id) ;
2057
+ }
2007
2058
}
2008
2059
hir:: ImplItemKind :: TyAlias ( ..) => ( ) ,
2009
2060
}
0 commit comments