Bug fixes
authorBrian Demsky <bdemsky@uci.edu>
Fri, 5 Jan 2018 21:00:12 +0000 (13:00 -0800)
committerBrian Demsky <bdemsky@uci.edu>
Fri, 5 Jan 2018 21:00:12 +0000 (13:00 -0800)
src/ASTTransform/decomposeordertransform.cc
src/Translator/decomposeorderresolver.cc
src/Translator/decomposeorderresolver.h

index c75fbecd3cdedd5213d9525f0d525d051d03b83f..7dad1d73477c5dbe91b60e97203ba318efa87665 100644 (file)
@@ -153,7 +153,6 @@ void DecomposeOrderTransform::decomposeOrder(Order *currOrder, OrderGraph *currG
                        }
                        BooleanEdge neworderconstraint = solver->orderConstraint(neworder, orderconstraint->first, orderconstraint->second);
                        solver->replaceBooleanWithBoolean(orderconstraint, neworderconstraint);
-
                        dor->setEdgeOrder(from->getID(), to->getID(), from->sccNum);
                }
        }
index a9c062f3169f52181a69ca830ab7cfaf1955a1aa..0dbaf8d1881861b03003bde07be16d15963e0834 100644 (file)
@@ -25,8 +25,12 @@ DecomposeOrderResolver::~DecomposeOrderResolver() {
 
 void DecomposeOrderResolver::mustOrderEdge(uint64_t first, uint64_t second) {
        DOREdge edge(first, second, 0, first, second);
-       if (!edges.contains(&edge)) {
+       DOREdge *oldedge=edges.get(&edge);
+       if (oldedge != NULL) {
+               oldedge->mustbetrue=true;
+       } else {
                DOREdge *newedge = new DOREdge(first, second, 0, first, second);
+               newedge->mustbetrue=true;
                edges.add(newedge);
        }
 }
@@ -54,6 +58,12 @@ void DecomposeOrderResolver::setEdgeOrder(uint64_t first, uint64_t second, uint
                DOREdge *newedge = new DOREdge(first, second, sccNum, first, second);
                edges.add(newedge);
        }
+       /* Also fix up reverse edge if it exists */
+       DOREdge revedge(second, first, 0, second, first);
+       oldedge = edges.get(&revedge);
+       if (oldedge != NULL) {
+               oldedge->orderindex = sccNum;
+       }
 }
 
 void DecomposeOrderResolver::setOrder(uint sccNum, Order *neworder) {
@@ -72,9 +82,12 @@ void DecomposeOrderResolver::buildGraph() {
        SetIteratorDOREdge *iterator = edges.iterator();
        while (iterator->hasNext()) {
                DOREdge *doredge = iterator->next();
-               if (doredge->orderindex == 0) {
+               if (doredge->mustbetrue) {
                        graph->addEdge(doredge->origfirst, doredge->origsecond);
-               } else {
+                       if (doredge->newfirst != doredge->origfirst || doredge->newsecond!=doredge->origsecond) {
+                               graph->addEdge(doredge->newfirst, doredge->newsecond);
+                       }
+               } else if (doredge->orderindex != 0) {
                        Order *suborder = orders.get(doredge->orderindex);
                        bool isEdge = suborder->encoding.resolver->resolveOrder(doredge->newfirst, doredge->newsecond);
                        if (isEdge)
index a2603096d036efbc2aaf38ae110c0d3cbacc6dcf..507554747f544520688a7595db707eef58826807 100644 (file)
@@ -20,13 +20,15 @@ public:
                origsecond(_origsecond),
                orderindex(_orderindex),
                newfirst(_newfirst),
-               newsecond(_newsecond) {
+               newsecond(_newsecond),
+               mustbetrue(false) {
        }
        uint64_t origfirst;
        uint64_t origsecond;
        uint orderindex;
        uint64_t newfirst;
        uint64_t newsecond;
+       bool mustbetrue;
        CMEMALLOC;
 };