@@ -98,8 +98,8 @@ struct Collector<'a, 'tcx> {
98
98
}
99
99
100
100
impl < ' tcx > Visitor < ' tcx > for Collector < ' _ , ' tcx > {
101
+ #[ instrument( level = "debug" , skip( self ) ) ]
101
102
fn visit_local ( & mut self , index : Local , context : PlaceContext , location : Location ) {
102
- debug ! ( "visit_local: index={:?} context={:?} location={:?}" , index, context, location) ;
103
103
// We're only interested in temporaries and the return place
104
104
match self . ccx . body . local_kind ( index) {
105
105
LocalKind :: Arg => return ,
@@ -111,20 +111,15 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> {
111
111
// then it's constant and thus drop is noop.
112
112
// Non-uses are also irrelevant.
113
113
if context. is_drop ( ) || !context. is_use ( ) {
114
- debug ! (
115
- "visit_local: context.is_drop={:?} context.is_use={:?}" ,
116
- context. is_drop( ) ,
117
- context. is_use( ) ,
118
- ) ;
114
+ debug ! ( is_drop = context. is_drop( ) , is_use = context. is_use( ) ) ;
119
115
return ;
120
116
}
121
117
122
118
let temp = & mut self . temps [ index] ;
123
- debug ! ( "visit_local: temp={:?}" , temp) ;
119
+ debug ! ( ? temp) ;
124
120
* temp = match * temp {
125
121
TempState :: Undefined => match context {
126
- PlaceContext :: MutatingUse ( MutatingUseContext :: Store )
127
- | PlaceContext :: MutatingUse ( MutatingUseContext :: Call ) => {
122
+ PlaceContext :: MutatingUse ( MutatingUseContext :: Store | MutatingUseContext :: Call ) => {
128
123
TempState :: Defined { location, uses : 0 , valid : Err ( ( ) ) }
129
124
}
130
125
_ => TempState :: Unpromotable ,
@@ -137,7 +132,7 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> {
137
132
| PlaceContext :: NonMutatingUse ( _) => true ,
138
133
PlaceContext :: MutatingUse ( _) | PlaceContext :: NonUse ( _) => false ,
139
134
} ;
140
- debug ! ( "visit_local: allowed_use={:?}" , allowed_use) ;
135
+ debug ! ( ? allowed_use) ;
141
136
if allowed_use {
142
137
* uses += 1 ;
143
138
return ;
@@ -146,6 +141,7 @@ impl<'tcx> Visitor<'tcx> for Collector<'_, 'tcx> {
146
141
}
147
142
TempState :: Unpromotable | TempState :: PromotedOut => TempState :: Unpromotable ,
148
143
} ;
144
+ debug ! ( ?temp) ;
149
145
}
150
146
151
147
fn visit_rvalue ( & mut self , rvalue : & Rvalue < ' tcx > , location : Location ) {
@@ -972,7 +968,12 @@ fn promote_candidates<'tcx>(
972
968
candidates : Vec < Candidate > ,
973
969
) -> IndexVec < Promoted , Body < ' tcx > > {
974
970
// Visit candidates in reverse, in case they're nested.
975
- debug ! ( "promote_candidates({:?})" , candidates) ;
971
+ debug ! ( promote_candidates = ?candidates) ;
972
+
973
+ // eagerly fail fast
974
+ if candidates. is_empty ( ) {
975
+ return IndexVec :: new ( ) ;
976
+ }
976
977
977
978
let mut promotions = IndexVec :: new ( ) ;
978
979
0 commit comments