Changeset 4759


Ignore:
Timestamp:
Sep 3, 2015, 4:44:05 PM (4 years ago)
Author:
nmedfort
Message:

Temporary check-in

File:
1 edited

Legend:

Unmodified
Added
Removed
  • icGREP/icgrep-devel/icgrep/pablo/optimizers/booleanreassociationpass.cpp

    r4758 r4759  
    865865                    clear_out_edges(u, G);
    866866                    auto mi = membership.begin();
    867                     for (Vertex uu = u; ;) {
     867                    for (Vertex w = u; ;) {
    868868                        const unsigned m = *mi;
    869869                        for (auto v : adjacent) {
    870870                            if (component[v] == m) {
    871                                 add_edge(uu, v, G);
     871                                add_edge(w, v, G);
    872872                            }
    873873                        }
     
    875875                            break;
    876876                        }
    877                         uu = add_vertex(G[u], G);
     877                        w = add_vertex(G[u], G);
    878878                    }
    879879                }
     
    906906                        bool safe = true;
    907907                        for (PabloAST * user : G[v]->users()) {
    908                             if (user->getClassTypeId() != outerTypeId) {
     908                            if (user->getClassTypeId() != outerTypeId || !inCurrentBlock(cast<Statement>(user), block)) {
    909909                                safe = false;
    910910                                break;
     
    961961    }
    962962
    963     printGraph(block, H, G, "H0");
     963    // printGraph(block, H, G, "H0");
    964964
    965965    // By finding the maximal set of bicliques in H=(A,B) ∪ T in which the verticies in bipartition B are
    966966    // independent, we can identify a safe set of vertices to apply the distribution law to.
    967     VertexSets sources(std::move(computeSafeBicliqueSet(H)));
     967    VertexSets sourceSets(std::move(computeSafeBicliqueSet(H)));
    968968
    969969    // If no sources remain, no bicliques were found that would have a meaningful impact on the AST.
    970     if (LLVM_UNLIKELY(sources.size() == 0)) {
     970    if (LLVM_UNLIKELY(sourceSets.size() == 0)) {
    971971        return false;
    972972    }
    973973
    974     printGraph(block, H, G, "H1");
    975 
    976 
     974    // printGraph(block, H, G, "H1");
     975
     976    for (VertexSet & sources : sourceSets) {
     977        VertexSet intermediary;
     978        intermediary.reserve(out_degree(sources.front(), H));
     979        for (auto e : make_iterator_range(out_edges(sources.front(), H))) {
     980            const Vertex v = H[target(e, H)];
     981
     982
     983            intermediary.push_back(v);
     984        }
     985        VertexSet terminals;
     986        terminals.reserve(out_degree(intermediary.front(), H));
     987        for (auto e : make_iterator_range(out_edges(intermediary.front(), H))) {
     988            terminals.push_back(H[target(e, H)]);
     989        }
     990        const TypeId typeId = G[H[terminals.front()]]->getClassTypeId();
     991        assert (typeId == TypeId::And || typeId == TypeId::Or);
     992        circular_buffer<Vertex> Q(std::max(sources.size(), intermediary.size() + 1));
     993        for (const Vertex u : intermediary) {
     994            Q.push_back(G[H[u]]);
     995        }
     996        PabloAST * merged = createTree(block, typeId, Q);
     997        for (const Vertex u : sources) {
     998            Q.push_back(G[H[u]]);
     999        }
     1000        Q.push_back(merged);
     1001        PabloAST * masked = createTree(block, typeId == TypeId::Or ? TypeId::And : TypeId::Or, Q);
     1002
     1003
     1004
     1005
     1006
     1007        circular_buffer<Vertex> I(out_degree(S.front(), H));
     1008        for (auto e : make_iterator_range(out_edges(S.front(), H))) {
     1009            I.push_back(H[target(e, H)]);
     1010        }
     1011
     1012
     1013
     1014
     1015
     1016    }
    9771017
    9781018
Note: See TracChangeset for help on using the changeset viewer.