bool SymbolReaper::isLive(SymbolRef sym) { if (TheLiving.count(sym)) { markDependentsLive(sym); return true; } bool KnownLive; switch (sym->getKind()) { case SymExpr::RegionValueKind: // FIXME: We should be able to use isLiveRegion here (this behavior // predates isLiveRegion), but doing so causes test failures. Investigate. KnownLive = true; break; case SymExpr::ConjuredKind: KnownLive = false; break; case SymExpr::DerivedKind: KnownLive = isLive(cast<SymbolDerived>(sym)->getParentSymbol()); break; case SymExpr::ExtentKind: KnownLive = isLiveRegion(cast<SymbolExtent>(sym)->getRegion()); break; case SymExpr::MetadataKind: KnownLive = MetadataInUse.count(sym) && isLiveRegion(cast<SymbolMetadata>(sym)->getRegion()); if (KnownLive) MetadataInUse.erase(sym); break; case SymExpr::SymIntKind: KnownLive = isLive(cast<SymIntExpr>(sym)->getLHS()); break; case SymExpr::IntSymKind: KnownLive = isLive(cast<IntSymExpr>(sym)->getRHS()); break; case SymExpr::SymSymKind: KnownLive = isLive(cast<SymSymExpr>(sym)->getLHS()) && isLive(cast<SymSymExpr>(sym)->getRHS()); break; case SymExpr::CastSymbolKind: KnownLive = isLive(cast<SymbolCast>(sym)->getOperand()); break; } if (KnownLive) markLive(sym); return KnownLive; }
bool SymbolReaper::isLive(SymbolRef sym) { if (TheLiving.count(sym)) { markDependentsLive(sym); return true; } bool KnownLive; switch (sym->getKind()) { case SymExpr::RegionValueKind: KnownLive = isLiveRegion(cast<SymbolRegionValue>(sym)->getRegion()); break; case SymExpr::ConjuredKind: KnownLive = false; break; case SymExpr::DerivedKind: KnownLive = isLive(cast<SymbolDerived>(sym)->getParentSymbol()); break; case SymExpr::ExtentKind: KnownLive = isLiveRegion(cast<SymbolExtent>(sym)->getRegion()); break; case SymExpr::MetadataKind: KnownLive = MetadataInUse.count(sym) && isLiveRegion(cast<SymbolMetadata>(sym)->getRegion()); if (KnownLive) MetadataInUse.erase(sym); break; case SymExpr::SymIntKind: KnownLive = isLive(cast<SymIntExpr>(sym)->getLHS()); break; case SymExpr::IntSymKind: KnownLive = isLive(cast<IntSymExpr>(sym)->getRHS()); break; case SymExpr::SymSymKind: KnownLive = isLive(cast<SymSymExpr>(sym)->getLHS()) && isLive(cast<SymSymExpr>(sym)->getRHS()); break; case SymExpr::CastSymbolKind: KnownLive = isLive(cast<SymbolCast>(sym)->getOperand()); break; } if (KnownLive) markLive(sym); return KnownLive; }