| 697 | } |
| 698 | |
| 699 | expr State::getPath(BasicBlock &bb) const { |
| 700 | if (&f.getFirstBB() == &bb) |
| 701 | return true; |
| 702 | |
| 703 | auto I = predecessor_data.find(&bb); |
| 704 | if (I == predecessor_data.end()) |
| 705 | return false; // Block is unreachable |
| 706 | |
| 707 | OrExpr path; |
| 708 | for (auto &[src, data] : I->second) { |
| 709 | path.add(data.path); |
| 710 | } |
| 711 | return std::move(path)(); |
| 712 | } |
| 713 | |
| 714 | void State::cleanup(const Value &val) { |
| 715 | values.erase(&val); |