use of com.dat3m.dartagnan.program.Register in project Dat3M by hernanponcedeleon.
the class ExecutionModel method trackDependencies.
private void trackDependencies(Event e) {
while (!endIfs.isEmpty() && e.getCId() >= endIfs.peek().getCId()) {
// We exited an If and remove the dependencies associated with it
// We do this inside a loop just in case multiple Ifs are left simultaneously
endIfs.pop();
curCtrlDeps.removeAll(ifCtrlDeps.pop());
}
if (e instanceof MemEvent) {
// ---- Track address dependency ----
MemEvent memEvent = (MemEvent) e;
HashSet<EventData> deps = new HashSet<>();
for (Register reg : memEvent.getAddress().getRegs()) {
deps.addAll(lastRegWrites.get(reg));
}
addrDepMap.put(eventMap.get(e), deps);
}
if (e.is(Tag.VISIBLE)) {
// ---- Track ctrl dependency ----
// TODO: This may be done more efficiently, as many events share the same set of ctrldeps.
ctrlDepMap.put(eventMap.get(e), new HashSet<>(curCtrlDeps));
}
if (e instanceof RegReaderData) {
// ---- Track data dependency ----
RegReaderData reader = (RegReaderData) e;
HashSet<EventData> deps = new HashSet<>();
for (Register r : reader.getDataRegs()) {
deps.addAll(lastRegWrites.getOrDefault(r, Collections.emptySet()));
}
if (e instanceof Store) {
// ---- visible data dependency ----
dataDepMap.put(eventMap.get(e), deps);
}
if (e instanceof RegWriter) {
// ---- internal data dependency ----
RegWriter writer = (RegWriter) e;
lastRegWrites.put(writer.getResultRegister(), deps);
}
if (e instanceof CondJump) {
if (e instanceof IfAsJump) {
// Remember what dependencies were added when entering the If so we can remove them when exiting
HashSet<EventData> addedDeps = new HashSet<>(Sets.difference(deps, curCtrlDeps));
ifCtrlDeps.push(addedDeps);
endIfs.push(((IfAsJump) e).getEndIf());
}
// Jumps add all dependencies
curCtrlDeps.addAll(deps);
}
}
if (e instanceof Load) {
// ---- Update lastRegWrites ----
Load load = (Load) e;
lastRegWrites.compute(load.getResultRegister(), (k, v) -> new HashSet<>()).add(eventMap.get(e));
}
}
use of com.dat3m.dartagnan.program.Register in project Dat3M by hernanponcedeleon.
the class BasicRegRelation method mkTupleSets.
private void mkTupleSets() {
maxTupleSet = new TupleSet();
minTupleSet = new TupleSet();
Dependency dep = analysisContext.requires(Dependency.class);
for (Event regReader : getEvents()) {
for (Register register : getRegisters(regReader)) {
Dependency.State r = dep.of(regReader, register);
for (Event regWriter : r.may) {
maxTupleSet.add(new Tuple(regWriter, regReader));
}
for (Event regWriter : r.must) {
minTupleSet.add(new Tuple(regWriter, regReader));
}
}
}
}
use of com.dat3m.dartagnan.program.Register in project Dat3M by hernanponcedeleon.
the class AnalysisTest method program2.
private void program2(Alias method, Result... expect) throws InvalidConfigurationException {
ProgramBuilder b = new ProgramBuilder(SourceLanguage.LITMUS);
MemoryObject x = b.newObject("x", 3);
b.initThread(0);
Register r0 = b.getOrCreateRegister(0, "r0", ARCH_PRECISION);
b.addChild(0, newLocal(r0, new INonDet(INonDetTypes.INT, ARCH_PRECISION)));
Label l0 = b.getOrCreateLabel("l0");
b.addChild(0, newJump(new BExprBin(new Atom(r0, GT, ONE), BOpBin.OR, new Atom(r0, LT, ZERO)), l0));
Store e0 = newStore(x);
b.addChild(0, e0);
Store e1 = newStore(plus(x, 1));
b.addChild(0, e1);
Store e2 = newStore(plus(x, 2));
b.addChild(0, e2);
Register r1 = b.getOrCreateRegister(0, "r1", ARCH_PRECISION);
b.addChild(0, newLocal(r1, ZERO));
Store e3 = newStore(new IExprBin(new IExprBin(x, PLUS, mult(r0, 2)), PLUS, mult(r1, 4)));
b.addChild(0, e3);
b.addChild(0, l0);
AliasAnalysis a = analyze(b, method);
assertAlias(expect[0], a, e0, e1);
assertAlias(expect[1], a, e0, e2);
assertAlias(expect[2], a, e1, e2);
assertAlias(expect[3], a, e0, e3);
assertAlias(expect[4], a, e1, e3);
assertAlias(expect[5], a, e2, e3);
}
use of com.dat3m.dartagnan.program.Register in project Dat3M by hernanponcedeleon.
the class AnalysisTest method program5.
private void program5(Alias method, Result... expect) throws InvalidConfigurationException {
ProgramBuilder b = new ProgramBuilder(SourceLanguage.LITMUS);
MemoryObject x = b.getOrNewObject("x");
MemoryObject y = b.getOrNewObject("y");
MemoryObject z = b.getOrNewObject("z");
b.initThread(0);
Register r0 = b.getOrCreateRegister(0, "r0", ARCH_PRECISION);
b.addChild(0, newLocal(r0, y));
Store e0 = newStore(r0);
b.addChild(0, e0);
b.addChild(0, newLocal(r0, mult(x, 0)));
Store e1 = newStore(x);
b.addChild(0, e1);
Store e2 = newStore(y);
b.addChild(0, e2);
Store e3 = newStore(z);
b.addChild(0, e3);
AliasAnalysis a = analyze(b, method);
// precisely no
assertAlias(expect[0], a, e0, e1);
// precisely must
assertAlias(expect[1], a, e0, e2);
assertAlias(expect[2], a, e1, e2);
assertAlias(expect[3], a, e0, e3);
assertAlias(expect[4], a, e1, e3);
assertAlias(expect[5], a, e2, e3);
}
use of com.dat3m.dartagnan.program.Register in project Dat3M by hernanponcedeleon.
the class AnalysisTest method program1.
private void program1(Alias method, Result... expect) throws InvalidConfigurationException {
ProgramBuilder b = new ProgramBuilder(SourceLanguage.LITMUS);
MemoryObject x = b.newObject("x", 3);
x.setInitialValue(0, x);
b.initThread(0);
Store e0 = newStore(plus(x, 1));
b.addChild(0, e0);
Register r0 = b.getOrCreateRegister(0, "r0", ARCH_PRECISION);
Load e1 = newLoad(r0, x);
b.addChild(0, e1);
Store e2 = newStore(r0);
b.addChild(0, e2);
Store e3 = newStore(plus(r0, 1), r0);
b.addChild(0, e3);
AliasAnalysis a = analyze(b, method);
assertAlias(expect[0], a, e0, e1);
assertAlias(expect[1], a, e0, e2);
assertAlias(expect[2], a, e1, e2);
assertAlias(expect[3], a, e0, e3);
assertAlias(expect[4], a, e1, e3);
assertAlias(expect[5], a, e2, e3);
}
Aggregations