use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class LoopUnrolling method unrollThreadOnce.
private void unrollThreadOnce(Thread t, int bound) {
// NOTE: The implemented unroll semantics are identical to the previous one we had.
// TODO: We might want to allow usage of different bounds per loop by e.g.
// annotating the looping jump with a custom bound counter
// TODO (2): The code can surely be cleaned up somehow
Event cur = t.getEntry();
Event successor;
Event predecessor = null;
Event newPred;
do {
successor = cur.getSuccessor();
if (cur instanceof CondJump && ((CondJump) cur).getLabel().getOId() < cur.getOId()) {
CondJump jump = (CondJump) cur;
Label label = jump.getLabel();
if (bound > 1) {
predecessor = copyPath(label, successor, predecessor);
}
if (bound == 1) {
Label target = (Label) jump.getThread().getExit();
newPred = EventFactory.newGoto(target);
newPred.addFilters(Tag.BOUND);
predecessor.setSuccessor(newPred);
} else {
newPred = predecessor;
}
} else {
newPred = cur;
if (predecessor != null) {
// TODO: Is this needed anymore since we got rid of If events?
if (bound != 1) {
newPred = cur.getCopy();
}
predecessor.setSuccessor(newPred);
}
}
cur = successor;
predecessor = newPred;
} while (successor != null);
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class ProgramEncoder method encodeThreadCF.
private BooleanFormula encodeThreadCF(Thread thread, SolverContext ctx) {
checkInitialized();
BooleanFormulaManager bmgr = ctx.getFormulaManager().getBooleanFormulaManager();
BooleanFormula enc = bmgr.makeTrue();
BiFunction<BooleanFormula, BooleanFormula, BooleanFormula> cfEncoder = shouldAllowPartialExecutions ? bmgr::implication : bmgr::equivalence;
Map<Label, Set<Event>> labelJumpMap = new HashMap<>();
Event pred = null;
for (Event e : thread.getEntry().getSuccessors()) {
// Immediate control flow
BooleanFormula cfCond = pred == null ? bmgr.makeTrue() : pred.cf();
if (pred instanceof CondJump) {
CondJump jump = (CondJump) pred;
cfCond = bmgr.and(cfCond, bmgr.not(jump.getGuard().toBoolFormula(jump, ctx)));
// NOTE: we need to register the actual jumps here, because the
// listener sets of labels is too large (it contains old copies)
labelJumpMap.computeIfAbsent(jump.getLabel(), key -> new HashSet<>()).add(jump);
}
// Control flow via jumps
if (e instanceof Label) {
for (Event jump : labelJumpMap.getOrDefault(e, Collections.emptySet())) {
CondJump j = (CondJump) jump;
cfCond = bmgr.or(cfCond, bmgr.and(j.cf(), j.getGuard().toBoolFormula(j, ctx)));
}
}
enc = bmgr.and(enc, cfEncoder.apply(e.cf(), cfCond), e.encodeExec(ctx));
pred = e;
}
return enc;
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class UnrollExceptionsTest method RMWStoreExclusive.
@Test(expected = ProgramProcessingException.class)
public void RMWStoreExclusive() throws Exception {
ProgramBuilder pb = new ProgramBuilder(SourceLanguage.LITMUS);
pb.initThread(0);
Label start = pb.getOrCreateLabel("loopStart");
pb.addChild(0, start);
pb.addChild(0, newRMWStoreExclusive(pb.getOrNewObject("X"), IValue.ONE, null, true));
pb.addChild(0, EventFactory.newGoto(start));
LoopUnrolling processor = LoopUnrolling.newInstance();
processor.setUnrollingBound(2);
processor.run(pb.build());
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class UnrollExceptionsTest method RMWStore.
// These events cannot be unrolled. They are generated during compilation.
@Test(expected = ProgramProcessingException.class)
public void RMWStore() throws Exception {
ProgramBuilder pb = new ProgramBuilder(SourceLanguage.LITMUS);
pb.initThread(0);
MemoryObject object = pb.getOrNewObject("X");
Label start = pb.getOrCreateLabel("loopStart");
pb.addChild(0, start);
Load load = EventFactory.newRMWLoad(pb.getOrCreateRegister(0, "r1", 32), object, null);
pb.addChild(0, EventFactory.newRMWStore(load, object, IValue.ONE, null));
pb.addChild(0, EventFactory.newGoto(start));
LoopUnrolling processor = LoopUnrolling.newInstance();
processor.setUnrollingBound(2);
processor.run(pb.build());
}
use of com.dat3m.dartagnan.program.event.core.Label in project Dat3M by hernanponcedeleon.
the class UnrollExceptionsTest method FenceCond.
@Test(expected = ProgramProcessingException.class)
public void FenceCond() throws Exception {
ProgramBuilder pb = new ProgramBuilder(SourceLanguage.LITMUS);
pb.initThread(0);
MemoryObject object = pb.getOrNewObject("X");
Label start = pb.getOrCreateLabel("loopStart");
pb.addChild(0, start);
RMWReadCond load = Linux.newRMWReadCondCmp(pb.getOrCreateRegister(0, "r1", 32), BConst.TRUE, object, null);
pb.addChild(0, Linux.newConditionalBarrier(load, null));
pb.addChild(0, EventFactory.newGoto(start));
LoopUnrolling processor = LoopUnrolling.newInstance();
processor.setUnrollingBound(2);
processor.run(pb.build());
}
Aggregations