29 llvm::ArrayRef<ValueT> as, llvm::ArrayRef<ValueT> bs, FnT doesMatch,
bool allowPartial =
true
32 llvm::SetVector<ValueT> setA {as.begin(), as.end()}, setB {bs.begin(), bs.end()};
33 llvm::DenseMap<size_t, llvm::SmallVector<size_t>> possibleMatchesA, possibleMatchesB;
35 for (
size_t i = 0, ea = as.size(), eb = bs.size(); i < ea; i++) {
36 for (
size_t j = 0; j < eb; j++) {
37 if (doesMatch(as[i], bs[j])) {
38 possibleMatchesA[i].push_back(j);
39 possibleMatchesB[j].push_back(i);
44 llvm::SetVector<std::pair<ValueT, ValueT>> matches;
45 for (
auto [a, b] : possibleMatchesA) {
46 if (b.size() == 1 && possibleMatchesB[b[0]].size() == 1) {
48 setB.remove(bs[b[0]]);
49 matches.insert({as[a], bs[b[0]]});
53 if ((!setA.empty() || !setB.empty()) && !allowPartial) {
54 return llvm::failure();