use of com.dat3m.dartagnan.program.event.core.rmw.RMWStore 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.event.core.rmw.RMWStore in project Dat3M by hernanponcedeleon.
the class VisitorBase method visitRMW.
@Override
public List<Event> visitRMW(RMW e) {
Register resultRegister = e.getResultRegister();
IExpr address = e.getAddress();
String mo = e.getMo();
Register dummyReg = e.getThread().newRegister(resultRegister.getPrecision());
Load load = newRMWLoad(dummyReg, address, mo);
RMWStore store = newRMWStore(load, address, e.getMemValue(), mo);
return eventSequence(load, store, newLocal(resultRegister, dummyReg));
}
use of com.dat3m.dartagnan.program.event.core.rmw.RMWStore in project Dat3M by hernanponcedeleon.
the class VisitorTso method visitXchg.
@Override
public List<Event> visitXchg(Xchg e) {
Register resultRegister = e.getResultRegister();
IExpr address = e.getAddress();
Register dummyReg = e.getThread().newRegister(resultRegister.getPrecision());
Load load = newRMWLoad(dummyReg, address, null);
load.addFilters(Tag.TSO.ATOM);
RMWStore store = newRMWStore(load, address, resultRegister, null);
store.addFilters(Tag.TSO.ATOM);
return eventSequence(load, store, newLocal(resultRegister, dummyReg));
}
use of com.dat3m.dartagnan.program.event.core.rmw.RMWStore in project Dat3M by hernanponcedeleon.
the class RMWGraph method repopulate.
/* Right now there are four cases where the RMW-Relation is established:
(1) LOCK : Load -> CondJump -> Store
(2) RMW : RMWLoad -> RMWStore (completely static)
(3) ExclAccess : ExclLoad -> ExclStore (dependent on control flow)
(4) Atomic blocks: BeginAtomic -> Events* -> EndAtomic
We need to keep this in line with the implementation of RelRMW!
*/
@Override
public void repopulate() {
// Atomic blocks
model.getAtomicBlocksMap().values().stream().flatMap(Collection::stream).forEach(block -> {
for (int i = 0; i < block.size(); i++) {
for (int j = i + 1; j < block.size(); j++) {
simpleGraph.add(new Edge(block.get(i).getId(), block.get(j).getId()));
}
}
});
for (List<EventData> events : model.getThreadEventsMap().values()) {
EventData lastExclLoad = null;
for (int i = 0; i < events.size(); i++) {
EventData e = events.get(i);
if (e.isRead()) {
if (e.isLock()) {
// Locks ~ (Load -> CondJump -> Store)
if (i + 1 < events.size()) {
// The condition fails, if the lock was not obtained cause then
// it will be the last event of the thread (we terminate on failed locks)
EventData next = events.get(i + 1);
simpleGraph.add(new Edge(e.getId(), next.getId()));
}
} else if (e.isExclusive()) {
// LoadExcl
lastExclLoad = e;
}
} else if (e.isWrite()) {
if (e.isExclusive()) {
// StoreExcl
if (lastExclLoad == null) {
throw new IllegalStateException("Exclusive store was executed without preceding exclusive load.");
}
simpleGraph.add(new Edge(lastExclLoad.getId(), e.getId()));
lastExclLoad = null;
} else if (e.getEvent() instanceof RMWStore) {
// RMWStore
EventData load = model.getData(((RMWStore) e.getEvent()).getLoadEvent()).get();
simpleGraph.add(new Edge(load.getId(), e.getId()));
}
}
}
}
}
Aggregations