Search in sources :

Example 16 with Register

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));
    }
}
Also used : java.util(java.util) CO(com.dat3m.dartagnan.wmm.relation.RelationNameRepository.CO) BooleanFormula(org.sosy_lab.java_smt.api.BooleanFormula) com.dat3m.dartagnan.program.event.core(com.dat3m.dartagnan.program.event.core) RF(com.dat3m.dartagnan.wmm.relation.RelationNameRepository.RF) Thread(com.dat3m.dartagnan.program.Thread) FilterAbstract(com.dat3m.dartagnan.program.filter.FilterAbstract) EndAtomic(com.dat3m.dartagnan.program.event.lang.svcomp.EndAtomic) Model(org.sosy_lab.java_smt.api.Model) Wmm(com.dat3m.dartagnan.wmm.Wmm) ImmutableList(com.google.common.collect.ImmutableList) SolverContext(org.sosy_lab.java_smt.api.SolverContext) Program(com.dat3m.dartagnan.program.Program) RegReaderData(com.dat3m.dartagnan.program.event.core.utils.RegReaderData) BigInteger(java.math.BigInteger) FilterBasic(com.dat3m.dartagnan.program.filter.FilterBasic) VerificationTask(com.dat3m.dartagnan.verification.VerificationTask) RelCo(com.dat3m.dartagnan.wmm.relation.base.memory.RelCo) BeginAtomic(com.dat3m.dartagnan.program.event.lang.svcomp.BeginAtomic) Relation(com.dat3m.dartagnan.wmm.relation.Relation) Collectors(java.util.stream.Collectors) Sets(com.google.common.collect.Sets) Tag(com.dat3m.dartagnan.program.event.Tag) Preconditions(com.google.common.base.Preconditions) Register(com.dat3m.dartagnan.program.Register) RegWriter(com.dat3m.dartagnan.program.event.core.utils.RegWriter) Register(com.dat3m.dartagnan.program.Register) RegWriter(com.dat3m.dartagnan.program.event.core.utils.RegWriter) RegReaderData(com.dat3m.dartagnan.program.event.core.utils.RegReaderData)

Example 17 with Register

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));
            }
        }
    }
}
Also used : TupleSet(com.dat3m.dartagnan.wmm.utils.TupleSet) Register(com.dat3m.dartagnan.program.Register) Event(com.dat3m.dartagnan.program.event.core.Event) Dependency(com.dat3m.dartagnan.program.analysis.Dependency) Tuple(com.dat3m.dartagnan.wmm.utils.Tuple)

Example 18 with Register

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);
}
Also used : Register(com.dat3m.dartagnan.program.Register) ProgramBuilder(com.dat3m.dartagnan.parsers.program.utils.ProgramBuilder) MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) AliasAnalysis(com.dat3m.dartagnan.program.analysis.AliasAnalysis)

Example 19 with Register

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);
}
Also used : Register(com.dat3m.dartagnan.program.Register) ProgramBuilder(com.dat3m.dartagnan.parsers.program.utils.ProgramBuilder) MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) AliasAnalysis(com.dat3m.dartagnan.program.analysis.AliasAnalysis)

Example 20 with Register

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);
}
Also used : Register(com.dat3m.dartagnan.program.Register) ProgramBuilder(com.dat3m.dartagnan.parsers.program.utils.ProgramBuilder) MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) AliasAnalysis(com.dat3m.dartagnan.program.analysis.AliasAnalysis)

Aggregations

Register (com.dat3m.dartagnan.program.Register)154 MemoryObject (com.dat3m.dartagnan.program.memory.MemoryObject)29 Event (com.dat3m.dartagnan.program.event.core.Event)25 IExpr (com.dat3m.dartagnan.expression.IExpr)16 RegWriter (com.dat3m.dartagnan.program.event.core.utils.RegWriter)15 ProgramBuilder (com.dat3m.dartagnan.parsers.program.utils.ProgramBuilder)13 AliasAnalysis (com.dat3m.dartagnan.program.analysis.AliasAnalysis)12 Label (com.dat3m.dartagnan.program.event.core.Label)11 ParsingException (com.dat3m.dartagnan.exception.ParsingException)10 BigInteger (java.math.BigInteger)8 IConst (com.dat3m.dartagnan.expression.IConst)7 IExprBin (com.dat3m.dartagnan.expression.IExprBin)6 IValue (com.dat3m.dartagnan.expression.IValue)6 IOpBin (com.dat3m.dartagnan.expression.op.IOpBin)6 Program (com.dat3m.dartagnan.program.Program)6 Dependency (com.dat3m.dartagnan.program.analysis.Dependency)6 ExprInterface (com.dat3m.dartagnan.expression.ExprInterface)5 Thread (com.dat3m.dartagnan.program.Thread)5 java.util (java.util)5 Atom (com.dat3m.dartagnan.expression.Atom)4