| 1000 | } |
| 1001 | |
| 1002 | void LoopDescriptor::RemoveLoop(Loop* loop) { |
| 1003 | Loop* parent = loop->GetParent() ? loop->GetParent() : &placeholder_top_loop_; |
| 1004 | parent->nested_loops_.erase(std::find(parent->nested_loops_.begin(), |
| 1005 | parent->nested_loops_.end(), loop)); |
| 1006 | std::for_each( |
| 1007 | loop->nested_loops_.begin(), loop->nested_loops_.end(), |
| 1008 | [loop](Loop* sub_loop) { sub_loop->SetParent(loop->GetParent()); }); |
| 1009 | parent->nested_loops_.insert(parent->nested_loops_.end(), |
| 1010 | loop->nested_loops_.begin(), |
| 1011 | loop->nested_loops_.end()); |
| 1012 | for (uint32_t bb_id : loop->GetBlocks()) { |
| 1013 | Loop* l = FindLoopForBasicBlock(bb_id); |
| 1014 | if (l == loop) { |
| 1015 | SetBasicBlockToLoop(bb_id, l->GetParent()); |
| 1016 | } else { |
| 1017 | ForgetBasicBlock(bb_id); |
| 1018 | } |
| 1019 | } |
| 1020 | |
| 1021 | LoopContainerType::iterator it = |
| 1022 | std::find(loops_.begin(), loops_.end(), loop); |
| 1023 | assert(it != loops_.end()); |
| 1024 | delete loop; |
| 1025 | loops_.erase(it); |
| 1026 | } |
| 1027 | |
| 1028 | } // namespace opt |
| 1029 | } // namespace spvtools |