Search in sources :

Example 76 with Event

use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.

the class LoopUnrolling method unrollThread.

private void unrollThread(Thread thread, int defaultBound) {
    Event cur = thread.getEntry();
    while (cur != null) {
        Event next = cur.getSuccessor();
        if (cur instanceof CondJump && ((CondJump) cur).getLabel().getOId() < cur.getOId()) {
            CondJump jump = (CondJump) cur;
            if (jump.getLabel().getJumpSet().stream().allMatch(x -> x.getOId() <= jump.getOId())) {
                // TODO: Get different bounds for different loops (e.g. via annotations)
                int bound = jump.is(Tag.SPINLOOP) ? 1 : defaultBound;
                unrollLoop((CondJump) cur, bound);
            }
        }
        cur = next;
    }
}
Also used : Event(com.dat3m.dartagnan.program.event.core.Event) CondJump(com.dat3m.dartagnan.program.event.core.CondJump)

Example 77 with Event

use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.

the class LoopUnrolling method unrollLoop.

private void unrollLoop(CondJump loopBackJump, int bound) {
    Label loopBegin = loopBackJump.getLabel();
    Preconditions.checkArgument(bound >= 1, "Positive unrolling bound expected.");
    Preconditions.checkArgument(loopBegin.getOId() < loopBackJump.getOId(), "The jump does not belong to a loop.");
    Preconditions.checkArgument(loopBackJump.getUId() < 0, "The loop has already been unrolled");
    // (1) Collect continue points of the loop
    List<CondJump> continues = new ArrayList<>();
    for (Event e = loopBegin; e != null && e != loopBackJump; e = e.getSuccessor()) {
        if (e instanceof CondJump && ((CondJump) e).getLabel() == loopBegin) {
            continues.add((CondJump) e);
        }
    }
    continues.add(loopBackJump);
    // (2) Collect forward jumps from the outside into the loop
    List<CondJump> enterJumps = new ArrayList<>();
    for (Event e = loopBegin; e != null && e != loopBackJump; e = e.getSuccessor()) {
        if (e instanceof Label) {
            Label label = (Label) e;
            label.getJumpSet().stream().filter(j -> j.getOId() < loopBegin.getOId()).forEach(enterJumps::add);
        }
    }
    int iterCounter = 0;
    while (--bound >= 0) {
        iterCounter++;
        if (bound == 0) {
            Label exit = (Label) loopBackJump.getThread().getExit();
            loopBegin.setName(loopBegin.getName() + "_" + iterCounter);
            for (CondJump cont : continues) {
                if (!cont.isGoto()) {
                    logger.warn("Conditional jump {} was replaced by unconditional bound event", cont);
                }
                CondJump boundEvent = EventFactory.newGoto(exit);
                // Keep tags of original jump.
                boundEvent.addFilters(cont.getFilters());
                boundEvent.addFilters(Tag.BOUND, Tag.NOOPT);
                cont.getPredecessor().setSuccessor(boundEvent);
                boundEvent.setSuccessor(cont.getSuccessor());
                cont.delete();
            }
        } else {
            Map<Event, Event> copyCtx = new HashMap<>();
            List<Event> copies = copyPath(loopBegin, loopBackJump, copyCtx);
            ((Label) copyCtx.get(loopBegin)).setName(loopBegin.getName() + "_" + iterCounter);
            // Insert copies at right place
            loopBegin.getPredecessor().setSuccessor(copies.get(0));
            copies.get(copies.size() - 1).setSuccessor(loopBegin);
            // Update entering jumps to go to the copies.
            for (CondJump enterJump : enterJumps) {
                enterJump.updateReferences(copyCtx);
            }
            enterJumps.clear();
            // All "continues" that were copied need to get updated to jump forward to the next iteration.
            for (CondJump cont : continues) {
                if (cont == loopBackJump) {
                    continue;
                }
                CondJump copy = (CondJump) copyCtx.get(cont);
                copy.updateReferences(Map.of(copy.getLabel(), loopBegin));
                enterJumps.add(cont);
            }
        }
    }
}
Also used : Printer(com.dat3m.dartagnan.utils.printer.Printer) PRINT_PROGRAM_AFTER_UNROLLING(com.dat3m.dartagnan.configuration.OptionNames.PRINT_PROGRAM_AFTER_UNROLLING) HashMap(java.util.HashMap) Thread(com.dat3m.dartagnan.program.Thread) Label(com.dat3m.dartagnan.program.event.core.Label) org.sosy_lab.common.configuration(org.sosy_lab.common.configuration) ArrayList(java.util.ArrayList) Tag(com.dat3m.dartagnan.program.event.Tag) EventFactory(com.dat3m.dartagnan.program.event.EventFactory) List(java.util.List) Logger(org.apache.logging.log4j.Logger) Map(java.util.Map) Program(com.dat3m.dartagnan.program.Program) Event(com.dat3m.dartagnan.program.event.core.Event) Preconditions(com.google.common.base.Preconditions) BOUND(com.dat3m.dartagnan.configuration.OptionNames.BOUND) CondJump(com.dat3m.dartagnan.program.event.core.CondJump) LogManager(org.apache.logging.log4j.LogManager) HashMap(java.util.HashMap) Label(com.dat3m.dartagnan.program.event.core.Label) ArrayList(java.util.ArrayList) Event(com.dat3m.dartagnan.program.event.core.Event) CondJump(com.dat3m.dartagnan.program.event.core.CondJump)

Example 78 with Event

use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.

the class LoopUnrolling method unrollThreadAndUpdate.

private int unrollThreadAndUpdate(Thread t, int bound, int nextId) {
    unrollThread(t, bound);
    t.clearCache();
    for (Event e : t.getEvents()) {
        e.setUId(nextId++);
    }
    return nextId;
}
Also used : Event(com.dat3m.dartagnan.program.event.core.Event)

Example 79 with Event

use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.

the class RemoveDeadCondJumps method eliminateDeadCondJumps.

private void eliminateDeadCondJumps(Thread thread) {
    Map<Event, List<Event>> immediateLabelPredecessors = new HashMap<>();
    List<Event> removed = new ArrayList<>();
    Event pred = thread.getEntry();
    Event current = pred.getSuccessor();
    // We fill the map of predecessors
    while (current != null) {
        if (current instanceof CondJump) {
            CondJump jump = (CondJump) current;
            // After constant propagation some jumps have False as condition and are dead
            if (jump.isDead()) {
                removed.add(jump);
            } else {
                immediateLabelPredecessors.computeIfAbsent(jump.getLabel(), key -> new ArrayList<>()).add(jump);
            }
        } else if (current instanceof Label && !(pred instanceof CondJump && ((CondJump) pred).isGoto())) {
            immediateLabelPredecessors.computeIfAbsent(current, key -> new ArrayList<>()).add(pred);
        }
        pred = current;
        current = current.getSuccessor();
    }
    // We check which ifs can be removed
    for (Event label : immediateLabelPredecessors.keySet()) {
        Event next = label.getSuccessor();
        List<Event> preds = immediateLabelPredecessors.get(label);
        // BOUND events
        if (next instanceof CondJump && preds.stream().allMatch(e -> mutuallyExclusiveIfs((CondJump) next, e))) {
            removed.add(next);
        }
        // SPINLOOP events
        if (next != null && preds.size() == 1 && preds.get(0).getSuccessor().equals(label)) {
            removed.add(label);
        }
    }
    // Here is the actual removal
    pred = null;
    Event cur = thread.getEntry();
    boolean dead = false;
    while (cur != null) {
        if (dead && cur instanceof Label && !immediateLabelPredecessors.getOrDefault(cur, List.of()).isEmpty()) {
            dead = false;
        }
        if (dead && cur instanceof CondJump && immediateLabelPredecessors.containsKey(((CondJump) cur).getLabel())) {
            immediateLabelPredecessors.get(((CondJump) cur).getLabel()).remove(cur);
        }
        if (dead && immediateLabelPredecessors.containsKey(cur.getSuccessor())) {
            immediateLabelPredecessors.get(cur.getSuccessor()).remove(cur);
        }
        if ((dead || removed.contains(cur)) && !cur.is(Tag.NOOPT)) {
            cur.delete();
            cur = pred;
        }
        if (cur instanceof CondJump && ((CondJump) cur).isGoto()) {
            dead = true;
        }
        pred = cur;
        cur = cur.getSuccessor();
    }
}
Also used : Atom(com.dat3m.dartagnan.expression.Atom) Configuration(org.sosy_lab.common.configuration.Configuration) HashMap(java.util.HashMap) Thread(com.dat3m.dartagnan.program.Thread) Label(com.dat3m.dartagnan.program.event.core.Label) ArrayList(java.util.ArrayList) Tag(com.dat3m.dartagnan.program.event.Tag) List(java.util.List) Logger(org.apache.logging.log4j.Logger) BExprUn(com.dat3m.dartagnan.expression.BExprUn) Map(java.util.Map) Program(com.dat3m.dartagnan.program.Program) Event(com.dat3m.dartagnan.program.event.core.Event) Preconditions(com.google.common.base.Preconditions) CondJump(com.dat3m.dartagnan.program.event.core.CondJump) LogManager(org.apache.logging.log4j.LogManager) InvalidConfigurationException(org.sosy_lab.common.configuration.InvalidConfigurationException) HashMap(java.util.HashMap) ArrayList(java.util.ArrayList) Label(com.dat3m.dartagnan.program.event.core.Label) Event(com.dat3m.dartagnan.program.event.core.Event) ArrayList(java.util.ArrayList) List(java.util.List) CondJump(com.dat3m.dartagnan.program.event.core.CondJump)

Example 80 with Event

use of com.dat3m.dartagnan.program.event.core.Event in project Dat3M by hernanponcedeleon.

the class Simplifier method simplify.

private boolean simplify(Thread t) {
    Event pred = t.getEntry();
    boolean hasAnyChanges = false;
    while (true) {
        Event next = pred.getSuccessor();
        if (next == null) {
            break;
        }
        // Thus we apply them iteratively until we reach a fixpoint.
        if (simplifyEvent(next)) {
            hasAnyChanges = true;
        } else {
            // If nothing has changed, we proceed to the next event
            pred = pred.getSuccessor();
        }
    }
    return hasAnyChanges;
}
Also used : Event(com.dat3m.dartagnan.program.event.core.Event)

Aggregations

Event (com.dat3m.dartagnan.program.event.core.Event)104 Tuple (com.dat3m.dartagnan.wmm.utils.Tuple)34 Thread (com.dat3m.dartagnan.program.Thread)32 Register (com.dat3m.dartagnan.program.Register)25 TupleSet (com.dat3m.dartagnan.wmm.utils.TupleSet)25 MemEvent (com.dat3m.dartagnan.program.event.core.MemEvent)20 Tag (com.dat3m.dartagnan.program.event.Tag)16 Label (com.dat3m.dartagnan.program.event.core.Label)16 Collectors (java.util.stream.Collectors)16 BooleanFormula (org.sosy_lab.java_smt.api.BooleanFormula)16 BooleanFormulaManager (org.sosy_lab.java_smt.api.BooleanFormulaManager)16 LogManager (org.apache.logging.log4j.LogManager)15 Logger (org.apache.logging.log4j.Logger)15 Program (com.dat3m.dartagnan.program.Program)12 ExecutionAnalysis (com.dat3m.dartagnan.program.analysis.ExecutionAnalysis)12 RegWriter (com.dat3m.dartagnan.program.event.core.utils.RegWriter)12 java.util (java.util)12 SolverContext (org.sosy_lab.java_smt.api.SolverContext)12 FilterBasic (com.dat3m.dartagnan.program.filter.FilterBasic)11 CondJump (com.dat3m.dartagnan.program.event.core.CondJump)10