CodeNodePtr findMultiplyReferenced( CodeNodePtr node, const ReferenceMap& refs ) { assert(node); ReferenceMap::const_iterator it = refs.find(node); if (REN_DYNAMIC_CAST_PTR(p, CallCodeNode, node)) { if (it != refs.end() && it->second.size() > 1) { return p; } } else if (REN_DYNAMIC_CAST_PTR(p, IfCodeNode, node)) { if (it != refs.end() && it->second.size() > 1) { return p; } } else if (REN_DYNAMIC_CAST_PTR(p, NameCodeNode, node)) { // Do nothing. } else { assert(!"Unknown code node type"); } CodeNodeList args = node->getChildren(); for (size_t i = 0; i < args.size(); ++i) { CodeNodePtr c = findMultiplyReferenced(args[i], refs); if (c) { return c; } } return CodeNodePtr(); }
void HexagonExpandCondsets::addRefToMap(RegisterRef RR, ReferenceMap &Map, unsigned Exec) { unsigned Mask = getMaskForSub(RR.Sub) | Exec; ReferenceMap::iterator F = Map.find(RR.Reg); if (F == Map.end()) Map.insert(std::make_pair(RR.Reg, Mask)); else F->second |= Mask; }
bool HexagonExpandCondsets::isRefInMap(RegisterRef RR, ReferenceMap &Map, unsigned Exec) { ReferenceMap::iterator F = Map.find(RR.Reg); if (F == Map.end()) return false; unsigned Mask = getMaskForSub(RR.Sub) | Exec; if (Mask & F->second) return true; return false; }