use of com.dat3m.dartagnan.program.filter.FilterAbstract in project Dat3M by hernanponcedeleon.
the class VisitorBase method visitLetDefinition.
@Override
public Object visitLetDefinition(CatParser.LetDefinitionContext ctx) {
Relation r = ctx.e.accept(relationVisitor);
if (r != null) {
r.setName(ctx.n.getText());
relationRepository.updateRelation(r);
} else {
FilterAbstract f = ctx.e.accept(filterVisitor);
f.setName(ctx.n.getText());
wmm.addFilter(f);
}
return null;
}
use of com.dat3m.dartagnan.program.filter.FilterAbstract in project Dat3M by hernanponcedeleon.
the class VisitorRelation method visitExprCartesian.
@Override
public Relation visitExprCartesian(CatParser.ExprCartesianContext ctx) {
boolean orig = base.recursiveDef;
base.recursiveDef = false;
FilterAbstract filter1 = ctx.e1.accept(base.filterVisitor);
FilterAbstract filter2 = ctx.e2.accept(base.filterVisitor);
Relation relation = base.relationRepository.getRelation(RelCartesian.class, filter1, filter2);
base.recursiveDef = orig;
return relation;
}
use of com.dat3m.dartagnan.program.filter.FilterAbstract in project Dat3M by hernanponcedeleon.
the class RelRMW method getMaxTupleSet.
@Override
public TupleSet getMaxTupleSet() {
if (maxTupleSet == null) {
logger.info("Computing maxTupleSet for " + getName());
baseMaxTupleSet = new TupleSet();
// RMWLoad -> RMWStore
FilterAbstract filter = FilterIntersection.get(FilterBasic.get(Tag.RMW), FilterBasic.get(Tag.WRITE));
for (Event store : task.getProgram().getCache().getEvents(filter)) {
if (store instanceof RMWStore) {
baseMaxTupleSet.add(new Tuple(((RMWStore) store).getLoadEvent(), store));
}
}
// Locks: Load -> Assume/CondJump -> Store
FilterAbstract locks = FilterUnion.get(FilterBasic.get(Tag.C11.LOCK), FilterBasic.get(Tag.Linux.LOCK_READ));
filter = FilterIntersection.get(FilterBasic.get(Tag.RMW), locks);
for (Event e : task.getProgram().getCache().getEvents(filter)) {
// Connect Load to Store
baseMaxTupleSet.add(new Tuple(e, e.getSuccessor().getSuccessor()));
}
// Atomics blocks: BeginAtomic -> EndAtomic
filter = FilterIntersection.get(FilterBasic.get(Tag.RMW), FilterBasic.get(SVCOMPATOMIC));
for (Event end : task.getProgram().getCache().getEvents(filter)) {
List<Event> block = ((EndAtomic) end).getBlock().stream().filter(x -> x.is(Tag.VISIBLE)).collect(Collectors.toList());
for (int i = 0; i < block.size(); i++) {
for (int j = i + 1; j < block.size(); j++) {
baseMaxTupleSet.add(new Tuple(block.get(i), block.get(j)));
}
}
}
removeMutuallyExclusiveTuples(baseMaxTupleSet);
maxTupleSet = new TupleSet();
maxTupleSet.addAll(baseMaxTupleSet);
// to find guaranteed pairs (the encoding can then also be improved)
for (Thread thread : task.getProgram().getThreads()) {
for (Event load : thread.getCache().getEvents(loadExclFilter)) {
for (Event store : thread.getCache().getEvents(storeExclFilter)) {
if (load.getCId() < store.getCId()) {
maxTupleSet.add(new Tuple(load, store));
}
}
}
}
removeMutuallyExclusiveTuples(maxTupleSet);
logger.info("maxTupleSet size for " + getName() + ": " + maxTupleSet.size());
}
return maxTupleSet;
}
use of com.dat3m.dartagnan.program.filter.FilterAbstract in project Dat3M by hernanponcedeleon.
the class RelRf method atomicBlockOptimization.
private void atomicBlockOptimization() {
// TODO: This function can not only reduce rf-edges
// but we could also figure out implied coherences:
// Assume w1 and w2 are aliasing in the same block and w1 is before w2,
// then if w1 is co-before some external w3, then so is w2, i.e.
// co(w1, w3) => co(w2, w3), but we also have co(w2, w3) => co(w1, w3)
// so co(w1, w3) <=> co(w2, w3).
// This information is not expressible in terms of min/must sets, but
// we could still encode it.
int sizeBefore = maxTupleSet.size();
// Atomics blocks: BeginAtomic -> EndAtomic
ExecutionAnalysis exec = analysisContext.get(ExecutionAnalysis.class);
AliasAnalysis alias = analysisContext.get(AliasAnalysis.class);
FilterAbstract filter = FilterIntersection.get(FilterBasic.get(RMW), FilterBasic.get(SVCOMP.SVCOMPATOMIC));
for (Event end : task.getProgram().getCache().getEvents(filter)) {
// Collect memEvents of the atomic block
List<Store> writes = new ArrayList<>();
List<Load> reads = new ArrayList<>();
EndAtomic endAtomic = (EndAtomic) end;
for (Event b : endAtomic.getBlock()) {
if (b instanceof Load) {
reads.add((Load) b);
} else if (b instanceof Store) {
writes.add((Store) b);
}
}
for (Load r : reads) {
// If there is any write w inside the atomic block that is guaranteed to
// execute before the read and that aliases with it,
// then the read won't be able to read any external writes
boolean hasImpliedWrites = writes.stream().anyMatch(w -> w.getCId() < r.getCId() && exec.isImplied(r, w) && alias.mustAlias(r, w));
if (hasImpliedWrites) {
maxTupleSet.removeIf(t -> t.getSecond() == r && t.isCrossThread());
}
}
}
logger.info("Atomic block optimization eliminated " + (sizeBefore - maxTupleSet.size()) + " reads");
}
use of com.dat3m.dartagnan.program.filter.FilterAbstract in project Dat3M by hernanponcedeleon.
the class VisitorRelation method visitExprIdentity.
@Override
public Relation visitExprIdentity(CatParser.ExprIdentityContext ctx) {
boolean orig = base.recursiveDef;
base.recursiveDef = false;
FilterAbstract filter = ctx.e.accept(base.filterVisitor);
Relation relation = base.relationRepository.getRelation(RelSetIdentity.class, filter);
base.recursiveDef = orig;
return relation;
}
Aggregations