@@ -824,17 +824,37 @@ ExecutionState &BlockLevelSearcher::selectState() {
824824 ->second .begin ());
825825}
826826
827+ void BlockLevelSearcher::clear (ExecutionState &state) {
828+ KFunction *kf = state.initPC ->parent ->parent ;
829+ BlockLevel &bl = stateToBlockLevel[&state];
830+ auto &sizeTo = data[kf];
831+ auto &sizesTo = sizeTo[bl.sizeOfLevel ];
832+ auto &levelTo = sizesTo[bl.sizesOfFrameLevels ];
833+ auto &multilevelTo = levelTo[bl.level ];
834+ auto &states = multilevelTo[bl.maxMultilevel ];
835+
836+ states.erase (&state);
837+ if (states.size () == 0 ) {
838+ multilevelTo.erase (bl.maxMultilevel );
839+ }
840+ if (multilevelTo.size () == 0 ) {
841+ levelTo.erase (bl.level );
842+ }
843+ if (levelTo.size () == 0 ) {
844+ sizesTo.erase (bl.sizesOfFrameLevels );
845+ }
846+ if (sizesTo.size () == 0 ) {
847+ sizeTo.erase (bl.sizeOfLevel );
848+ }
849+ }
850+
827851void BlockLevelSearcher::update (ExecutionState *current,
828852 const StateIterable &addedStates,
829853 const StateIterable &removedStates) {
830854 if (current && std::find (removedStates.begin (), removedStates.end (),
831855 current) == removedStates.end ()) {
832856 KFunction *kf = current->initPC ->parent ->parent ;
833- auto &sizesTo = data[kf];
834- auto &sizeTo = sizesTo[stateToSize[current]];
835- auto &levelTo = sizeTo[stateToSizes[current]];
836- auto &multilevelTo = levelTo[stateToLevel[current]];
837- auto &states = multilevelTo[stateToMultilevel[current]];
857+ BlockLevel &bl = stateToBlockLevel[current];
838858 sizes.clear ();
839859 unsigned long long maxMultilevel = 0u ;
840860 for (auto &infoFrame : current->stack .infoStack ()) {
@@ -844,36 +864,21 @@ void BlockLevelSearcher::update(ExecutionState *current,
844864 for (auto &kfLevel : current->stack .multilevel ) {
845865 maxMultilevel = std::max (maxMultilevel, kfLevel.second );
846866 }
847- if (sizes != stateToSizes[current] ||
848- current->level .size () != stateToLevel[current].size () ||
849- maxMultilevel != stateToMultilevel[current]) {
850- states.erase (current);
851- if (states.size () == 0 ) {
852- multilevelTo.erase (stateToMultilevel[current]);
853- }
854- if (multilevelTo.size () == 0 ) {
855- levelTo.erase (stateToLevel[current]);
856- }
857- if (levelTo.size () == 0 ) {
858- sizeTo.erase (stateToSizes[current]);
859- }
860- if (sizeTo.size () == 0 ) {
861- sizesTo.erase (stateToSize[current]);
862- }
867+ if (sizes != bl.sizesOfFrameLevels ||
868+ current->level .size () != bl.sizeOfLevel ||
869+ maxMultilevel != bl.maxMultilevel ) {
870+ clear (*current);
863871
864- sizesTo [current->level .size ()][sizes][current->level ][maxMultilevel]
872+ data[kf] [current->level .size ()][sizes][current->level ][maxMultilevel]
865873 .insert (current);
866874
867- stateToLevel[current] = current->level ;
868- stateToMultilevel[current] = maxMultilevel;
869- stateToSizes[current] = sizes;
870- stateToSize[current] = current->level .size ();
875+ stateToBlockLevel[current] = BlockLevel (kf, current->level .size (), sizes,
876+ current->level , maxMultilevel);
871877 }
872878 }
873879
874880 for (const auto state : addedStates) {
875881 KFunction *kf = state->initPC ->parent ->parent ;
876- auto &sizesTo = data[kf];
877882
878883 sizes.clear ();
879884 unsigned long long maxMultilevel = 0u ;
@@ -885,49 +890,21 @@ void BlockLevelSearcher::update(ExecutionState *current,
885890 maxMultilevel = std::max (maxMultilevel, kfLevel.second );
886891 }
887892
888- sizesTo [state->level .size ()][sizes][state->level ][maxMultilevel].insert (
893+ data[kf] [state->level .size ()][sizes][state->level ][maxMultilevel].insert (
889894 state);
890895
891- stateToLevel[state] = state->level ;
892- stateToMultilevel[state] = maxMultilevel;
893- stateToSize[state] = state->level .size ();
894- stateToSizes[state] = sizes;
896+ stateToBlockLevel[state] =
897+ BlockLevel (kf, state->level .size (), sizes, state->level , maxMultilevel);
895898 }
896899
897900 // remove states
898901 for (const auto state : removedStates) {
899- KFunction *kf = state->initPC ->parent ->parent ;
900- auto &sizesTo = data[kf];
901- auto &sizeTo = sizesTo[stateToSize[state]];
902- auto &levelTo = sizeTo[stateToSizes[state]];
903- auto &multilevelTo = levelTo[stateToLevel[state]];
904- auto &states = multilevelTo[stateToMultilevel[state]];
905-
906- states.erase (state);
907- if (states.size () == 0 ) {
908- multilevelTo.erase (stateToMultilevel[state]);
909- }
910- if (multilevelTo.size () == 0 ) {
911- levelTo.erase (stateToLevel[state]);
912- }
913- if (levelTo.size () == 0 ) {
914- sizeTo.erase (stateToSizes[state]);
915- }
916- if (sizeTo.size () == 0 ) {
917- sizesTo.erase (stateToSize[state]);
918- }
919- if (sizesTo.size () == 0 ) {
920- data.erase (kf);
921- }
922-
923- stateToLevel.erase (state);
924- stateToMultilevel.erase (state);
925- stateToSizes.erase (state);
926- stateToSize.erase (state);
902+ clear (*state);
903+ stateToBlockLevel.erase (state);
927904 }
928905}
929906
930- bool BlockLevelSearcher::empty () { return stateToLevel .empty (); }
907+ bool BlockLevelSearcher::empty () { return stateToBlockLevel .empty (); }
931908
932909void BlockLevelSearcher::printName (llvm::raw_ostream &os) {
933910 os << " BlockLevelSearcher\n " ;
0 commit comments