@@ -8,6 +8,7 @@ use rustc_ast::ast::Mutability;
8
8
use rustc_data_structures:: fx:: FxHashMap ;
9
9
use rustc_hir:: def:: DefKind ;
10
10
use rustc_hir:: HirId ;
11
+ use rustc_index:: bit_set:: BitSet ;
11
12
use rustc_index:: vec:: IndexVec ;
12
13
use rustc_middle:: mir:: interpret:: { InterpResult , Scalar } ;
13
14
use rustc_middle:: mir:: visit:: {
@@ -775,15 +776,15 @@ enum ConstPropMode {
775
776
struct CanConstProp {
776
777
can_const_prop : IndexVec < Local , ConstPropMode > ,
777
778
// false at the beginning, once set, there are not allowed to be any more assignments
778
- found_assignment : IndexVec < Local , bool > ,
779
+ found_assignment : BitSet < Local > ,
779
780
}
780
781
781
782
impl CanConstProp {
782
783
/// returns true if `local` can be propagated
783
784
fn check ( body : & Body < ' _ > ) -> IndexVec < Local , ConstPropMode > {
784
785
let mut cpv = CanConstProp {
785
786
can_const_prop : IndexVec :: from_elem ( ConstPropMode :: FullConstProp , & body. local_decls ) ,
786
- found_assignment : IndexVec :: from_elem ( false , & body. local_decls ) ,
787
+ found_assignment : BitSet :: new_empty ( body. local_decls . len ( ) ) ,
787
788
} ;
788
789
for ( local, val) in cpv. can_const_prop . iter_enumerated_mut ( ) {
789
790
// cannot use args at all
@@ -811,11 +812,9 @@ impl<'tcx> Visitor<'tcx> for CanConstProp {
811
812
// FIXME(oli-obk): we could be more powerful here, if the multiple writes
812
813
// only occur in independent execution paths
813
814
MutatingUse ( MutatingUseContext :: Store ) => {
814
- if self . found_assignment [ local] {
815
+ if ! self . found_assignment . insert ( local) {
815
816
trace ! ( "local {:?} can't be propagated because of multiple assignments" , local) ;
816
817
self . can_const_prop [ local] = ConstPropMode :: NoPropagation ;
817
- } else {
818
- self . found_assignment [ local] = true
819
818
}
820
819
}
821
820
// Reading constants is allowed an arbitrary number of times
0 commit comments