Search in sources :

Example 6 with ExprInterface

use of com.dat3m.dartagnan.expression.ExprInterface in project Dat3M by hernanponcedeleon.

the class AndersenAliasAnalysis method processLocs.

private void processLocs(Program program) {
    for (Event ev : program.getCache().getEvents(FilterBasic.get(Tag.MEMORY))) {
        MemEvent e = (MemEvent) ev;
        IExpr address = e.getAddress();
        // Collect for each v events of form: p = *v, *v = q
        if (address instanceof Register) {
            graph.addEvent((Register) address, e);
            continue;
        }
        Constant addressConstant = new Constant(address);
        if (addressConstant.failed) {
            // r = *(CompExpr) -> loc(r) = max
            if (e instanceof RegWriter) {
                Register register = ((RegWriter) e).getResultRegister();
                graph.addAllAddresses(register, maxAddressSet);
                variables.add(register);
            }
            // FIXME if e is a store event, then all locations should include its values
            eventAddressSpaceMap.put(e, maxAddressSet);
            continue;
        }
        // address is a constant
        Location location = addressConstant.location;
        if (location == null) {
            throw new RuntimeException("memory event accessing a pure constant address");
        }
        eventAddressSpaceMap.put(e, ImmutableSet.of(location));
        if (e instanceof RegWriter) {
            graph.addEdge(location, ((RegWriter) e).getResultRegister());
            continue;
        }
        // event is a store operation
        Verify.verify(e.is(Tag.WRITE), "memory event that is neither tagged \"W\" nor a register writer");
        ExprInterface value = e.getMemValue();
        if (value instanceof Register) {
            graph.addEdge(value, location);
            continue;
        }
        Constant v = new Constant(value);
        if (v.failed) {
            graph.addAllAddresses(location, maxAddressSet);
        } else if (v.location != null) {
            graph.addAddress(location, v.location);
        }
        variables.add(location);
    }
}
Also used : ExprInterface(com.dat3m.dartagnan.expression.ExprInterface) Register(com.dat3m.dartagnan.program.Register) RegWriter(com.dat3m.dartagnan.program.event.core.utils.RegWriter) IExpr(com.dat3m.dartagnan.expression.IExpr)

Example 7 with ExprInterface

use of com.dat3m.dartagnan.expression.ExprInterface in project Dat3M by hernanponcedeleon.

the class AndersenAliasAnalysis method processResults.

private void processResults(Program program) {
    // Used to have pointer analysis when having arrays and structures
    Map<Register, Set<Location>> targets = new HashMap<>();
    BiConsumer<Register, Location> addTarget = (r, l) -> targets.put(r, Set.of(l));
    BiConsumer<Register, MemoryObject> addTargetArray = (r, b) -> targets.put(r, IntStream.range(0, b.size()).mapToObj(i -> new Location(b, i)).collect(Collectors.toSet()));
    for (Event ev : program.getCache().getEvents(FilterBasic.get(Tag.LOCAL))) {
        // Not only Local events have EType.LOCAL tag
        if (!(ev instanceof Local)) {
            continue;
        }
        Local l = (Local) ev;
        ExprInterface exp = l.getExpr();
        Register reg = l.getResultRegister();
        if (exp instanceof MemoryObject) {
            addTarget.accept(reg, new Location((MemoryObject) exp, 0));
        } else if (exp instanceof IExprBin) {
            IExpr base = ((IExprBin) exp).getBase();
            if (base instanceof MemoryObject) {
                IExpr rhs = ((IExprBin) exp).getRHS();
                // FIXME Address extends IConst
                if (rhs instanceof IConst) {
                    addTarget.accept(reg, new Location((MemoryObject) base, ((IConst) rhs).getValueAsInt()));
                } else {
                    addTargetArray.accept(reg, (MemoryObject) base);
                }
                continue;
            }
            if (!(base instanceof Register)) {
                continue;
            }
            // accept register2 = register1 + constant
            for (Location target : targets.getOrDefault(base, Set.of())) {
                IExpr rhs = ((IExprBin) exp).getRHS();
                // FIXME Address extends IConst
                if (rhs instanceof IConst) {
                    int o = target.offset + ((IConst) rhs).getValueAsInt();
                    if (o < target.base.size()) {
                        addTarget.accept(reg, new Location(target.base, o));
                    }
                } else {
                    addTargetArray.accept(reg, target.base);
                }
            }
        }
    }
    for (Event e : program.getCache().getEvents(FilterBasic.get(Tag.MEMORY))) {
        IExpr address = ((MemEvent) e).getAddress();
        Set<Location> addresses;
        if (address instanceof Register) {
            Set<Location> target = targets.get(address);
            if (target != null) {
                addresses = target;
            } else {
                addresses = graph.getAddresses(address);
            }
        } else {
            Constant addressConstant = new Constant(address);
            if (addressConstant.failed) {
                addresses = maxAddressSet;
            } else {
                Verify.verify(addressConstant.location != null, "memory event accessing a pure constant address");
                addresses = ImmutableSet.of(addressConstant.location);
            }
        }
        if (addresses.size() == 0) {
            addresses = maxAddressSet;
        }
        eventAddressSpaceMap.put((MemEvent) e, ImmutableSet.copyOf(addresses));
    }
}
Also used : MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) IntStream(java.util.stream.IntStream) java.util(java.util) Verify(com.google.common.base.Verify) ImmutableSet(com.google.common.collect.ImmutableSet) ExprInterface(com.dat3m.dartagnan.expression.ExprInterface) Configuration(org.sosy_lab.common.configuration.Configuration) com.dat3m.dartagnan.program.event.core(com.dat3m.dartagnan.program.event.core) Collectors(java.util.stream.Collectors) IConst(com.dat3m.dartagnan.expression.IConst) Sets(com.google.common.collect.Sets) Tag(com.dat3m.dartagnan.program.event.Tag) PLUS(com.dat3m.dartagnan.expression.op.IOpBin.PLUS) IExpr(com.dat3m.dartagnan.expression.IExpr) BiConsumer(java.util.function.BiConsumer) IExprBin(com.dat3m.dartagnan.expression.IExprBin) Program(com.dat3m.dartagnan.program.Program) Preconditions(com.google.common.base.Preconditions) Register(com.dat3m.dartagnan.program.Register) RegWriter(com.dat3m.dartagnan.program.event.core.utils.RegWriter) FilterBasic(com.dat3m.dartagnan.program.filter.FilterBasic) InvalidConfigurationException(org.sosy_lab.common.configuration.InvalidConfigurationException) IExprBin(com.dat3m.dartagnan.expression.IExprBin) ImmutableSet(com.google.common.collect.ImmutableSet) ExprInterface(com.dat3m.dartagnan.expression.ExprInterface) IConst(com.dat3m.dartagnan.expression.IConst) Register(com.dat3m.dartagnan.program.Register) MemoryObject(com.dat3m.dartagnan.program.memory.MemoryObject) IExpr(com.dat3m.dartagnan.expression.IExpr)

Aggregations

ExprInterface (com.dat3m.dartagnan.expression.ExprInterface)7 Register (com.dat3m.dartagnan.program.Register)5 IExpr (com.dat3m.dartagnan.expression.IExpr)4 IConst (com.dat3m.dartagnan.expression.IConst)3 MemoryObject (com.dat3m.dartagnan.program.memory.MemoryObject)3 IExprBin (com.dat3m.dartagnan.expression.IExprBin)2 RegWriter (com.dat3m.dartagnan.program.event.core.utils.RegWriter)2 PLUS (com.dat3m.dartagnan.expression.op.IOpBin.PLUS)1 Program (com.dat3m.dartagnan.program.Program)1 Tag (com.dat3m.dartagnan.program.event.Tag)1 com.dat3m.dartagnan.program.event.core (com.dat3m.dartagnan.program.event.core)1 Event (com.dat3m.dartagnan.program.event.core.Event)1 Local (com.dat3m.dartagnan.program.event.core.Local)1 FilterBasic (com.dat3m.dartagnan.program.filter.FilterBasic)1 Preconditions (com.google.common.base.Preconditions)1 Verify (com.google.common.base.Verify)1 ImmutableSet (com.google.common.collect.ImmutableSet)1 Sets (com.google.common.collect.Sets)1 java.util (java.util)1 BiConsumer (java.util.function.BiConsumer)1