From db3479b37b715bd01afa7bf82baf50c46e23b3f2 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 9 Sep 2025 13:58:27 +0200 Subject: [PATCH 001/109] Added rudimentary pointer expressions --- .../dartagnan/encoding/ExpressionEncoder.java | 94 ++++++++++++++++++- .../expression/ExpressionVisitor.java | 6 ++ .../expression/pointer/IntToPtrCast.java | 21 +++++ .../expression/pointer/NullLiteral.java | 28 ++++++ .../expression/pointer/PointerAddExpr.java | 41 ++++++++ .../expression/pointer/PointerCmpOp.java | 25 +++++ .../expression/pointer/PtrCmpExpr.java | 21 +++++ .../expression/pointer/PtrToIntCast.java | 21 +++++ .../expression/type/PointerType.java | 20 ++++ 9 files changed, 276 insertions(+), 1 deletion(-) create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/IntToPtrCast.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/NullLiteral.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 22458ee63e..c9cb336bce 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -11,6 +11,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryOp; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.dat3m.dartagnan.program.Register; @@ -178,6 +179,15 @@ public void setEvent(Event e) { return (TypedFormula) typedFormula; } + @SuppressWarnings("unchecked") + public TypedFormula encodePointerExpr(Expression expression) { + checkArgument(expression.getType() instanceof PointerType); + final TypedFormula typedFormula = encode(expression); + assert typedFormula.type() == expression.getType(); + assert typedFormula.formula() instanceof IntegerFormula || typedFormula.formula() instanceof BitvectorFormula; + return (TypedFormula) typedFormula; + } + @SuppressWarnings("unchecked") public TypedFormula encodeBooleanExpr(Expression expression) { Preconditions.checkArgument(expression.getType() instanceof BooleanType); @@ -492,6 +502,87 @@ public TypedFormula visitIntCmpExpression(IntCmpExp return new TypedFormula<>(expr.getType(), enc); } + + // ==================================================================================== + // Pointers + + @Override + public TypedFormula visitPointerAddExpression(PointerAddExpr expr) { + final TypedFormula base = encodePointerExpr(expr.getBase()); + final TypedFormula offset = encodeIntegerExpr(expr.getOffset()); + + if (context.useIntegers) { + final IntegerFormula baseForm = (IntegerFormula) base.formula(); + final IntegerFormula offsetForm = (IntegerFormula) offset.formula(); + + return new TypedFormula<>(base.getType(), integerFormulaManager().add(baseForm, offsetForm)); + } else { + final BitvectorFormula baseForm = (BitvectorFormula) base.formula(); + final BitvectorFormula offsetForm = (BitvectorFormula) offset.formula(); + + return new TypedFormula<>(base.getType(), bitvectorFormulaManager().add(baseForm, offsetForm)); + } + + } + + @Override + public TypedFormula visitPtrToIntCastExpression(PtrToIntCast expr) { + final TypedFormula ptr = encodePointerExpr(expr.getOperand()); + return new TypedFormula<>(expr.getType(), ptr.formula()); + + } + + @Override + public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { + final TypedFormula address = encodeIntegerExpr(expr.getOperand()); + return new TypedFormula<>(expr.getType(), address.formula()); + } + + @Override + public TypedFormula visitPtrCmpExpression(PtrCmpExpr expr) { + if (context.useIntegers) { + final var left = (TypedFormula) encodePointerExpr(expr.getLeft()); + final var right = (TypedFormula) encodePointerExpr(expr.getRight()); + + final IntegerFormulaManager imgr = integerFormulaManager(); + final BooleanFormula result = switch (expr.getKind()) { + case EQ -> imgr.equal(left.formula(), right.formula()); + case NEQ -> bmgr.not(fmgr.equal(left.formula(), right.formula())); + case LT -> imgr.lessThan(left.formula(), right.formula()); + case LTE -> imgr.lessOrEquals(left.formula(), right.formula()); + case GT -> imgr.greaterThan(left.formula(), right.formula()); + case GTE -> imgr.greaterOrEquals(left.formula(), right.formula()); + }; + return new TypedFormula<>(types.getBooleanType(), result); + }else{ + final var left = (TypedFormula) encodePointerExpr(expr.getLeft()); + final var right = (TypedFormula) encodePointerExpr(expr.getRight()); + final BitvectorFormulaManager bvgr = bitvectorFormulaManager(); + final BooleanFormula result = switch (expr.getKind()) { + case EQ -> bvgr.equal(left.formula(), right.formula()); + case NEQ -> bmgr.not(fmgr.equal(left.formula(), right.formula())); + case LT -> bvgr.lessThan(left.formula(), right.formula(),false); + case LTE -> bvgr.lessOrEquals(left.formula(), right.formula(),false); + case GT -> bvgr.greaterThan(left.formula(), right.formula(),false); + case GTE -> bvgr.greaterOrEquals(left.formula(), right.formula(),false); + }; + return new TypedFormula<>(types.getBooleanType(), result); + } + } + + @Override + public TypedFormula visitNullLiteral(NullLiteral lit) { + final Formula zero = context.useIntegers + ? integerFormulaManager().makeNumber(0) + : bitvectorFormulaManager().makeBitvector(types.getArchType().getBitWidth(), 0); + + return new TypedFormula<>(lit.getType(), zero); + } + + + + + // ==================================================================================== // Aggregates @@ -562,7 +653,8 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { @Override public TypedFormula visitMemoryObject(MemoryObject memObj) { - return makeVariable(String.format("addrof(%s)", memObj), memObj.getType()); + Formula result = makeVariable(String.format("addrof(%s)", memObj), memObj.getType()).formula(); + return new TypedFormula<>(memObj.getType(), result); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 3396f90063..cd7c728fc0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -11,6 +11,7 @@ import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.memory.FinalMemoryValue; @@ -57,6 +58,11 @@ public interface ExpressionVisitor { // =================================== Pointer =================================== default TRet visitGEPExpression(GEPExpr expr) { return visitExpression(expr); } + default TRet visitPointerAddExpression(PointerAddExpr expr) { return visitExpression(expr); } + default TRet visitIntToPtrCastExpression(IntToPtrCast expr) { return visitCastExpression(expr); } + default TRet visitPtrToIntCastExpression(PtrToIntCast expr) { return visitCastExpression(expr); } + default TRet visitPtrCmpExpression(PtrCmpExpr expr) { return visitBinaryExpression(expr); } + default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/IntToPtrCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/IntToPtrCast.java new file mode 100644 index 0000000000..f2064b2c1b --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/IntToPtrCast.java @@ -0,0 +1,21 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.CastExpressionBase; +import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; + +public final class IntToPtrCast extends CastExpressionBase { + + public IntToPtrCast(PointerType pointerType, Expression operand) { + super(pointerType, operand); + ExpressionHelper.checkExpectedType(operand, IntegerType.class); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitIntToPtrCastExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/NullLiteral.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/NullLiteral.java new file mode 100644 index 0000000000..f179a82e1f --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/NullLiteral.java @@ -0,0 +1,28 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.LeafExpressionBase; +import com.dat3m.dartagnan.expression.type.PointerType; + +public class NullLiteral extends LeafExpressionBase { + + public NullLiteral(PointerType type) { + super(type); + } + + @Override + public ExpressionKind getKind() { + return () -> "NULL"; + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitNullLiteral(this); + } + + @Override + public String toString() { + return "nullptr"; + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java new file mode 100644 index 0000000000..0fee5afe20 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java @@ -0,0 +1,41 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.ExpressionBase; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.type.TypeFactory; +import com.google.common.base.Preconditions; +import com.google.common.collect.ImmutableList; + +public class PointerAddExpr extends ExpressionBase { + + private final Expression base; + private final Expression offset; + + public PointerAddExpr(Expression base, Expression offset) { + super((PointerType) base.getType()); + Preconditions.checkArgument(offset.getType().equals(TypeFactory.getInstance().getArchType())); + this.base = base; + this.offset = offset; + } + + public Expression getBase() { return base; } + public Expression getOffset() { return offset; } + + @Override + public ImmutableList getOperands() { + return ImmutableList.of(base, offset); + } + + @Override + public ExpressionKind getKind() { + return () -> "ptradd"; + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitPointerAddExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java new file mode 100644 index 0000000000..0e16c29e54 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java @@ -0,0 +1,25 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.ExpressionKind; + +public enum PointerCmpOp implements ExpressionKind { + EQ, NEQ, GTE, LTE, GT, LT; + + @Override + public String toString() { + return getSymbol(); + } + + @Override + public String getSymbol() { + return switch (this) { + case EQ -> "=="; + case NEQ -> "!="; + case GTE -> ">="; + case LTE -> "<="; + case GT -> ">"; + case LT -> "<"; + }; + } +} + diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java new file mode 100644 index 0000000000..8b2a392847 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java @@ -0,0 +1,21 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.BinaryExpressionBase; +import com.dat3m.dartagnan.expression.type.BooleanType; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; + +public final class PtrCmpExpr extends BinaryExpressionBase { + + public PtrCmpExpr(BooleanType type, Expression left, PointerCmpOp kind, Expression right) { + super(type, kind, left, right); + ExpressionHelper.checkSameExpectedType(left, right, PointerType.class); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitPtrCmpExpression(this); + } +} \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java new file mode 100644 index 0000000000..97a30b1e59 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java @@ -0,0 +1,21 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.CastExpressionBase; +import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; + +public final class PtrToIntCast extends CastExpressionBase { + + public PtrToIntCast(IntegerType archType, Expression operand) { + super(archType, operand); + ExpressionHelper.checkExpectedType(operand, PointerType.class); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitPtrToIntCastExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java new file mode 100644 index 0000000000..df927c90c8 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -0,0 +1,20 @@ +package com.dat3m.dartagnan.expression.type; + +import com.dat3m.dartagnan.expression.Type; + +public class PointerType implements Type { + + PointerType() { + } + + @Override + public String toString() { + return "ptr"; + } + + @Override + public boolean equals(Object obj) { + return obj != null && obj.getClass() == this.getClass(); + } + +} From b0d6bef1734fc30b0adcf71022f666b043639369 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 15 Sep 2025 15:12:20 +0200 Subject: [PATCH 002/109] fixed expr processing --- .../dartagnan/encoding/ExpressionEncoder.java | 4 ++ .../dartagnan/encoding/ProgramEncoder.java | 7 ++- .../expression/ExpressionFactory.java | 59 +++++++++++++++++-- .../expression/ExpressionPrinter.java | 17 ++++++ .../dartagnan/expression/misc/GEPExpr.java | 3 +- .../processing/ExprTransformer.java | 32 ++++++++++ .../expression/type/PointerType.java | 12 +++- .../expression/type/TypeFactory.java | 17 ++++-- .../parsers/program/visitors/VisitorLlvm.java | 12 ++-- .../dartagnan/program/event/EventFactory.java | 4 +- .../dartagnan/program/memory/Memory.java | 3 +- .../program/memory/MemoryObject.java | 7 ++- .../program/memory/VirtualMemoryObject.java | 3 +- .../program/processing/GEPToAddition.java | 4 +- .../program/processing/Intrinsics.java | 2 +- 15 files changed, 154 insertions(+), 32 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index c9cb336bce..bf205c540e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -93,6 +93,10 @@ public TypedFormula encodeBooleanFinal(Expression e variable = context.useIntegers ? integerFormulaManager().makeVariable(name) : bitvectorFormulaManager().makeVariable(integerType.getBitWidth(), name); + }else if (type instanceof PointerType) { + variable = context.useIntegers + ? integerFormulaManager().makeVariable(name) + : bitvectorFormulaManager().makeVariable(types.getArchType().getBitWidth(), name); } else if (type instanceof AggregateType aggType) { final List fields = new ArrayList<>(aggType.getFields().size()); for (TypeOffset field : aggType.getFields()) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java index b0a6a22432..ef9746f08e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java @@ -426,7 +426,7 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { final List memoryObjects = ImmutableList.copyOf(memory.getObjects()); for (int i = 0; i < memoryObjects.size(); i++) { final MemoryObject cur = memoryObjects.get(i); - final Expression addrVar = context.address(cur); + final Expression addrVar = exprs.makePtrToIntCast(context.address(cur)); final Expression sizeVar = context.size(cur); final Expression size; @@ -459,7 +459,10 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { // First object is placed at alignment enc.add(equate.apply(addrVar, alignment)); } else { - final Expression nextAvailableAddr = exprs.makeAdd(context.address(prev), context.size(prev)); + final Expression nextAvailableAddr = exprs.makeAdd( + exprs.makePtrToIntCast(context.address(prev)), + context.size(prev) + ); final Expression nextAlignedAddr = exprs.makeAdd(nextAvailableAddr, exprs.makeSub(alignment, exprs.makeRem(nextAvailableAddr, alignment, true)) ); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index f2210f1445..c40699e884 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; @@ -201,6 +202,8 @@ public Expression makeIntegerCast(Expression operand, IntegerType targetType, bo return sourceType.equals(targetType) ? operand : new IntSizeCast(targetType, operand, signed); } else if (sourceType instanceof FloatType) { return new FloatToIntCast(targetType, operand, signed); + }else if (sourceType instanceof PointerType) { + return new PtrToIntCast(targetType, operand); } throw new UnsupportedOperationException(String.format("Cannot cast %s to %s.", sourceType, targetType)); @@ -315,20 +318,23 @@ public Expression makeAggregateCmp(Expression x, AggregateCmpOp op, Expression y // Pointers public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets) { - return makeGetElementPointer(indexingType, base, offsets, null); + Preconditions.checkArgument(base.getType().equals(types.getPointerType()), + "Applying offsets to non-pointer expression."); + return new GEPExpr(indexingType, base, offsets,null); } public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets, Integer stride) { // TODO: Stride should be a property of the pointer, not of a GEPExpr. // Refactor GEPExpr to only accept a (new) PointerType and a list of offsets. // A PointerType should have the referred type and the stride in its attributes. - Preconditions.checkArgument(base.getType().equals(types.getArchType()), + Preconditions.checkArgument(base.getType().equals(types.getPointerType()), "Applying offsets to non-pointer expression."); Preconditions.checkArgument(stride == null || stride >= types.getMemorySizeInBytes(indexingType), "Stride cannot be smaller than indexing type"); return new GEPExpr(indexingType, base, offsets, stride); } + public ScopedPointer makeScopedPointer(String id, ScopedPointerType type, Expression value) { return new ScopedPointer(id, type, value); } @@ -337,6 +343,35 @@ public ScopedPointerVariable makeScopedPointerVariable(String id, ScopedPointerT return new ScopedPointerVariable(id, type, memObj); } + public Expression makePtrAdd(Expression base, Expression offset) { + return new PointerAddExpr(base, offset); + } + + + public Expression makePtrToIntCast(Expression pointer) { + return new PtrToIntCast(types.getArchType(), pointer); + } + + public Expression makeIntToPtrCast(Expression operand, PointerType pointerType) { + return new IntToPtrCast(pointerType, operand); + } + + public Expression makeIntToPtrCast(Expression operand) { + return new IntToPtrCast(types.getPointerType(), operand); + } + + public Expression makeNullLiteral(PointerType pointerType) { + return new NullLiteral(pointerType); + } + + public Expression makeNullLiteral() { + return makeNullLiteral(types.getPointerType()); + } + + public Expression makePtrCmp(Expression left, PointerCmpOp op, Expression right) { + return new PtrCmpExpr(types.getBooleanType(), left, op, right); + } + // ----------------------------------------------------------------------------------------------------------------- // Misc @@ -360,7 +395,9 @@ public Expression makeGeneralZero(Type type) { return makeFalse(); } else if (type instanceof FloatType floatType) { return makeZero(floatType); - } else { + } else if (type instanceof PointerType pointerType) { + return makeNullLiteral(pointerType); + }else{ throw new UnsupportedOperationException("Cannot create zero of type " + type); } } @@ -376,6 +413,8 @@ public Expression makeCast(Expression expression, Type type, boolean signed) { return makeIntegerCast(expression, integerType, signed); } else if (type instanceof FloatType floatType) { return makeFloatCast(expression, floatType, signed); + }else if (type instanceof PointerType) { + return makeIntToPtrCast(makeCast(expression, types.getArchType())); } throw new UnsupportedOperationException(String.format("Cast %s into %s unsupported.", expression, type)); } @@ -394,7 +433,9 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { return makeBoolBinary(leftOperand, BoolBinaryOp.IFF, rightOperand); } else if (type instanceof IntegerType) { return makeIntCmp(leftOperand, IntCmpOp.EQ, rightOperand); - } else if (type instanceof FloatType) { + } if (type instanceof PointerType) { + return makePtrCmp(leftOperand, PointerCmpOp.EQ, rightOperand); + }else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? return makeFloatCmp(leftOperand, FloatCmpOp.OEQ, rightOperand); } else if (ExpressionHelper.isAggregateLike(type)) { @@ -409,7 +450,9 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { return makeNot(makeBoolBinary(leftOperand, BoolBinaryOp.IFF, rightOperand)); } else if (type instanceof IntegerType) { return makeIntCmp(leftOperand, IntCmpOp.NEQ, rightOperand); - } else if (type instanceof FloatType) { + } if (type instanceof PointerType) { + return makePtrCmp(leftOperand, PointerCmpOp.NEQ, rightOperand); + }else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? return makeFloatCmp(leftOperand, FloatCmpOp.ONEQ, rightOperand); } else if (type instanceof AggregateType) { @@ -438,6 +481,8 @@ public Expression makeBinary(Expression x, ExpressionKind op, Expression y) { return makeFloatBinary(x, floatOp, y); } else if (op instanceof IntCmpOp cmpOp) { return makeCompare(x, cmpOp, y); + }else if (op instanceof PointerCmpOp cmpOp) { + return makeCompare(x, cmpOp, y); } throw new UnsupportedOperationException(String.format("Expression kind %s is no binary operator.", op)); } @@ -449,7 +494,9 @@ public Expression makeCompare(Expression x, ExpressionKind cmpOp, Expression y) return makeFloatCmp(x, floatOp, y); } else if (cmpOp instanceof AggregateCmpOp aggrCmpOp) { return makeAggregateCmp(x, aggrCmpOp, y); + }else if (cmpOp instanceof PointerCmpOp ptrCmpOp) { + return makePtrCmp(x, ptrCmpOp, y); } throw new UnsupportedOperationException(String.format("Expression kind %s is no comparison operator.", cmpOp)); } -} +} \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java index ad586d43ee..e267544d20 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryOp; import com.dat3m.dartagnan.expression.floats.FloatSizeCast; import com.dat3m.dartagnan.expression.floats.IntToFloatCast; +import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; @@ -124,6 +125,22 @@ public String visitGEPExpression(GEPExpr expr) { return expr.getOperands().stream().map(this::visit).collect(Collectors.joining(", ", "GEP(", ")")); } + @Override + public String visitIntToPtrCastExpression(IntToPtrCast expr) { + return String.format("%s to %s", visit(expr.getOperand()), expr.getTargetType()); + } + + @Override + public String visitPtrToIntCastExpression(PtrToIntCast expr) { + return String.format("%s to %s", visit(expr.getOperand()), expr.getTargetType()); + } + + @Override + public String visitPointerAddExpression(PointerAddExpr expr) { + return String.format("%s + %s", visit(expr.getBase()), visit(expr.getOffset())); + } + + @Override public String visitITEExpression(ITEExpr expr) { return visit(expr.getCondition()) + " ? " + visit(expr.getTrueCase()) + " : " + visit(expr.getFalseCase()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/misc/GEPExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/misc/GEPExpr.java index 81891dfa1c..28cb606422 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/misc/GEPExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/misc/GEPExpr.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.base.NaryExpressionBase; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; @@ -21,7 +22,7 @@ public final class GEPExpr extends NaryExpressionBase offsets, Integer stride) { super(base.getType(), ExpressionKind.Other.GEP, concat(base, offsets)); - ExpressionHelper.checkExpectedType(base, IntegerType.class); + ExpressionHelper.checkExpectedType(base, PointerType.class); if (offsets.size() > 1) { Preconditions.checkArgument(isAggregateLike(indexType), "Indexing with multiple indices into non-aggregate type."); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index f2213b26c1..9549e85cbd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -17,6 +17,10 @@ import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; +import com.dat3m.dartagnan.expression.pointer.IntToPtrCast; +import com.dat3m.dartagnan.expression.pointer.PointerAddExpr; +import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; +import com.dat3m.dartagnan.expression.pointer.PtrToIntCast; import java.util.ArrayList; @@ -117,6 +121,34 @@ public Expression visitAggregateCmpExpression(AggregateCmpExpr expr) { ); } + + @Override + public Expression visitPointerAddExpression(PointerAddExpr expr) { + return expressions.makePtrAdd( + expr.getBase().accept(this), + expr.getOffset().accept(this) + ); + } + + @Override + public Expression visitPtrCmpExpression(PtrCmpExpr expr) { + return expressions.makePtrCmp( + expr.getLeft().accept(this), + expr.getKind(), + expr.getRight().accept(this) + ); + } + + @Override + public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { + return expressions.makePtrToIntCast(expr.getOperand().accept(this)); + } + + @Override + public Expression visitIntToPtrCastExpression(IntToPtrCast expr) { + return expressions.makeIntToPtrCast(expr.getOperand().accept(this)); + } + @Override public Expression visitGEPExpression(GEPExpr gep) { Expression base = gep.getBase().accept(this); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index df927c90c8..af5f543629 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -3,9 +3,17 @@ import com.dat3m.dartagnan.expression.Type; public class PointerType implements Type { + private int stride; + private Type referredType; - PointerType() { - } + PointerType() {} + + + public int getStride(){ return stride; }; + public void setStride(int s){ stride = s;}; + + public Type getReferredType(){ return referredType; } + public void setReferredType(Type t){ referredType = t;}; @Override public String toString() { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 09404a60c8..1c5694fa2e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -20,12 +20,13 @@ public final class TypeFactory { private final VoidType voidType = new VoidType(); private final BooleanType booleanType = new BooleanType(); - private final IntegerType pointerDifferenceType; + private final IntegerType archType; + private final PointerType pointerType = new PointerType(); private final Normalizer typeNormalizer = new Normalizer(); private TypeFactory() { - pointerDifferenceType = getIntegerType(64);//TODO insert proper pointer and difference types + archType = getIntegerType(64);//TODO insert proper pointer and difference types } @@ -40,10 +41,11 @@ public BooleanType getBooleanType() { public VoidType getVoidType() { return voidType; } - public Type getPointerType() { - return pointerDifferenceType; + public PointerType getPointerType() { + return pointerType; } + public IntegerType getIntegerType(int bitWidth) { checkArgument(bitWidth > 0, "Non-positive bit width %s.", bitWidth); return typeNormalizer.normalize(new IntegerType(bitWidth)); @@ -141,7 +143,7 @@ public ArrayType getArrayType(Type element, int size, Integer stride, Integer al } public IntegerType getArchType() { - return pointerDifferenceType; + return archType; } public IntegerType getByteType() { @@ -159,6 +161,9 @@ private int getMemorySizeInBytes(Type type, boolean padded) { if (type instanceof IntegerType integerType) { return IntMath.divide(integerType.getBitWidth(), 8, RoundingMode.CEILING); } + if (type instanceof PointerType) { + return getMemorySizeInBytes(getArchType()); + } if (type instanceof FloatType floatType) { return IntMath.divide(floatType.getBitWidth(), 8, RoundingMode.CEILING); } @@ -198,7 +203,7 @@ private int getMemorySizeInBytes(Type type, boolean padded) { } private int getAlignment(Type type) { - if (type instanceof BooleanType || type instanceof IntegerType || type instanceof FloatType) { + if (type instanceof BooleanType || type instanceof IntegerType || type instanceof FloatType || type instanceof PointerType) { return getMemorySizeInBytes(type); } if (type instanceof ArrayType arrayType) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index 13c5f54df7..372dbe9c16 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -826,11 +826,12 @@ public Expression visitAddrSpaceCastInst(AddrSpaceCastInstContext ctx) { private Register conversionInstruction(TypeValueContext operand, TypeContext target, boolean signed) { final Expression operandExpression = visitTypeValue(operand); final Type targetType = parseType(target); - checkSupport(targetType instanceof IntegerType, "Non-integer in %s.", target); - final Expression result = expressions.makeIntegerCast(operandExpression, (IntegerType) targetType, signed); + // checkSupport(targetType instanceof IntegerType, "Non-integer in %s.", target); + final Expression result = expressions.makeCast(operandExpression, targetType, signed); return assignToRegister(result); } + // ================================================================================================================= // Expressions @@ -846,7 +847,8 @@ public Expression visitConstant(ConstantContext ctx) { @Override public Expression visitNullConst(NullConstContext ctx) { - return expressions.makeZero((IntegerType) pointerType); + // return expressions.makeZero((IntegerType) pointerType); + return expressions.makeNullLiteral(); } @Override @@ -1068,8 +1070,8 @@ private Expression checkExpression(Type type, ParserRuleContext context) { private Expression castExpression(TypeConstContext operand, TypeContext target, boolean signed) { final Expression operandExpression = visitTypeConst(operand); final Type targetType = parseType(target); - checkSupport(targetType instanceof IntegerType, "Non-integer type %s.", target); - return expressions.makeIntegerCast(operandExpression, (IntegerType) targetType, signed); + // checkSupport(targetType instanceof IntegerType, "Non-integer type %s.", target); + return expressions.makeCast(operandExpression, targetType, signed); } // ---------------------------------------------------------------------------------------------------------------- diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java index 1d9064b9b1..eb66531a0d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java @@ -165,8 +165,8 @@ public static NamedBarrier newNamedBarrier(String name, String instanceId, Strin public static Init newInit(MemoryObject base, int offset) { //TODO: We simplify here because virtual aliasing currently fails when pointer arithmetic is involved // meaning that and are treated differently. - final Expression address = offset == 0 ? base : - expressions.makeAdd(base, expressions.makeValue(offset, (IntegerType) base.getType())); + // + final Expression address = expressions.makePtrAdd(base, expressions.makeValue(offset, types.getArchType())); final Init init = new Init(base, offset, address); init.addTags(base.getFeatureTags()); return init; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/Memory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/Memory.java index 9c009a2766..45a72f6fed 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/Memory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/Memory.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.event.core.Alloc; import com.google.common.base.Preconditions; @@ -14,7 +15,7 @@ public class Memory { private final ArrayList objects = new ArrayList<>(); - private final Type ptrType = TypeFactory.getInstance().getPointerType(); + private final PointerType ptrType = TypeFactory.getInstance().getPointerType(); private final IntegerType archType = TypeFactory.getInstance().getArchType(); private final Expression defaultAlignment = ExpressionFactory.getInstance().makeValue(8, archType); private final boolean bigEndian; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java index 2f7da6b292..faea593883 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java @@ -19,7 +19,7 @@ /** * Associated with an array of memory locations. */ -public class MemoryObject extends LeafExpressionBase { +public class MemoryObject extends LeafExpressionBase { // TODO: (TH) I think is mostly useless. // Its only benefit is that we can have different memory objects with the same name (but why would we?) @@ -34,7 +34,7 @@ public class MemoryObject extends LeafExpressionBase { private final Map initialValues = new TreeMap<>(); - MemoryObject(int id, Expression size, Expression alignment, Alloc allocationSite, Type ptrType) { + MemoryObject(int id, Expression size, Expression alignment, Alloc allocationSite, PointerType ptrType) { super(ptrType); final TypeFactory types = TypeFactory.getInstance(); Preconditions.checkArgument(size.getType() instanceof IntegerType, "Size %s must be of integer type.", size); @@ -123,7 +123,8 @@ public void setInitialValue(int offset, Expression value) { setInitialValue(offset + innerOffset, structElements.get(i)); } } else if (value.getType() instanceof IntegerType - || value.getType() instanceof BooleanType) { + || value.getType() instanceof BooleanType + || value.getType() instanceof PointerType) { checkArgument(isInRange(offset), "array index out of bounds"); initialValues.put(offset, value); } else { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/VirtualMemoryObject.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/VirtualMemoryObject.java index 66b2ea8c7f..f6e0341748 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/VirtualMemoryObject.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/VirtualMemoryObject.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.type.PointerType; import java.util.Objects; @@ -16,7 +17,7 @@ public class VirtualMemoryObject extends MemoryObject { // the generic address of this virtual address private final VirtualMemoryObject genericAddress; - VirtualMemoryObject(int index, Expression size, Expression alignment, boolean generic, VirtualMemoryObject alias, Type ptrType) { + VirtualMemoryObject(int index, Expression size, Expression alignment, boolean generic, VirtualMemoryObject alias, PointerType ptrType) { super(index, size, alignment, null, ptrType); checkArgument(generic || alias != null, "Non-generic virtualMemoryObject must have generic address it alias target"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java index 9e7924dfd0..a23dadd066 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java @@ -97,8 +97,8 @@ public Expression visitGEPExpression(GEPExpr gep) { } final Expression base = gep.getBase().accept(this); - final Expression castOffset = expressions.makeCast(totalOffset, base.getType(), true); - return expressions.makeAdd(base, castOffset); + final Expression castOffset = expressions.makeCast(totalOffset, types.getArchType(), true); + return expressions.makePtrAdd(base, castOffset); } } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index 284d09bde2..dc24ef2ef7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -1809,7 +1809,7 @@ private List inlineMemSet(FunctionCall call) { final List replacement = new ArrayList<>( count + 1); for (int i = 0; i < count; i++) { final Expression offset = expressions.makeValue(i, types.getArchType()); - final Expression destAddr = expressions.makeAdd(dest, offset); + final Expression destAddr = expressions.makePtrAdd(dest, offset); replacement.add(newStore(destAddr, zero)); } From ef403bf0523416ae1cb905547204afb2632b18e6 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 15 Sep 2025 15:42:30 +0200 Subject: [PATCH 003/109] ptr correction --- .../com/dat3m/dartagnan/program/processing/Intrinsics.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index dc24ef2ef7..9bd335cddc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -1609,8 +1609,8 @@ private List inlineMemCpy(FunctionCall call) { final int typeSize = detectMixedSizeAccesses ? count : 1; for (int i = 0; i < count; i += typeSize) { final Expression offset = expressions.makeValue(i, types.getArchType()); - final Expression srcAddr = expressions.makeAdd(src, offset); - final Expression destAddr = expressions.makeAdd(dest, offset); + final Expression srcAddr = expressions.makePtrAdd(src, offset); + final Expression destAddr = expressions.makePtrAdd(dest, offset); final Register reg = caller.getOrNewRegister("__memcpy_" + i, type); final Event load = EventFactory.newLoad(reg, srcAddr); From 2924849192e2b8004458a4566c205184f6aab5b0 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 15 Sep 2025 18:01:20 +0200 Subject: [PATCH 004/109] fixed ptr to int wrong length --- .../dartagnan/encoding/ExpressionEncoder.java | 22 +++++++++++++++---- .../expression/pointer/PtrToIntCast.java | 4 ++-- .../expression/type/PointerType.java | 9 -------- .../program/processing/Intrinsics.java | 1 + 4 files changed, 21 insertions(+), 15 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index bf205c540e..6c3868a119 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -345,7 +345,6 @@ public TypedFormula visitBoolUnaryExpression(BoolUn public TypedFormula visitIntSizeCastExpression(IntSizeCast expr) { final TypedFormula inner = encodeIntegerExpr(expr.getOperand()); final Formula enc; - if (expr.isNoop()) { return inner; } else if (context.useIntegers) { @@ -358,7 +357,6 @@ public TypedFormula visitBoolUnaryExpression(BoolUn } } else { assert inner.formula() instanceof BitvectorFormula; - final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); final int targetBitWidth = expr.getTargetType().getBitWidth(); @@ -531,13 +529,29 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitPtrToIntCastExpression(PtrToIntCast expr) { - final TypedFormula ptr = encodePointerExpr(expr.getOperand()); - return new TypedFormula<>(expr.getType(), ptr.formula()); + // Todo: add support for extension + final TypedFormula inner = encodePointerExpr(expr.getOperand()); + final Formula enc; + if (context.useIntegers) { + final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); + final IntegerFormulaManager imgr = integerFormulaManager(); + enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue)); + } else { + assert inner.formula() instanceof BitvectorFormula; + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); + final int targetBitWidth = expr.getTargetType().getBitWidth(); + final int sourceBitWidth = types.getArchType().getBitWidth(); + assert (sourceBitWidth == bvmgr.getLength(innerBv)); + enc = bvmgr.extract(innerBv, targetBitWidth - 1, 0); + } + return new TypedFormula<>(expr.getType(), enc); } @Override public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { + final TypedFormula address = encodeIntegerExpr(expr.getOperand()); return new TypedFormula<>(expr.getType(), address.formula()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java index 97a30b1e59..82a370ef63 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java @@ -9,8 +9,8 @@ public final class PtrToIntCast extends CastExpressionBase { - public PtrToIntCast(IntegerType archType, Expression operand) { - super(archType, operand); + public PtrToIntCast(IntegerType integerType, Expression operand) { + super(integerType, operand); ExpressionHelper.checkExpectedType(operand, PointerType.class); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index af5f543629..67513c88b0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -3,18 +3,9 @@ import com.dat3m.dartagnan.expression.Type; public class PointerType implements Type { - private int stride; - private Type referredType; PointerType() {} - - public int getStride(){ return stride; }; - public void setStride(int s){ stride = s;}; - - public Type getReferredType(){ return referredType; } - public void setReferredType(Type t){ referredType = t;}; - @Override public String toString() { return "ptr"; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index 9bd335cddc..f222dc21d2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -712,6 +712,7 @@ private List inlinePthreadKeyCreate(FunctionCall call) { final Expression destructor = call.getArguments().get(1); final Program program = call.getFunction().getProgram(); final long threadCount = program.getThreads().size(); + final int pointerBytes = types.getMemorySizeInBytes(types.getPointerType()); final Register storageAddressRegister = call.getFunction().newRegister(types.getArchType()); final Expression size = expressions.makeValue((threadCount + 1) * pointerBytes, types.getArchType()); From 8515febe3e23620d47085cef43ba215b66b22308 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Fri, 19 Sep 2025 13:34:56 +0200 Subject: [PATCH 005/109] more fixes related to arch and ptr --- .../dat3m/dartagnan/expression/type/TypeFactory.java | 3 +-- .../parsers/program/utils/ProgramBuilder.java | 4 ++-- .../program/visitors/VisitorLitmusAArch64.java | 2 +- .../parsers/program/visitors/VisitorLitmusC.java | 11 ++++++++--- .../parsers/program/visitors/VisitorLitmusPPC.java | 2 +- .../parsers/program/visitors/VisitorLitmusPTX.java | 3 +-- .../parsers/program/visitors/VisitorLitmusRISCV.java | 2 +- .../parsers/program/visitors/VisitorLitmusVulkan.java | 2 +- .../parsers/program/visitors/VisitorLitmusX86.java | 2 +- 9 files changed, 17 insertions(+), 14 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 1c5694fa2e..905ddb2168 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -22,11 +22,10 @@ public final class TypeFactory { private final BooleanType booleanType = new BooleanType(); private final IntegerType archType; private final PointerType pointerType = new PointerType(); - private final Normalizer typeNormalizer = new Normalizer(); private TypeFactory() { - archType = getIntegerType(64);//TODO insert proper pointer and difference types + archType = getIntegerType(64); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java index 880eb08671..292dbd995c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java @@ -242,9 +242,9 @@ public void initLocEqConst(String locName, Expression iValue){ getOrNewMemoryObject(locName).setInitialValue(0, iValue); } - public void initRegEqLocPtr(int regThread, String regName, String locName, Type type) { + public void initRegEqLocPtr(int regThread, String regName, String locName) { MemoryObject object = getOrNewMemoryObject(locName); - Register reg = getOrNewRegister(regThread, regName, type); + Register reg = getOrNewRegister(regThread, regName, types.getPointerType()); addChild(regThread, EventFactory.newLocal(reg, object)); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java index 3f743fee51..820f69b129 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java @@ -108,7 +108,7 @@ public Object visitTypedRegisterDeclarator(TypedRegisterDeclaratorContext ctx) { @Override public Object visitVariableDeclaratorRegisterLocation(VariableDeclaratorRegisterLocationContext ctx) { - programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register64().id, ctx.location().getText(), i64); + programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register64().id, ctx.location().getText()); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 1b9df82763..be67a46f6c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.integers.IntLiteral; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.LitmusCBaseVisitor; import com.dat3m.dartagnan.parsers.LitmusCParser; @@ -29,6 +30,7 @@ public class VisitorLitmusC extends LitmusCBaseVisitor { private final ProgramBuilder programBuilder = ProgramBuilder.forLanguage(Program.SourceLanguage.LITMUS); private final ExpressionFactory expressions = programBuilder.getExpressionFactory(); private final IntegerType archType = programBuilder.getTypeFactory().getArchType(); + private final PointerType pointerType = programBuilder.getTypeFactory().getPointerType(); private final int archSize = TypeFactory.getInstance().getMemorySizeInBytes(archType); private int currentThread; private int scope; @@ -102,7 +104,7 @@ public Object visitGlobalDeclaratorLocationLocation(LitmusCParser.GlobalDeclarat public Object visitGlobalDeclaratorRegisterLocation(LitmusCParser.GlobalDeclaratorRegisterLocationContext ctx) { // FIXME: We visit declarators before threads, so we need to create threads early if(ctx.Ast() == null){ - programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.varName(0).getText(), ctx.varName(1).getText(), archType); + programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.varName(0).getText(), ctx.varName(1).getText()); } else { String rightName = ctx.varName(1).getText(); MemoryObject object = programBuilder.getMemoryObject(rightName); @@ -196,7 +198,7 @@ public Object visitThreadArgument(LitmusCParser.ThreadArgumentContext ctx) { // For now, herd7 also seems to ignore most modifiers, in particular the atomic one. String name = ctx.varName().getText(); MemoryObject object = programBuilder.getOrNewMemoryObject(name); - Register register = programBuilder.getOrNewRegister(scope, name, archType); + Register register = programBuilder.getOrNewRegister(scope, name, pointerType); boolean atomicity = ctx.pointerTypeSpecifier().atomicTypeSpecifier() != null || ctx.pointerTypeSpecifier().basicTypeSpecifier().AtomicInt() != null; if (!atomicity) { @@ -689,7 +691,10 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ private Expression getAddress(LitmusCParser.ReContext ctx){ Expression address = (Expression)ctx.accept(this); if(address.getType() instanceof IntegerType){ - return address; + return address; //todo: remove + } + if(address.getType() instanceof PointerType){ + return address; } throw new ParsingException("Invalid syntax near " + ctx.getText()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java index 2fe6be4258..6dc700bb5e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java @@ -70,7 +70,7 @@ public Object visitVariableDeclaratorRegister(LitmusPPCParser.VariableDeclarator @Override public Object visitVariableDeclaratorRegisterLocation(LitmusPPCParser.VariableDeclaratorRegisterLocationContext ctx) { - programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText(), archType); + programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText()); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java index 2f7da8d178..806ccde72c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java @@ -67,8 +67,7 @@ public Object visitVariableDeclaratorRegister(LitmusPTXParser.VariableDeclarator @Override public Object visitVariableDeclaratorRegisterLocation(LitmusPTXParser.VariableDeclaratorRegisterLocationContext ctx) { - programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText(), - archType); + programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText()); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java index 92568decfd..7fc60ae5a8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java @@ -65,7 +65,7 @@ public Object visitVariableDeclaratorRegister(LitmusRISCVParser.VariableDeclarat @Override public Object visitVariableDeclaratorRegisterLocation(LitmusRISCVParser.VariableDeclaratorRegisterLocationContext ctx) { - programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText(), archType); + programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText()); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java index b26aa5bdd9..a7019f2c82 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java @@ -69,7 +69,7 @@ public Object visitVariableDeclaratorRegister(LitmusVulkanParser.VariableDeclara @Override public Object visitVariableDeclaratorRegisterLocation(LitmusVulkanParser.VariableDeclaratorRegisterLocationContext ctx) { - programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText(), archType); + programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText()); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java index dfd674dbfb..f84d804ddf 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java @@ -63,7 +63,7 @@ public Object visitVariableDeclaratorRegister(LitmusX86Parser.VariableDeclarator @Override public Object visitVariableDeclaratorRegisterLocation(LitmusX86Parser.VariableDeclaratorRegisterLocationContext ctx) { - programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText(), archType); + programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.register().getText(), ctx.location().getText()); return null; } From 64d1750b7a9fceb94fe82bafcabe319d57ef0a7f Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Fri, 19 Sep 2025 16:47:04 +0200 Subject: [PATCH 006/109] more fixes and added PtrLiteral --- .../dartagnan/encoding/ExpressionEncoder.java | 7 ++++ .../expression/ExpressionFactory.java | 5 +++ .../expression/ExpressionVisitor.java | 2 +- .../expression/pointer/PointerLiteral.java | 39 +++++++++++++++++++ .../program/processing/MemToReg.java | 3 +- .../processing/NaiveDevirtualisation.java | 17 ++++---- .../program/processing/ThreadCreation.java | 15 ++++--- 7 files changed, 72 insertions(+), 16 deletions(-) create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 6c3868a119..43630a589a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -507,6 +507,13 @@ public TypedFormula visitIntCmpExpression(IntCmpExp // ==================================================================================== // Pointers + @Override + public TypedFormula visitPtrLiteral(PointerLiteral literal) { + final Formula result = context.useIntegers + ? integerFormulaManager().makeNumber(literal.getValue()) + : bitvectorFormulaManager().makeBitvector(types.getArchType().getBitWidth(), literal.getValue()); + return new TypedFormula<>(literal.getType(), result); + } @Override public TypedFormula visitPointerAddExpression(PointerAddExpr expr) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index c40699e884..d3752c082d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -317,6 +317,10 @@ public Expression makeAggregateCmp(Expression x, AggregateCmpOp op, Expression y // ----------------------------------------------------------------------------------------------------------------- // Pointers + public PointerLiteral makeValue(BigInteger value, PointerType type) { + return new PointerLiteral(type, value); + } + public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets) { Preconditions.checkArgument(base.getType().equals(types.getPointerType()), "Applying offsets to non-pointer expression."); @@ -360,6 +364,7 @@ public Expression makeIntToPtrCast(Expression operand) { return new IntToPtrCast(types.getPointerType(), operand); } + public Expression makeNullLiteral(PointerType pointerType) { return new NullLiteral(pointerType); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index cd7c728fc0..2d40c695dd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -63,6 +63,7 @@ public interface ExpressionVisitor { default TRet visitPtrToIntCastExpression(PtrToIntCast expr) { return visitCastExpression(expr); } default TRet visitPtrCmpExpression(PtrCmpExpr expr) { return visitBinaryExpression(expr); } default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } + default TRet visitPtrLiteral(PointerLiteral lit) {return visitLeafExpression(lit);} // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } @@ -80,5 +81,4 @@ private static UnsupportedOperationException unsupported(Expression expr, Class< expr.getClass().getSimpleName(), clazz.getSimpleName()); return new UnsupportedOperationException(error); } - } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java new file mode 100644 index 0000000000..e668e72c0e --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java @@ -0,0 +1,39 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.LiteralExpressionBase; +import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.google.common.base.Preconditions; + +import java.math.BigInteger; + +public final class PointerLiteral extends LiteralExpressionBase { + + private final BigInteger value; + + public PointerLiteral(PointerType type, BigInteger value) { + super(type); + this.value = value; + } + + public BigInteger getValue() { + return value; + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitPtrLiteral(this); + } + + + @Override + public boolean equals(Object o) { + return this == o || o instanceof PointerLiteral val && getType().equals(val.getType()) && value.equals(val.value); + } + + @Override + public String toString() { + return String.format("%s(%s)", getType(), value); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java index 4703832749..8a54156b58 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java @@ -42,8 +42,7 @@ public class MemToReg implements FunctionProcessor { private static final TypeFactory types = TypeFactory.getInstance(); private static final ExpressionFactory expressions = ExpressionFactory.getInstance(); - private MemToReg() { - } + private MemToReg() {} public static MemToReg fromConfig(Configuration config) throws InvalidConfigurationException { return new MemToReg(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java index 44c462552f..7b91819b7c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java @@ -4,9 +4,11 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointer.PointerLiteral; import com.dat3m.dartagnan.expression.processing.ExprTransformer; import com.dat3m.dartagnan.expression.processing.ExpressionInspector; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; @@ -24,6 +26,7 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.math.BigInteger; import java.util.*; import java.util.stream.Collectors; @@ -97,12 +100,12 @@ private void findAndTransformAddressTakenFunctions( } } - private boolean assignAddressToFunction(Function func, Map func2AddressMap) { - final IntegerType ptrType = TypeFactory.getInstance().getArchType(); + private boolean assignAddressToFunction(Function func, Map func2AddressMap) { + final PointerType ptrType = TypeFactory.getInstance().getPointerType(); final ExpressionFactory expressions = ExpressionFactory.getInstance(); if (!func2AddressMap.containsKey(func)) { logger.debug("Assigned address \"{}\" to function \"{}\"", nextAvailableFuncAddress, func); - func2AddressMap.put(func, expressions.makeValue(nextAvailableFuncAddress, ptrType)); + func2AddressMap.put(func, expressions.makeValue(BigInteger.valueOf(nextAvailableFuncAddress), ptrType)); nextAvailableFuncAddress += 8; return true; } @@ -119,7 +122,7 @@ private void applyTransformerToEvent(Event e, ExpressionVisitor tran } } - private void devirtualise(Function function, Map func2AddressMap) { + private void devirtualise(Function function, Map func2AddressMap) { final ExpressionFactory expressions = ExpressionFactory.getInstance(); int devirtCounter = 0; @@ -147,7 +150,7 @@ private void devirtualise(Function function, Map func2Addr final Expression funcPtr = call.getCallTarget(); // Construct call table for (Function possibleTarget : possibleTargets) { - final IntLiteral targetAddress = func2AddressMap.get(possibleTarget); + final PointerLiteral targetAddress = func2AddressMap.get(possibleTarget); final Label caseLabel = EventFactory.newLabel(String.format("__Ldevirt_%s#%s", targetAddress.getValue(), devirtCounter)); final CondJump caseJump = EventFactory.newJump(expressions.makeEQ(funcPtr, targetAddress), caseLabel); caseLabels.add(caseLabel); @@ -178,7 +181,7 @@ private boolean needsDevirtualization(CallEvent call) { return !call.isDirectCall(); } - private List getPossibleTargets(CallEvent call, Map func2AddressMap) { + private List getPossibleTargets(CallEvent call, Map func2AddressMap) { Preconditions.checkArgument(needsDevirtualization(call)); return func2AddressMap.keySet().stream() .filter(f -> f.getFunctionType() == call.getCallType()) @@ -210,7 +213,7 @@ public Expression visitFunction(Function function) { private static class FunctionToAddressTransformer extends ExprTransformer { - private final Map func2AddressMap = new HashMap<>(); + private final Map func2AddressMap = new HashMap<>(); @Override public Expression visitFunction(Function function) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java index 8ba1af9081..a6585245b2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java @@ -7,10 +7,7 @@ import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; import com.dat3m.dartagnan.expression.processing.ExprTransformer; -import com.dat3m.dartagnan.expression.type.AggregateType; -import com.dat3m.dartagnan.expression.type.FunctionType; -import com.dat3m.dartagnan.expression.type.IntegerType; -import com.dat3m.dartagnan.expression.type.TypeFactory; +import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.program.*; import com.dat3m.dartagnan.program.Thread; import com.dat3m.dartagnan.program.event.*; @@ -85,6 +82,7 @@ public class ThreadCreation implements ProgramProcessor { private final IntegerType archType = types.getArchType(); // The thread state consists of two flags: ALIVE and JOINABLE. private final IntegerType threadStateType = types.getIntegerType(2); + private final PointerType pointerType = types.getPointerType(); private ThreadCreation(Configuration config) throws InvalidConfigurationException { config.inject(this); @@ -186,7 +184,12 @@ private void resolveDynamicThreadJoin(Program program, List threadDa for (DynamicThreadJoin join : program.getThreadEvents(DynamicThreadJoin.class)) { final Thread caller = join.getThread(); - final Expression tidExpr = join.getTid(); + final Expression tidExpr_ = join.getTid(); + final Expression tidExpr = tidExpr_.getType() instanceof PointerType ? expressions.makePtrToIntCast(tidExpr_) : tidExpr_; + + + + final Register joinRegister = join.getResultRegister(); final IntegerType statusType = (IntegerType) ((AggregateType)joinRegister.getType()).getFields().get(0).type(); @@ -462,7 +465,7 @@ private void replaceThreadLocalsWithStackalloc(Memory memory, Thread thread) { final List initialization = new ArrayList<>(); for (Integer initOffset : memoryObject.getInitializedFields()) { initialization.add(EventFactory.newStore( - exprs.makeAdd(reg, exprs.makeValue(initOffset, types.getArchType())), + exprs.makePtrAdd(reg, exprs.makeValue(initOffset, types.getArchType())), memoryObject.getInitialValue(initOffset) )); } From b79736b98879f0fcf084669cee6c2364f4e8f92b Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 23 Sep 2025 15:53:09 +0200 Subject: [PATCH 007/109] visitor changes --- .../dartagnan/parsers/program/visitors/VisitorAsmArm.java | 8 +++++--- .../parsers/program/visitors/VisitorLitmusAArch64.java | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index f628fa6f45..ae56ca6b2b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -10,7 +10,9 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntCmpOp; +import com.dat3m.dartagnan.expression.pointer.PointerCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.parsers.AsmArmBaseVisitor; import com.dat3m.dartagnan.parsers.AsmArmParser; import com.dat3m.dartagnan.parsers.program.utils.AsmUtils; @@ -300,7 +302,7 @@ public Object visitBranchEqual(AsmArmParser.BranchEqualContext ctx) { @Override public Object visitBranchNotEqual(AsmArmParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - Expression expr = expressions.makeIntCmp(comparator.left(), IntCmpOp.NEQ, comparator.right()); + Expression expr = expressions.makePtrCmp(comparator.left(), PointerCmpOp.NEQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } @@ -388,10 +390,10 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx @Override public Object visitValue(AsmArmParser.ValueContext ctx) { - checkState(expectedType instanceof IntegerType, "Expected type is not an integer type"); + checkState(expectedType instanceof IntegerType || expectedType instanceof PointerType, "Expected type is not an integer type"); String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, (IntegerType) expectedType); + return expectedType instanceof IntegerType ? expressions.makeValue(value, (IntegerType) expectedType):expressions.makeValue(value, (PointerType) expectedType); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java index 820f69b129..9e6174780b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java @@ -193,7 +193,7 @@ public Object visitLoadPair(LoadPairContext ctx) { final Register value0 = extended ? r064 : shrinkRegister(r064, ctx.rD032, false, false); final Register value1 = extended ? r164 : shrinkRegister(r164, ctx.rD132, false, false); final Expression address0 = parseAddress(ctx.address()); - final Expression address1 = expressions.makeAdd(address0, expressions.makeValue(extended ? 8 : 4, i64)); + final Expression address1 = expressions.makePtrAdd(address0, expressions.makeValue(extended ? 8 : 4, i64)); add(EventFactory.newLoad(value0, address0)); add(EventFactory.newLoad(value1, address1)); addRegister64Update(r064, value0); @@ -233,7 +233,7 @@ public Object visitStorePair(StorePairContext ctx) { final Expression value0 = expressions.makeIntegerCast(r64, type, false); final Expression value1 = expressions.makeIntegerCast(s64, type, false); final Expression address0 = parseAddress(ctx.address()); - final Expression address1 = expressions.makeAdd(address0, expressions.makeValue(extended ? 8 : 4, i64)); + final Expression address1 = expressions.makePtrAdd(address0, expressions.makeValue(extended ? 8 : 4, i64)); add(EventFactory.newStore(address0, value0)); return add(EventFactory.newStore(address1, value1)); } @@ -394,7 +394,7 @@ private Expression parseAddress(AddressContext ctx) { final Register64Context register64 = ctx.offset().register64(); final ImmediateContext imm = ctx.offset().immediate(); final Expression offset = imm == null ? parseRegister64(register32, register64) : parseValue(imm.constant(), i64); - return expressions.makeAdd(base, offset); + return expressions.makePtrAdd(base, offset); } private Register parseRegister64(Register32Context w) { From 692b89353a8ca1d3c624a587c087176447ec18ab Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 20 Oct 2025 09:45:39 +0200 Subject: [PATCH 008/109] removed intLiteral --- .../dartagnan/encoding/ExpressionEncoder.java | 7 ------ .../expression/ExpressionFactory.java | 16 ++++++++++---- .../expression/ExpressionVisitor.java | 1 - .../program/visitors/VisitorAsmArm.java | 4 ++-- .../parsers/program/visitors/VisitorLlvm.java | 2 +- .../event/core/AbstractMemoryCoreEvent.java | 2 ++ .../program/processing/Intrinsics.java | 12 +++++----- .../processing/NaiveDevirtualisation.java | 18 +++++++-------- .../program/processing/ThreadCreation.java | 22 ++++++++++--------- 9 files changed, 43 insertions(+), 41 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 43630a589a..6c3868a119 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -507,13 +507,6 @@ public TypedFormula visitIntCmpExpression(IntCmpExp // ==================================================================================== // Pointers - @Override - public TypedFormula visitPtrLiteral(PointerLiteral literal) { - final Formula result = context.useIntegers - ? integerFormulaManager().makeNumber(literal.getValue()) - : bitvectorFormulaManager().makeBitvector(types.getArchType().getBitWidth(), literal.getValue()); - return new TypedFormula<>(literal.getType(), result); - } @Override public TypedFormula visitPointerAddExpression(PointerAddExpr expr) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index d3752c082d..6a1e85d8eb 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -106,18 +106,30 @@ public IntLiteral makeValue(BigInteger value, IntegerType type) { } public Expression makeLT(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.LT : IntCmpOp.ULT, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } public Expression makeGT(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.GT : IntCmpOp.UGT, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } public Expression makeLTE(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.LTE : IntCmpOp.ULTE, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } public Expression makeGTE(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.GTE : IntCmpOp.UGTE, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } @@ -317,10 +329,6 @@ public Expression makeAggregateCmp(Expression x, AggregateCmpOp op, Expression y // ----------------------------------------------------------------------------------------------------------------- // Pointers - public PointerLiteral makeValue(BigInteger value, PointerType type) { - return new PointerLiteral(type, value); - } - public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets) { Preconditions.checkArgument(base.getType().equals(types.getPointerType()), "Applying offsets to non-pointer expression."); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 2d40c695dd..9023cb0310 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -63,7 +63,6 @@ public interface ExpressionVisitor { default TRet visitPtrToIntCastExpression(PtrToIntCast expr) { return visitCastExpression(expr); } default TRet visitPtrCmpExpression(PtrCmpExpr expr) { return visitBinaryExpression(expr); } default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } - default TRet visitPtrLiteral(PointerLiteral lit) {return visitLeafExpression(lit);} // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index ae56ca6b2b..452bae2f16 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -390,10 +390,10 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx @Override public Object visitValue(AsmArmParser.ValueContext ctx) { - checkState(expectedType instanceof IntegerType || expectedType instanceof PointerType, "Expected type is not an integer type"); + checkState(expectedType instanceof IntegerType, "Expected type is not an integer type"); String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expectedType instanceof IntegerType ? expressions.makeValue(value, (IntegerType) expectedType):expressions.makeValue(value, (PointerType) expectedType); + return expressions.makeValue(value, (IntegerType) expectedType); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index 372dbe9c16..b69facef3c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -50,7 +50,7 @@ public class VisitorLlvm extends LLVMIRBaseVisitor { private final Program program; private final TypeFactory types = TypeFactory.getInstance(); private final ExpressionFactory expressions = ExpressionFactory.getInstance(); - private final Type pointerType = types.getPointerType(); + private final PointerType pointerType = types.getPointerType(); private final IntegerType integerType = types.getArchType(); private final Map constantMap = new HashMap<>(); private final Map typeDefinitionMap = new HashMap<>(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java index a9eeb7a068..b8edaddb13 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java @@ -3,6 +3,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.event.AbstractEvent; import static com.dat3m.dartagnan.program.event.Tag.MEMORY; import static com.dat3m.dartagnan.program.event.Tag.VISIBLE; @@ -19,6 +20,7 @@ public abstract class AbstractMemoryCoreEvent extends AbstractEvent implements M protected Type accessType; public AbstractMemoryCoreEvent(Expression address, Type accessType) { + Preconditions.checkArgument(address.getType() instanceof PointerType); this.address = Preconditions.checkNotNull(address); this.accessType = accessType; addTags(VISIBLE, MEMORY); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index f222dc21d2..93f4912733 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -1654,7 +1654,7 @@ private List inlineMemCpyS(FunctionCall call) { final int destsz = destszValue.getValueAsInt(); // Runtime checks - final Expression nullExpr = expressions.makeZero(types.getArchType()); + final Expression nullExpr = expressions.makeNullLiteral(); final Expression destIsNull = expressions.makeEQ(dest, nullExpr); final Expression srcIsNull = expressions.makeEQ(src, nullExpr); @@ -1669,8 +1669,8 @@ private List inlineMemCpyS(FunctionCall call) { final Expression countGtdestszExpr = expressions.makeGT(castCountExpr, castDestszExpr, false); final Expression invalidCount = expressions.makeOr(countGtMax, countGtdestszExpr); final Expression overlap = expressions.makeAnd( - expressions.makeGT(expressions.makeAdd(src, castCountExpr), dest, false), - expressions.makeGT(expressions.makeAdd(dest, castCountExpr), src, false)); + expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(src, castCountExpr)), expressions.makePtrToIntCast(dest), false), + expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(dest, castCountExpr)), expressions.makePtrToIntCast(src), false)); final List replacement = new ArrayList<>(); @@ -1707,7 +1707,7 @@ private List inlineMemCpyS(FunctionCall call) { )); for (int i = 0; i < destsz; i++) { final Expression offset = expressions.makeValue(i, types.getArchType()); - final Expression destAddr = expressions.makeAdd(dest, offset); + final Expression destAddr = expressions.makePtrAdd(dest, offset); final Expression zero = expressions.makeZero(types.getArchType()); replacement.add( newStore(destAddr, zero) @@ -1723,8 +1723,8 @@ private List inlineMemCpyS(FunctionCall call) { replacement.add(success); for (int i = 0; i < count; i++) { final Expression offset = expressions.makeValue(i, types.getArchType()); - final Expression srcAddr = expressions.makeAdd(src, offset); - final Expression destAddr = expressions.makeAdd(dest, offset); + final Expression srcAddr = expressions.makePtrAdd(src, offset); + final Expression destAddr = expressions.makePtrAdd(dest, offset); // FIXME: We have no other choice but to load ptr-sized chunks for now final Register reg = caller.getOrNewRegister("__memcpy_" + i, types.getArchType()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java index 7b91819b7c..fcd8fc4e74 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java @@ -4,11 +4,9 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.integers.IntLiteral; -import com.dat3m.dartagnan.expression.pointer.PointerLiteral; import com.dat3m.dartagnan.expression.processing.ExprTransformer; import com.dat3m.dartagnan.expression.processing.ExpressionInspector; import com.dat3m.dartagnan.expression.type.IntegerType; -import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; @@ -100,12 +98,12 @@ private void findAndTransformAddressTakenFunctions( } } - private boolean assignAddressToFunction(Function func, Map func2AddressMap) { - final PointerType ptrType = TypeFactory.getInstance().getPointerType(); + private boolean assignAddressToFunction(Function func, Map func2AddressMap) { + final IntegerType ptrType = TypeFactory.getInstance().getArchType(); final ExpressionFactory expressions = ExpressionFactory.getInstance(); if (!func2AddressMap.containsKey(func)) { logger.debug("Assigned address \"{}\" to function \"{}\"", nextAvailableFuncAddress, func); - func2AddressMap.put(func, expressions.makeValue(BigInteger.valueOf(nextAvailableFuncAddress), ptrType)); + func2AddressMap.put(func, expressions.makeValue(BigInteger.valueOf(nextAvailableFuncAddress),ptrType)); nextAvailableFuncAddress += 8; return true; } @@ -122,7 +120,7 @@ private void applyTransformerToEvent(Event e, ExpressionVisitor tran } } - private void devirtualise(Function function, Map func2AddressMap) { + private void devirtualise(Function function, Map func2AddressMap) { final ExpressionFactory expressions = ExpressionFactory.getInstance(); int devirtCounter = 0; @@ -150,9 +148,9 @@ private void devirtualise(Function function, Map func2 final Expression funcPtr = call.getCallTarget(); // Construct call table for (Function possibleTarget : possibleTargets) { - final PointerLiteral targetAddress = func2AddressMap.get(possibleTarget); + final IntLiteral targetAddress = func2AddressMap.get(possibleTarget); final Label caseLabel = EventFactory.newLabel(String.format("__Ldevirt_%s#%s", targetAddress.getValue(), devirtCounter)); - final CondJump caseJump = EventFactory.newJump(expressions.makeEQ(funcPtr, targetAddress), caseLabel); + final CondJump caseJump = EventFactory.newJump(expressions.makeEQ(expressions.makePtrToIntCast(funcPtr), targetAddress), caseLabel); caseLabels.add(caseLabel); caseJumps.add(caseJump); } @@ -181,7 +179,7 @@ private boolean needsDevirtualization(CallEvent call) { return !call.isDirectCall(); } - private List getPossibleTargets(CallEvent call, Map func2AddressMap) { + private List getPossibleTargets(CallEvent call, Map func2AddressMap) { Preconditions.checkArgument(needsDevirtualization(call)); return func2AddressMap.keySet().stream() .filter(f -> f.getFunctionType() == call.getCallType()) @@ -213,7 +211,7 @@ public Expression visitFunction(Function function) { private static class FunctionToAddressTransformer extends ExprTransformer { - private final Map func2AddressMap = new HashMap<>(); + private final Map func2AddressMap = new HashMap<>(); @Override public Expression visitFunction(Function function) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java index a6585245b2..253db9bcd6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java @@ -187,10 +187,6 @@ private void resolveDynamicThreadJoin(Program program, List threadDa final Expression tidExpr_ = join.getTid(); final Expression tidExpr = tidExpr_.getType() instanceof PointerType ? expressions.makePtrToIntCast(tidExpr_) : tidExpr_; - - - - final Register joinRegister = join.getResultRegister(); final IntegerType statusType = (IntegerType) ((AggregateType)joinRegister.getType()).getFields().get(0).type(); final Type retValType = ((AggregateType)joinRegister.getType()).getFields().get(1).type(); @@ -342,11 +338,18 @@ private void resolvePthreadSelf(Program program) { } if (call.getCalledFunction().getIntrinsicInfo() == Intrinsics.Info.P_THREAD_SELF) { final Register resultRegister = getResultRegister(call); - assert resultRegister.getType() instanceof IntegerType; + Type regType = resultRegister.getType(); + assert regType instanceof PointerType || regType instanceof IntegerType; assert call.getArguments().isEmpty(); - final Expression tidExpr = new TIdExpr((IntegerType) resultRegister.getType(), call.getThread()); - final Local tidAssignment = newLocal(resultRegister, tidExpr); - IRHelper.replaceWithMetadata(call, tidAssignment); + if (regType instanceof PointerType) { + final Expression tidExpr = new TIdExpr(archType, call.getThread()); + final Local tidAssignment = newLocal(resultRegister, expressions.makeIntToPtrCast(tidExpr)); + IRHelper.replaceWithMetadata(call, tidAssignment); + }else { + final Expression tidExpr = new TIdExpr((IntegerType) regType, call.getThread()); + final Local tidAssignment = newLocal(resultRegister, tidExpr); + IRHelper.replaceWithMetadata(call, tidAssignment); + } } } } @@ -660,5 +663,4 @@ public T accept(ExpressionVisitor visitor) { } } - -} +} \ No newline at end of file From 2321bd808c11ae32bcdca8f95d7bb6fcb656995e Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 20 Oct 2025 09:45:39 +0200 Subject: [PATCH 009/109] removed PtrLiteral --- .../dartagnan/encoding/ExpressionEncoder.java | 7 ---- .../expression/ExpressionFactory.java | 16 ++++++-- .../expression/ExpressionVisitor.java | 1 - .../expression/pointer/PointerLiteral.java | 39 ------------------- .../program/visitors/VisitorAsmArm.java | 4 +- .../parsers/program/visitors/VisitorLlvm.java | 2 +- .../event/core/AbstractMemoryCoreEvent.java | 2 + .../program/processing/Intrinsics.java | 12 +++--- .../processing/NaiveDevirtualisation.java | 18 ++++----- .../program/processing/ThreadCreation.java | 22 ++++++----- 10 files changed, 43 insertions(+), 80 deletions(-) delete mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 43630a589a..6c3868a119 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -507,13 +507,6 @@ public TypedFormula visitIntCmpExpression(IntCmpExp // ==================================================================================== // Pointers - @Override - public TypedFormula visitPtrLiteral(PointerLiteral literal) { - final Formula result = context.useIntegers - ? integerFormulaManager().makeNumber(literal.getValue()) - : bitvectorFormulaManager().makeBitvector(types.getArchType().getBitWidth(), literal.getValue()); - return new TypedFormula<>(literal.getType(), result); - } @Override public TypedFormula visitPointerAddExpression(PointerAddExpr expr) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index d3752c082d..6a1e85d8eb 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -106,18 +106,30 @@ public IntLiteral makeValue(BigInteger value, IntegerType type) { } public Expression makeLT(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.LT : IntCmpOp.ULT, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } public Expression makeGT(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.GT : IntCmpOp.UGT, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } public Expression makeLTE(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.LTE : IntCmpOp.ULTE, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } public Expression makeGTE(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.GTE : IntCmpOp.UGTE, makePtrToIntCast(rightOperand)); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } @@ -317,10 +329,6 @@ public Expression makeAggregateCmp(Expression x, AggregateCmpOp op, Expression y // ----------------------------------------------------------------------------------------------------------------- // Pointers - public PointerLiteral makeValue(BigInteger value, PointerType type) { - return new PointerLiteral(type, value); - } - public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets) { Preconditions.checkArgument(base.getType().equals(types.getPointerType()), "Applying offsets to non-pointer expression."); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 2d40c695dd..9023cb0310 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -63,7 +63,6 @@ public interface ExpressionVisitor { default TRet visitPtrToIntCastExpression(PtrToIntCast expr) { return visitCastExpression(expr); } default TRet visitPtrCmpExpression(PtrCmpExpr expr) { return visitBinaryExpression(expr); } default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } - default TRet visitPtrLiteral(PointerLiteral lit) {return visitLeafExpression(lit);} // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java deleted file mode 100644 index e668e72c0e..0000000000 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerLiteral.java +++ /dev/null @@ -1,39 +0,0 @@ -package com.dat3m.dartagnan.expression.pointer; - -import com.dat3m.dartagnan.expression.ExpressionVisitor; -import com.dat3m.dartagnan.expression.base.LiteralExpressionBase; -import com.dat3m.dartagnan.expression.type.IntegerType; -import com.dat3m.dartagnan.expression.type.PointerType; -import com.google.common.base.Preconditions; - -import java.math.BigInteger; - -public final class PointerLiteral extends LiteralExpressionBase { - - private final BigInteger value; - - public PointerLiteral(PointerType type, BigInteger value) { - super(type); - this.value = value; - } - - public BigInteger getValue() { - return value; - } - - @Override - public T accept(ExpressionVisitor visitor) { - return visitor.visitPtrLiteral(this); - } - - - @Override - public boolean equals(Object o) { - return this == o || o instanceof PointerLiteral val && getType().equals(val.getType()) && value.equals(val.value); - } - - @Override - public String toString() { - return String.format("%s(%s)", getType(), value); - } -} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index ae56ca6b2b..452bae2f16 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -390,10 +390,10 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx @Override public Object visitValue(AsmArmParser.ValueContext ctx) { - checkState(expectedType instanceof IntegerType || expectedType instanceof PointerType, "Expected type is not an integer type"); + checkState(expectedType instanceof IntegerType, "Expected type is not an integer type"); String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expectedType instanceof IntegerType ? expressions.makeValue(value, (IntegerType) expectedType):expressions.makeValue(value, (PointerType) expectedType); + return expressions.makeValue(value, (IntegerType) expectedType); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index 372dbe9c16..b69facef3c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -50,7 +50,7 @@ public class VisitorLlvm extends LLVMIRBaseVisitor { private final Program program; private final TypeFactory types = TypeFactory.getInstance(); private final ExpressionFactory expressions = ExpressionFactory.getInstance(); - private final Type pointerType = types.getPointerType(); + private final PointerType pointerType = types.getPointerType(); private final IntegerType integerType = types.getArchType(); private final Map constantMap = new HashMap<>(); private final Map typeDefinitionMap = new HashMap<>(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java index a9eeb7a068..b8edaddb13 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java @@ -3,6 +3,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.event.AbstractEvent; import static com.dat3m.dartagnan.program.event.Tag.MEMORY; import static com.dat3m.dartagnan.program.event.Tag.VISIBLE; @@ -19,6 +20,7 @@ public abstract class AbstractMemoryCoreEvent extends AbstractEvent implements M protected Type accessType; public AbstractMemoryCoreEvent(Expression address, Type accessType) { + Preconditions.checkArgument(address.getType() instanceof PointerType); this.address = Preconditions.checkNotNull(address); this.accessType = accessType; addTags(VISIBLE, MEMORY); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index f222dc21d2..93f4912733 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -1654,7 +1654,7 @@ private List inlineMemCpyS(FunctionCall call) { final int destsz = destszValue.getValueAsInt(); // Runtime checks - final Expression nullExpr = expressions.makeZero(types.getArchType()); + final Expression nullExpr = expressions.makeNullLiteral(); final Expression destIsNull = expressions.makeEQ(dest, nullExpr); final Expression srcIsNull = expressions.makeEQ(src, nullExpr); @@ -1669,8 +1669,8 @@ private List inlineMemCpyS(FunctionCall call) { final Expression countGtdestszExpr = expressions.makeGT(castCountExpr, castDestszExpr, false); final Expression invalidCount = expressions.makeOr(countGtMax, countGtdestszExpr); final Expression overlap = expressions.makeAnd( - expressions.makeGT(expressions.makeAdd(src, castCountExpr), dest, false), - expressions.makeGT(expressions.makeAdd(dest, castCountExpr), src, false)); + expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(src, castCountExpr)), expressions.makePtrToIntCast(dest), false), + expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(dest, castCountExpr)), expressions.makePtrToIntCast(src), false)); final List replacement = new ArrayList<>(); @@ -1707,7 +1707,7 @@ private List inlineMemCpyS(FunctionCall call) { )); for (int i = 0; i < destsz; i++) { final Expression offset = expressions.makeValue(i, types.getArchType()); - final Expression destAddr = expressions.makeAdd(dest, offset); + final Expression destAddr = expressions.makePtrAdd(dest, offset); final Expression zero = expressions.makeZero(types.getArchType()); replacement.add( newStore(destAddr, zero) @@ -1723,8 +1723,8 @@ private List inlineMemCpyS(FunctionCall call) { replacement.add(success); for (int i = 0; i < count; i++) { final Expression offset = expressions.makeValue(i, types.getArchType()); - final Expression srcAddr = expressions.makeAdd(src, offset); - final Expression destAddr = expressions.makeAdd(dest, offset); + final Expression srcAddr = expressions.makePtrAdd(src, offset); + final Expression destAddr = expressions.makePtrAdd(dest, offset); // FIXME: We have no other choice but to load ptr-sized chunks for now final Register reg = caller.getOrNewRegister("__memcpy_" + i, types.getArchType()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java index 7b91819b7c..fcd8fc4e74 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java @@ -4,11 +4,9 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.integers.IntLiteral; -import com.dat3m.dartagnan.expression.pointer.PointerLiteral; import com.dat3m.dartagnan.expression.processing.ExprTransformer; import com.dat3m.dartagnan.expression.processing.ExpressionInspector; import com.dat3m.dartagnan.expression.type.IntegerType; -import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; @@ -100,12 +98,12 @@ private void findAndTransformAddressTakenFunctions( } } - private boolean assignAddressToFunction(Function func, Map func2AddressMap) { - final PointerType ptrType = TypeFactory.getInstance().getPointerType(); + private boolean assignAddressToFunction(Function func, Map func2AddressMap) { + final IntegerType ptrType = TypeFactory.getInstance().getArchType(); final ExpressionFactory expressions = ExpressionFactory.getInstance(); if (!func2AddressMap.containsKey(func)) { logger.debug("Assigned address \"{}\" to function \"{}\"", nextAvailableFuncAddress, func); - func2AddressMap.put(func, expressions.makeValue(BigInteger.valueOf(nextAvailableFuncAddress), ptrType)); + func2AddressMap.put(func, expressions.makeValue(BigInteger.valueOf(nextAvailableFuncAddress),ptrType)); nextAvailableFuncAddress += 8; return true; } @@ -122,7 +120,7 @@ private void applyTransformerToEvent(Event e, ExpressionVisitor tran } } - private void devirtualise(Function function, Map func2AddressMap) { + private void devirtualise(Function function, Map func2AddressMap) { final ExpressionFactory expressions = ExpressionFactory.getInstance(); int devirtCounter = 0; @@ -150,9 +148,9 @@ private void devirtualise(Function function, Map func2 final Expression funcPtr = call.getCallTarget(); // Construct call table for (Function possibleTarget : possibleTargets) { - final PointerLiteral targetAddress = func2AddressMap.get(possibleTarget); + final IntLiteral targetAddress = func2AddressMap.get(possibleTarget); final Label caseLabel = EventFactory.newLabel(String.format("__Ldevirt_%s#%s", targetAddress.getValue(), devirtCounter)); - final CondJump caseJump = EventFactory.newJump(expressions.makeEQ(funcPtr, targetAddress), caseLabel); + final CondJump caseJump = EventFactory.newJump(expressions.makeEQ(expressions.makePtrToIntCast(funcPtr), targetAddress), caseLabel); caseLabels.add(caseLabel); caseJumps.add(caseJump); } @@ -181,7 +179,7 @@ private boolean needsDevirtualization(CallEvent call) { return !call.isDirectCall(); } - private List getPossibleTargets(CallEvent call, Map func2AddressMap) { + private List getPossibleTargets(CallEvent call, Map func2AddressMap) { Preconditions.checkArgument(needsDevirtualization(call)); return func2AddressMap.keySet().stream() .filter(f -> f.getFunctionType() == call.getCallType()) @@ -213,7 +211,7 @@ public Expression visitFunction(Function function) { private static class FunctionToAddressTransformer extends ExprTransformer { - private final Map func2AddressMap = new HashMap<>(); + private final Map func2AddressMap = new HashMap<>(); @Override public Expression visitFunction(Function function) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java index a6585245b2..253db9bcd6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java @@ -187,10 +187,6 @@ private void resolveDynamicThreadJoin(Program program, List threadDa final Expression tidExpr_ = join.getTid(); final Expression tidExpr = tidExpr_.getType() instanceof PointerType ? expressions.makePtrToIntCast(tidExpr_) : tidExpr_; - - - - final Register joinRegister = join.getResultRegister(); final IntegerType statusType = (IntegerType) ((AggregateType)joinRegister.getType()).getFields().get(0).type(); final Type retValType = ((AggregateType)joinRegister.getType()).getFields().get(1).type(); @@ -342,11 +338,18 @@ private void resolvePthreadSelf(Program program) { } if (call.getCalledFunction().getIntrinsicInfo() == Intrinsics.Info.P_THREAD_SELF) { final Register resultRegister = getResultRegister(call); - assert resultRegister.getType() instanceof IntegerType; + Type regType = resultRegister.getType(); + assert regType instanceof PointerType || regType instanceof IntegerType; assert call.getArguments().isEmpty(); - final Expression tidExpr = new TIdExpr((IntegerType) resultRegister.getType(), call.getThread()); - final Local tidAssignment = newLocal(resultRegister, tidExpr); - IRHelper.replaceWithMetadata(call, tidAssignment); + if (regType instanceof PointerType) { + final Expression tidExpr = new TIdExpr(archType, call.getThread()); + final Local tidAssignment = newLocal(resultRegister, expressions.makeIntToPtrCast(tidExpr)); + IRHelper.replaceWithMetadata(call, tidAssignment); + }else { + final Expression tidExpr = new TIdExpr((IntegerType) regType, call.getThread()); + final Local tidAssignment = newLocal(resultRegister, tidExpr); + IRHelper.replaceWithMetadata(call, tidAssignment); + } } } } @@ -660,5 +663,4 @@ public T accept(ExpressionVisitor visitor) { } } - -} +} \ No newline at end of file From ba0401423734308ad145cf597c0163fca0e40a27 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 20 Oct 2025 11:50:52 +0200 Subject: [PATCH 010/109] fixed litmus c --- .../expression/ExpressionFactory.java | 48 ++++++++++++++----- .../visitors/VisitorLitmusAArch64.java | 3 ++ .../program/visitors/VisitorLitmusC.java | 4 +- .../parsers/program/visitors/VisitorLlvm.java | 8 ++-- .../event/core/AbstractMemoryCoreEvent.java | 1 + .../dartagnan/program/processing/Tearing.java | 30 ++++++++---- 6 files changed, 66 insertions(+), 28 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 6a1e85d8eb..3257f59bed 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -106,31 +106,35 @@ public IntLiteral makeValue(BigInteger value, IntegerType type) { } public Expression makeLT(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.LT : IntCmpOp.ULT, makePtrToIntCast(rightOperand)); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } public Expression makeGT(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.GT : IntCmpOp.UGT, makePtrToIntCast(rightOperand)); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } public Expression makeLTE(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.LTE : IntCmpOp.ULTE, makePtrToIntCast(rightOperand)); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } public Expression makeGTE(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmp(makePtrToIntCast(leftOperand), signed ? IntCmpOp.GTE : IntCmpOp.UGTE, makePtrToIntCast(rightOperand)); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); + + } + public Expression makeLTCompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); + } + + public Expression makeGTCompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); + } + + public Expression makeLTECompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); + } + + public Expression makeGTECompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } public Expression makeNeg(Expression operand) { @@ -201,10 +205,30 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } + public Expression makeIntCmpCompatibility(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmpCompatibility(makePtrToIntCast(leftOperand), operator, rightOperand); + } + if (rightOperand.getType() instanceof PointerType){ + return makeIntCmpCompatibility(leftOperand, operator, makePtrToIntCast(rightOperand)); + } + return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); + } + public Expression makeIntBinary(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { return new IntBinaryExpr(leftOperand, operator, rightOperand); } + public Expression makeIntBinaryCompatibility(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntBinaryCompatibility(makePtrToIntCast(leftOperand), operator, rightOperand); + } + if (rightOperand.getType() instanceof PointerType){ + return makeIntBinaryCompatibility(leftOperand, operator, makePtrToIntCast(rightOperand)); + } + return new IntBinaryExpr(leftOperand, operator, rightOperand); + } + public Expression makeIntegerCast(Expression operand, IntegerType targetType, boolean signed) { final Type sourceType = operand.getType(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java index 9e6174780b..ce658a9865 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.integers.IntLiteral; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.LitmusAArch64BaseVisitor; import com.dat3m.dartagnan.parsers.LitmusAArch64Parser.*; @@ -36,6 +37,7 @@ private record CmpInstruction(Expression left, Expression right) {} private final IntegerType i16 = types.getIntegerType(16); private final IntegerType i32 = types.getIntegerType(32); private final IntegerType i64 = types.getIntegerType(64); + private final PointerType pointerType = types.getPointerType(); private final ExpressionFactory expressions = programBuilder.getExpressionFactory(); private int mainThread; private int threadCount = 0; @@ -428,6 +430,7 @@ private IntLiteral parseValue(ConstantContext ctx, IntegerType type) { return expressions.parseValue(ctx.getText(), type); } + private Register shrinkRegister(Register other, Register32Context ctx, boolean halfWordSize, boolean byteSize) { checkArgument(other.getType().equals(i64), "Non-64-bit %s", other); checkArgument(!byteSize | !halfWordSize, "Inconclusive access size"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index be67a46f6c..821b58549e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -467,7 +467,7 @@ public Expression visitReOpArith(LitmusCParser.ReOpArithContext ctx){ Register register = getReturnRegister(false); Expression v1 = (Expression)ctx.re(0).accept(this); Expression v2 = (Expression)ctx.re(1).accept(this); - Expression result = expressions.makeIntBinary(v1, ctx.opArith().op, v2); + Expression result = expressions.makeIntBinaryCompatibility(v1, ctx.opArith().op, v2); return assignToReturnRegister(register, result); } @@ -691,7 +691,7 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ private Expression getAddress(LitmusCParser.ReContext ctx){ Expression address = (Expression)ctx.accept(this); if(address.getType() instanceof IntegerType){ - return address; //todo: remove + return expressions.makeIntToPtrCast(address); } if(address.getType() instanceof PointerType){ return address; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index b69facef3c..7fc778c6a9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -587,10 +587,10 @@ public Expression visitICmpInst(ICmpInstContext ctx) { final Expression compared = switch (operator) { case "eq" -> expressions.makeEQ(left, right); case "ne" -> expressions.makeNEQ(left, right); - case "slt", "ult" -> expressions.makeLT(left, right, operator.startsWith("s")); - case "sle", "ule" -> expressions.makeLTE(left, right, operator.startsWith("s")); - case "sgt", "ugt" -> expressions.makeGT(left, right, operator.startsWith("s")); - case "sge", "uge" -> expressions.makeGTE(left, right, operator.startsWith("s")); + case "slt", "ult" -> expressions.makeLTCompatibility(left, right, operator.startsWith("s")); + case "sle", "ule" -> expressions.makeLTECompatibility(left, right, operator.startsWith("s")); + case "sgt", "ugt" -> expressions.makeGTCompatibility(left, right, operator.startsWith("s")); + case "sge", "uge" -> expressions.makeGTECompatibility(left, right, operator.startsWith("s")); default -> throw new ParsingException(String.format("Unknown predicate in %s.", ctx.getText())); }; // LLVM does not support a distinct boolean type. diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java index b8edaddb13..bd31609488 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.AbstractEvent; import static com.dat3m.dartagnan.program.event.Tag.MEMORY; import static com.dat3m.dartagnan.program.event.Tag.VISIBLE; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index 31d190f021..ca4491fcc7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.processing.ExprTransformer; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; @@ -173,9 +174,9 @@ private void tearExpressions(Program program) { private List createTransaction(Load load, List offsets) { final int bytes = checkBytes(load, offsets); final List replacement = new ArrayList<>(); - final IntegerType addressType = checkIntegerType(load.getAddress().getType(), - "Non-integer address in '%s'", load); - checkIntegerType(load.getAccessType(), "Non-integer mixed-size access in '%s'", load); + final PointerType addressType = checkPointerType(load.getAddress().getType(), + "Non-Pointer address in '%s'", load); + checkType(load.getAccessType(), "Non-integer or Pointer mixed-size access in '%s'", load); final Function function = load.getFunction(); final Register addressRegister = toRegister(load.getAddress(), function, replacement); final List smallerRegisters = new ArrayList<>(); @@ -192,8 +193,8 @@ private List createTransaction(Load load, List offsets) { } for (int i = -1; i < offsets.size(); i++) { final int start = i < 0 ? 0 : offsets.get(i); - final Expression offset = expressions.makeValue(start, addressType); - final Expression address = expressions.makeAdd(addressRegister, offset); + final Expression offset = expressions.makeValue(start, types.getArchType()); + final Expression address = expressions.makePtrAdd(addressRegister, offset); final Load byteLoad = load.getCopy(); final Register result = smallerRegisters.get(i + 1); byteLoad.setResultRegister(result); @@ -214,9 +215,9 @@ private List createTransaction(Load load, List offsets) { private List createTransaction(Store store, List offsets, Map> map, boolean bigEndian) { final int bytes = checkBytes(store, offsets); final List replacement = new ArrayList<>(); - final IntegerType addressType = checkIntegerType(store.getAddress().getType(), - "Non-integer address in '%s'", store); - checkIntegerType(store.getAccessType(), "Non-integer mixed-size access in '%s'", store); + final PointerType addressType = checkPointerType(store.getAddress().getType(), + "Non-Pointer address in '%s'", store); + checkType(store.getAccessType(), "Non-integer or Pointer mixed-size access in '%s'", store); final Function function = store.getFunction(); final Register addressRegister = toRegister(store.getAddress(), function, replacement); final Register valueRegister = toRegister(store.getMemValue(), function, replacement); @@ -231,7 +232,7 @@ private List createTransaction(Store store, List offsets, Map createTransaction(Store store, List offsets, Map Date: Mon, 20 Oct 2025 17:54:12 +0200 Subject: [PATCH 011/109] more fixes --- .../expression/ExpressionFactory.java | 28 +++++++++---------- .../program/visitors/VisitorLitmusC.java | 4 +-- .../parsers/program/visitors/VisitorLlvm.java | 8 +++--- .../event/core/AbstractMemoryCoreEvent.java | 2 +- .../others/miscellaneous/AnalysisTest.java | 2 +- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 3257f59bed..01c12bf850 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -121,20 +121,20 @@ public Expression makeGTE(Expression leftOperand, Expression rightOperand, boole return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } - public Expression makeLTCompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); + public Expression makeLTforced(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpForced(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } - public Expression makeGTCompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); + public Expression makeGTforced(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpForced(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } - public Expression makeLTECompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); + public Expression makeLTEforced(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpForced(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } - public Expression makeGTECompatibility(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpCompatibility(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); + public Expression makeGTEforced(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpForced(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } public Expression makeNeg(Expression operand) { @@ -205,12 +205,12 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } - public Expression makeIntCmpCompatibility(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { + public Expression makeIntCmpForced(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpCompatibility(makePtrToIntCast(leftOperand), operator, rightOperand); + return makeIntCmpForced(makePtrToIntCast(leftOperand), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntCmpCompatibility(leftOperand, operator, makePtrToIntCast(rightOperand)); + return makeIntCmpForced(leftOperand, operator, makePtrToIntCast(rightOperand)); } return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } @@ -219,12 +219,12 @@ public Expression makeIntBinary(Expression leftOperand, IntBinaryOp operator, Ex return new IntBinaryExpr(leftOperand, operator, rightOperand); } - public Expression makeIntBinaryCompatibility(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { + public Expression makeIntBinaryForced(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntBinaryCompatibility(makePtrToIntCast(leftOperand), operator, rightOperand); + return makeIntBinaryForced(makePtrToIntCast(leftOperand), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntBinaryCompatibility(leftOperand, operator, makePtrToIntCast(rightOperand)); + return makeIntBinaryForced(leftOperand, operator, makePtrToIntCast(rightOperand)); } return new IntBinaryExpr(leftOperand, operator, rightOperand); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 821b58549e..810c8928a4 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -458,7 +458,7 @@ public Expression visitReOpCompare(LitmusCParser.ReOpCompareContext ctx){ Register register = getReturnRegister(false); Expression v1 = (Expression)ctx.re(0).accept(this); Expression v2 = (Expression)ctx.re(1).accept(this); - Expression result = expressions.makeIntCmp(v1, ctx.opCompare().op, v2); + Expression result = expressions.makeIntCmpForced(v1, ctx.opCompare().op, v2); return assignToReturnRegister(register, result); } @@ -467,7 +467,7 @@ public Expression visitReOpArith(LitmusCParser.ReOpArithContext ctx){ Register register = getReturnRegister(false); Expression v1 = (Expression)ctx.re(0).accept(this); Expression v2 = (Expression)ctx.re(1).accept(this); - Expression result = expressions.makeIntBinaryCompatibility(v1, ctx.opArith().op, v2); + Expression result = expressions.makeIntBinaryForced(v1, ctx.opArith().op, v2); return assignToReturnRegister(register, result); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index 7fc778c6a9..cc5805d572 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -587,10 +587,10 @@ public Expression visitICmpInst(ICmpInstContext ctx) { final Expression compared = switch (operator) { case "eq" -> expressions.makeEQ(left, right); case "ne" -> expressions.makeNEQ(left, right); - case "slt", "ult" -> expressions.makeLTCompatibility(left, right, operator.startsWith("s")); - case "sle", "ule" -> expressions.makeLTECompatibility(left, right, operator.startsWith("s")); - case "sgt", "ugt" -> expressions.makeGTCompatibility(left, right, operator.startsWith("s")); - case "sge", "uge" -> expressions.makeGTECompatibility(left, right, operator.startsWith("s")); + case "slt", "ult" -> expressions.makeLTforced(left, right, operator.startsWith("s")); + case "sle", "ule" -> expressions.makeLTEforced(left, right, operator.startsWith("s")); + case "sgt", "ugt" -> expressions.makeGTforced(left, right, operator.startsWith("s")); + case "sge", "uge" -> expressions.makeGTEforced(left, right, operator.startsWith("s")); default -> throw new ParsingException(String.format("Unknown predicate in %s.", ctx.getText())); }; // LLVM does not support a distinct boolean type. diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java index bd31609488..3cab8ec083 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java @@ -21,7 +21,7 @@ public abstract class AbstractMemoryCoreEvent extends AbstractEvent implements M protected Type accessType; public AbstractMemoryCoreEvent(Expression address, Type accessType) { - Preconditions.checkArgument(address.getType() instanceof PointerType); + // Preconditions.checkArgument(address.getType() instanceof PointerType); // address can be a register this.address = Preconditions.checkNotNull(address); this.accessType = accessType; addTags(VISIBLE, MEMORY); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java index 28c654bd66..f441869e59 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java @@ -593,7 +593,7 @@ public void fullPropagation1() throws InvalidConfigurationException { Load e0 = newLoad(r0, y); // reads x b.addChild(0, e0); Label l0 = newLabel("l0"); - b.addChild(0, newJump(expressions.makeEQ(r0, x), l0)); + b.addChild(0, newJump(expressions.makeEQ(r0, expressions.makePtrToIntCast(x)), l0)); Load e1 = newLoad(r0, x); // reads y b.addChild(0, e1); b.addChild(0, l0); From b89319605c081235a145b63836ee8793ff8edb90 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 27 Oct 2025 09:02:28 +0100 Subject: [PATCH 012/109] Pointer size and visitor fixes --- .../expression/ExpressionFactory.java | 11 +++++++++++ .../dartagnan/expression/type/PointerType.java | 9 ++++++++- .../dartagnan/expression/type/TypeFactory.java | 8 +++++++- .../program/visitors/VisitorLitmusAArch64.java | 4 ++-- .../program/visitors/VisitorLitmusC.java | 2 +- .../program/visitors/VisitorLitmusPPC.java | 4 ++-- .../event/common/SingleAccessMemoryEvent.java | 2 ++ .../event/core/AbstractMemoryCoreEvent.java | 2 +- .../dartagnan/program/processing/Inlining.java | 18 +++++++++++++++++- 9 files changed, 51 insertions(+), 9 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 01c12bf850..47b6134414 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -383,6 +383,16 @@ public Expression makePtrAdd(Expression base, Expression offset) { return new PointerAddExpr(base, offset); } + public Expression makePtrCast(Expression base,PointerType type){ + if (base.getType() instanceof PointerType ) { + return base; + } + if (base.getType() instanceof IntegerType) { + return makeIntToPtrCast(makeCast(base, types.getArchType())); + } + throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); + } + public Expression makePtrToIntCast(Expression pointer) { return new PtrToIntCast(types.getArchType(), pointer); @@ -397,6 +407,7 @@ public Expression makeIntToPtrCast(Expression operand) { } + public Expression makeNullLiteral(PointerType pointerType) { return new NullLiteral(pointerType); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index 67513c88b0..6c62ac306b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -4,11 +4,18 @@ public class PointerType implements Type { + public int size = 64; + PointerType() {} + PointerType(int size) { + this.size = size; + } + + @Override public String toString() { - return "ptr"; + return "ptr_"+ size; } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 905ddb2168..b12ad68591 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -21,11 +21,12 @@ public final class TypeFactory { private final VoidType voidType = new VoidType(); private final BooleanType booleanType = new BooleanType(); private final IntegerType archType; - private final PointerType pointerType = new PointerType(); + private final PointerType pointerType; private final Normalizer typeNormalizer = new Normalizer(); private TypeFactory() { archType = getIntegerType(64); + pointerType = getPointerType(64); } @@ -43,6 +44,11 @@ public BooleanType getBooleanType() { public PointerType getPointerType() { return pointerType; } + public PointerType getPointerType(int bitWidth) { + // to be used in tearing + checkArgument(bitWidth > 0, "Non-positive bit width %s.", bitWidth); + return typeNormalizer.normalize(new PointerType(bitWidth)); + } public IntegerType getIntegerType(int bitWidth) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java index ce658a9865..19ef9b902a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java @@ -182,7 +182,7 @@ public Object visitLoad(LoadContext ctx) { final Register register = shrinkRegister(r64, ctx.rD32, inst.halfWordSize, inst.byteSize); final Expression address = parseAddress(ctx.address()); final String mo = inst.acquire ? MO_ACQ : ""; - add(EventFactory.newLoadWithMo(register, address, mo)); + add(EventFactory.newLoadWithMo(register, expressions.makePtrCast(address,pointerType), mo)); addRegister64Update(r64, register); return null; } @@ -389,7 +389,7 @@ private Expression parseExpression(Expr32Context x32, Expr64Context x64) { private Expression parseAddress(AddressContext ctx) { final Register base = programBuilder.getOrErrorRegister(mainThread, ctx.register64().id); if (ctx.offset() == null) { - return base; + return expressions.makePtrCast(base,pointerType); } final ExpressionConversionContext conversion = ctx.offset().expressionConversion(); final Register32Context register32 = conversion == null ? null : conversion.register32(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 810c8928a4..83a27d6597 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -587,7 +587,7 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ Expression value = (Expression)ctx.re().accept(this); if(variable instanceof MemoryObject || variable instanceof Register){ - Event event = EventFactory.newStoreWithMo(variable, value, C11.NONATOMIC); + Event event = EventFactory.newStoreWithMo(variable, expressions.makePtrCast(value,pointerType), C11.NONATOMIC); if (isOpenCL) { event.addTags(Tag.OpenCL.DEFAULT_WEAK_SCOPE); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java index 6dc700bb5e..e73114b282 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java @@ -131,7 +131,7 @@ public Object visitLwarx(LitmusPPCParser.LwarxContext ctx) { Register r1 = (Register) ctx.register(0).accept(this); Register ra = (Register) ctx.register(1).accept(this); Register rb = (Register) ctx.register(2).accept(this); - return programBuilder.addChild(mainThread, EventFactory.newRMWLoadExclusive(r1, expressions.makeAdd(ra, rb))); + return programBuilder.addChild(mainThread, EventFactory.newRMWLoadExclusive(r1, expressions.makePtrAdd(rb, ra))); } @Override @@ -156,7 +156,7 @@ public Object visitStwcx(LitmusPPCParser.StwcxContext ctx) { Register r1 = (Register) ctx.register(0).accept(this); Register ra = (Register) ctx.register(1).accept(this); Register rb = (Register) ctx.register(2).accept(this); - return programBuilder.addChild(mainThread, EventFactory.Common.newExclusiveStore(rs, expressions.makeAdd(ra, rb), r1, "")); + return programBuilder.addChild(mainThread, EventFactory.Common.newExclusiveStore(rs, expressions.makePtrAdd(rb, ra), r1, "")); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java index 5ebb7129f5..f9d07e5e0c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java @@ -3,6 +3,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.event.AbstractEvent; import com.dat3m.dartagnan.program.event.MemoryAccess; import com.dat3m.dartagnan.program.event.MemoryEvent; @@ -32,6 +33,7 @@ public abstract class SingleAccessMemoryEvent extends AbstractEvent implements M // The empty string means no memory order public SingleAccessMemoryEvent(Expression address, Type accessType, String mo) { Preconditions.checkNotNull(mo, "The memory ordering cannot be null"); + Preconditions.checkArgument(address.getType() instanceof PointerType); this.address = address; this.mo = mo; this.accessType = accessType; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java index 3cab8ec083..bd31609488 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java @@ -21,7 +21,7 @@ public abstract class AbstractMemoryCoreEvent extends AbstractEvent implements M protected Type accessType; public AbstractMemoryCoreEvent(Expression address, Type accessType) { - // Preconditions.checkArgument(address.getType() instanceof PointerType); // address can be a register + Preconditions.checkArgument(address.getType() instanceof PointerType); this.address = Preconditions.checkNotNull(address); this.accessType = accessType; addTags(VISIBLE, MEMORY); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java index 33d4717860..7f89b95a3b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java @@ -2,10 +2,14 @@ import com.dat3m.dartagnan.exception.MalformedProgramException; import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Thread; import com.dat3m.dartagnan.program.*; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.EventFactory; +import com.dat3m.dartagnan.expression.ExpressionFactory; + import com.dat3m.dartagnan.program.event.Tag; import com.dat3m.dartagnan.program.event.core.ControlBarrier; import com.dat3m.dartagnan.program.event.core.Label; @@ -29,6 +33,8 @@ import static com.dat3m.dartagnan.program.event.EventFactory.*; import static com.google.common.base.Verify.verify; + + @Options public class Inlining implements ProgramProcessor { @@ -37,6 +43,9 @@ public class Inlining implements ProgramProcessor { secure = true) private int bound = 1; + private static final ExpressionFactory expressions = ExpressionFactory.getInstance(); + + private Inlining() {} public static Inlining fromConfig(Configuration config) throws InvalidConfigurationException { @@ -129,7 +138,14 @@ private static Event inlineBody(FunctionCall call, Snapshot callTarget, int scop final ArrayList parameterAssignments = new ArrayList<>(); for (int j = 0; j < callTarget.parameters.size(); j++) { final Register register = registerMap.get(callTarget.parameters.get(j)); - parameterAssignments.add(newLocal(register, arguments.get(j))); + if (register.getType() instanceof PointerType) { + Expression v = expressions.makePtrCast(arguments.get(j),(PointerType) register.getType()); + parameterAssignments.add(newLocal(register, v)); + }else{ + Expression v = arguments.get(j); + parameterAssignments.add(newLocal(register, v)); + } + // todo check } // --------- Inline call --------- From 9d48cb71dc6c3897ceb5d6e42a2ce8f96647d73d Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 27 Oct 2025 09:58:08 +0100 Subject: [PATCH 013/109] Vulkan modification, tests pass --- .../dartagnan/expression/ExpressionFactory.java | 4 ++-- .../dartagnan/expression/type/PointerType.java | 13 +++++++------ .../expression/type/ScopedPointerType.java | 2 +- .../program/visitors/spirv/VisitorOpsAtomic.java | 5 +++-- 4 files changed, 13 insertions(+), 11 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 47b6134414..b82e46339a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -354,7 +354,7 @@ public Expression makeAggregateCmp(Expression x, AggregateCmpOp op, Expression y // Pointers public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets) { - Preconditions.checkArgument(base.getType().equals(types.getPointerType()), + Preconditions.checkArgument(base.getType() instanceof PointerType, "Applying offsets to non-pointer expression."); return new GEPExpr(indexingType, base, offsets,null); } @@ -363,7 +363,7 @@ public Expression makeGetElementPointer(Type indexingType, Expression base, List // TODO: Stride should be a property of the pointer, not of a GEPExpr. // Refactor GEPExpr to only accept a (new) PointerType and a list of offsets. // A PointerType should have the referred type and the stride in its attributes. - Preconditions.checkArgument(base.getType().equals(types.getPointerType()), + Preconditions.checkArgument(base.getType() instanceof PointerType, "Applying offsets to non-pointer expression."); Preconditions.checkArgument(stride == null || stride >= types.getMemorySizeInBytes(indexingType), "Stride cannot be smaller than indexing type"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index 6c62ac306b..f1f41daf1a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -4,23 +4,24 @@ public class PointerType implements Type { - public int size = 64; + public int bitWidth = 64; - PointerType() {} + // todo change the encoding to recognise bitwidth - PointerType(int size) { - this.size = size; + PointerType(int bitwidth) { + this.bitWidth = bitwidth; } @Override public String toString() { - return "ptr_"+ size; + return "ptr_"+ bitWidth; } @Override public boolean equals(Object obj) { - return obj != null && obj.getClass() == this.getClass(); + return obj instanceof PointerType other + && other.bitWidth == this.bitWidth; } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java index 87125ff27a..eac26595d5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java @@ -4,7 +4,7 @@ import java.util.Objects; -public class ScopedPointerType extends IntegerType { +public class ScopedPointerType extends PointerType { private static final int ARCH_SIZE = TypeFactory.getInstance().getArchType().getBitWidth(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java index 77aaebc188..0000843193 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.integers.IntCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.parsers.SpirvBaseVisitor; import com.dat3m.dartagnan.parsers.SpirvParser; import com.dat3m.dartagnan.parsers.program.visitors.spirv.helpers.HelperTags; @@ -143,8 +144,8 @@ private Event visitOpAtomicExtremum( String scope = getScopeTag(scopeCtx.getText()); Set tags = getMemorySemanticsTags(tagsCtx.getText()); tags.add(builder.getPointerStorageClass(ptrCtx.getText())); - if (!(ptr.getType() instanceof IntegerType) || !(value.getType() instanceof IntegerType)) { - throw new ParsingException("Unexpected type at '%s' or '%s', expected integer but received '%s' and '%s'", + if (!(ptr.getType() instanceof PointerType) || !(value.getType() instanceof IntegerType)) { + throw new ParsingException("Unexpected type at '%s' or '%s', expected pointer and integer but received '%s' and '%s'", ptrCtx.getText(), valCtx.getText(), ptr.getType(), value.getType()); } SpirvRmwExtremum event = newSpirvRmwExtremum(register, ptr, kind, value, scope, tags); From 24ac314209559a5116f7e8699ddbc33d19506810 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 27 Oct 2025 10:00:17 +0100 Subject: [PATCH 014/109] Vulkan modification, all Vulkan tests pass --- .../com/dat3m/dartagnan/expression/type/PointerType.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index f1f41daf1a..667b1bb3fb 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -4,12 +4,12 @@ public class PointerType implements Type { - public int bitWidth = 64; + public int bitWidth; - // todo change the encoding to recognise bitwidth + // todo change the encoding to recognise bit width - PointerType(int bitwidth) { - this.bitWidth = bitwidth; + PointerType(int bitWidth) { + this.bitWidth = bitWidth; } From da9ee17fc040c7d245fd129530c474bb5f7d86cd Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 27 Oct 2025 10:15:27 +0100 Subject: [PATCH 015/109] opencl modification --- .../com/dat3m/dartagnan/expression/type/TypeFactory.java | 2 +- .../program/processing/transformers/MemoryTransformer.java | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index b12ad68591..2a0ec6cfc8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -275,7 +275,7 @@ public Map decomposeIntoPrimitives(Type type) { } public static boolean isStaticType(Type type) { - if (type instanceof BooleanType || type instanceof IntegerType || type instanceof FloatType) { + if (type instanceof BooleanType || type instanceof IntegerType || type instanceof PointerType || type instanceof FloatType) { return true; } if (type instanceof ArrayType aType) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java index ce5b116e13..d3580517b0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java @@ -3,6 +3,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.processing.ExprTransformer; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.ScopedPointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.program.visitors.spirv.decorations.BuiltIn; @@ -26,6 +27,7 @@ public class MemoryTransformer extends ExprTransformer { // Thread / Subgroup / Workgroup / QueueFamily / Device private static final List namePrefixes = List.of("T", "S", "W", "Q", "D"); private static final Type archType = TypeFactory.getInstance().getArchType(); + private static final Type pointerType = TypeFactory.getInstance().getPointerType(); private final Program program; private final Function function; @@ -67,8 +69,7 @@ public void setThread(Thread thread) { builtIn.setThreadId(tid); registerMapping = function.getRegisters().stream().collect( toMap(r -> r, r -> { - Type type = r.getType() instanceof ScopedPointerType ? archType : r.getType(); - return thread.getOrNewRegister(r.getName(), type); + return thread.getOrNewRegister(r.getName(),r.getType()); })); nonDetMapping = new HashMap<>(); } From 9515dad387c0bf47065ee3b2182f5eae9a09abcb Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 5 Nov 2025 09:10:16 +0100 Subject: [PATCH 016/109] dev merge --- .../dartagnan/expression/ExpressionFactory.java | 6 ++++++ .../expression/pointer/PointerAddExpr.java | 3 ++- .../dat3m/dartagnan/parsers/cat/VisitorCat.java | 5 +++++ .../parsers/program/visitors/VisitorAsmArm.java | 17 ++++++++++++----- .../program/visitors/VisitorAsmRISCV.java | 13 ++++++++++--- .../program/visitors/VisitorLitmusC.java | 13 +++++++------ 6 files changed, 42 insertions(+), 15 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index b82e46339a..e4292d1cdc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -78,6 +78,8 @@ public Expression makeBooleanCast(Expression operand) { return operand; } else if (sourceType instanceof IntegerType intType) { return makeNEQ(operand, makeZero(intType)); + }else if (sourceType instanceof PointerType) { + return makeBooleanCast(makePtrToIntCast(operand)); } throw new UnsupportedOperationException(String.format("Cannot cast %s to %s.", sourceType, booleanType)); } @@ -97,6 +99,10 @@ public IntLiteral parseValue(String text, IntegerType type) { return makeValue(new BigInteger(text), type); } + public IntLiteral makeValue(BigInteger value) { + return new IntLiteral(types.getArchType(), value); + } + public IntLiteral makeValue(long value, IntegerType type) { return makeValue(BigInteger.valueOf(value), type); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java index 0fee5afe20..9e5c01f19c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.expression.ExpressionKind; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.base.ExpressionBase; +import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.google.common.base.Preconditions; @@ -16,7 +17,7 @@ public class PointerAddExpr extends ExpressionBase { public PointerAddExpr(Expression base, Expression offset) { super((PointerType) base.getType()); - Preconditions.checkArgument(offset.getType().equals(TypeFactory.getInstance().getArchType())); + Preconditions.checkArgument(offset.getType() instanceof IntegerType); this.base = base; this.offset = offset; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java index 5c99029a99..5b53603b44 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java @@ -30,6 +30,11 @@ import static com.dat3m.dartagnan.program.event.Tag.VISIBLE; import static com.dat3m.dartagnan.wmm.RelationNameRepository.ID; +import com.dat3m.dartagnan.parsers.CatParser.*; +import com.dat3m.dartagnan.wmm.definition.*; +import org.antlr.v4.runtime.*; +import java.util.*; + class VisitorCat extends CatBaseVisitor { private static final Logger logger = LogManager.getLogger(VisitorCat.class); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index 452bae2f16..bbdaf7104f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -302,7 +302,8 @@ public Object visitBranchEqual(AsmArmParser.BranchEqualContext ctx) { @Override public Object visitBranchNotEqual(AsmArmParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - Expression expr = expressions.makePtrCmp(comparator.left(), PointerCmpOp.NEQ, comparator.right()); + // todo remove forced ptr to int + Expression expr = expressions.makeIntCmpForced(comparator.left(), IntCmpOp.NEQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } @@ -390,10 +391,16 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx @Override public Object visitValue(AsmArmParser.ValueContext ctx) { - checkState(expectedType instanceof IntegerType, "Expected type is not an integer type"); - String valueString = ctx.Numbers().getText(); - BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, (IntegerType) expectedType); + if (expectedType instanceof IntegerType) { + String valueString = ctx.Numbers().getText(); + BigInteger value = new BigInteger(valueString); + return expressions.makeValue(value, (IntegerType) expectedType); + }else if (expectedType instanceof PointerType){ + String valueString = ctx.Numbers().getText(); + BigInteger value = new BigInteger(valueString); + return expressions.makeIntToPtrCast(expressions.makeValue(value)); + } + throw new RuntimeException("Unexpected type " + expectedType + " visited"); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java index 01b238abe3..111c62e8ff 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java @@ -12,6 +12,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.parsers.AsmRISCVBaseVisitor; import com.dat3m.dartagnan.parsers.AsmRISCVParser; import com.dat3m.dartagnan.parsers.program.utils.AsmUtils; @@ -87,7 +88,7 @@ public Object visitLoad(AsmRISCVParser.LoadContext ctx) { Register address = (Register) ctx.register(1).accept(this); expectedType = address.getType(); Expression offset = (Expression) ctx.value().accept(this); - Expression newAddress = expressions.makeAdd(address,offset); + Expression newAddress = expressions.makePtrAdd(address,offset); asmInstructions.add(EventFactory.newLoad(register, newAddress)); return null; } @@ -143,7 +144,7 @@ public Object visitStore(AsmRISCVParser.StoreContext ctx) { Register address = (Register) ctx.register(1).accept(this); expectedType = address.getType(); Expression offset = (Expression) ctx.value().accept(this); - Expression newAddress = expressions.makeAdd(address,offset); + Expression newAddress = expressions.makePtrAdd(address,offset); asmInstructions.add(EventFactory.newStore(newAddress, value)); return null; } @@ -324,10 +325,16 @@ public Object visitRiscvFence(AsmRISCVParser.RiscvFenceContext ctx) { @Override public Object visitValue(AsmRISCVParser.ValueContext ctx) { - checkState(expectedType instanceof IntegerType, "Expected type is not an integer type"); + if (expectedType instanceof IntegerType) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); return expressions.makeValue(value, (IntegerType) expectedType); + }else if (expectedType instanceof PointerType){ + String valueString = ctx.Numbers().getText(); + BigInteger value = new BigInteger(valueString); + return expressions.makeIntToPtrCast(expressions.makeValue(value)); } + throw new RuntimeException("Unexpected type " + expectedType + " visited"); +} } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 83a27d6597..05c48e3aa2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -111,7 +111,8 @@ public Object visitGlobalDeclaratorRegisterLocation(LitmusCParser.GlobalDeclarat if(object != null){ programBuilder.initRegEqConst(ctx.threadId().id, ctx.varName(0).getText(), object); } else { - programBuilder.initRegEqLocVal(ctx.threadId().id, ctx.varName(0).getText(), ctx.varName(1).getText(), archType); + programBuilder.initRegEqLocVal(ctx.threadId().id, ctx.varName(0).getText(), ctx.varName(1).getText(), pointerType); + // todo verify pointerType or intType } } return null; @@ -600,7 +601,7 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx){ Register register = programBuilder.getRegister(scope, ctx.varName().getText()); if(register == null){ - register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), archType); + register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType); //care if(ctx.re() != null){ returnRegister = register; ctx.re().accept(this); @@ -676,14 +677,14 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ } MemoryObject object = programBuilder.getMemoryObject(ctx.getText()); if(object != null){ - register = programBuilder.getOrNewRegister(scope, null, archType); + register = programBuilder.getOrNewRegister(scope, null, pointerType); programBuilder.addChild(currentThread, EventFactory.newLoadWithMo(register, object, C11.NONATOMIC)); return register; } - return programBuilder.getOrNewRegister(scope, ctx.getText(), archType); + return programBuilder.getOrNewRegister(scope, ctx.getText(), pointerType); } MemoryObject object = programBuilder.newMemoryObject(ctx.getText(), archSize); - Register register = programBuilder.getOrNewRegister(scope, null, archType); + Register register = programBuilder.getOrNewRegister(scope, null, pointerType); programBuilder.addChild(currentThread, EventFactory.newLoadWithMo(register, object, C11.NONATOMIC)); return register; } @@ -706,7 +707,7 @@ private Expression returnExpressionOrOne(LitmusCParser.ReContext ctx) { private Register getReturnRegister(boolean createOnNull){ Register register = returnRegister; if(register == null && createOnNull){ - return programBuilder.getOrNewRegister(scope, null, archType); + return programBuilder.getOrNewRegister(scope, null, pointerType); } returnRegister = null; return register; From 9b0883096aed225c32038b0b11818302f4b5d47b Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 6 Nov 2025 08:30:59 +0100 Subject: [PATCH 017/109] Litmus lkmm changes --- .../expression/ExpressionFactory.java | 26 +++++++++++++++++++ .../processing/compilation/VisitorLKMM.java | 17 ++++++------ 2 files changed, 35 insertions(+), 8 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index e4292d1cdc..bc2420ad67 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -9,6 +9,7 @@ import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; +import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.memory.MemoryObject; import com.dat3m.dartagnan.program.memory.ScopedPointer; import com.dat3m.dartagnan.program.memory.ScopedPointerVariable; @@ -498,6 +499,17 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Equality not supported on type: " + type); } + public Expression makeEQforced(Expression leftOperand, Expression rightOperand) { + + if (leftOperand.getType() instanceof PointerType){ + return makeEQforced(makePtrToIntCast(leftOperand), rightOperand); + } + if (rightOperand.getType() instanceof PointerType){ + return makeEQforced(leftOperand, makePtrToIntCast(rightOperand)); + } + return makeEQ(leftOperand, rightOperand); + } + public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { final Type type = leftOperand.getType(); if (type instanceof BooleanType) { @@ -515,6 +527,18 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Disequality not supported on type: " + type); } + public Expression makeNEQforced(Expression leftOperand, Expression rightOperand) { + + if (leftOperand.getType() instanceof PointerType){ + return makeNEQforced(makePtrToIntCast(leftOperand), rightOperand); + } + if (rightOperand.getType() instanceof PointerType){ + return makeNEQforced(leftOperand, makePtrToIntCast(rightOperand)); + } + return makeNEQ(leftOperand, rightOperand); + } + + public Expression makeUnary(ExpressionKind op, Expression expr) { if (op instanceof BoolUnaryOp boolOp) { return makeBoolUnary(boolOp, expr); @@ -553,4 +577,6 @@ public Expression makeCompare(Expression x, ExpressionKind cmpOp, Expression y) } throw new UnsupportedOperationException(String.format("Expression kind %s is no comparison operator.", cmpOp)); } + + } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorLKMM.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorLKMM.java index d858308a5f..5b14612997 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorLKMM.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorLKMM.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionFactory; +import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; @@ -70,13 +71,13 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { newJump(havocRegister, success), // Cas failure branch loadFail, - newAssume(expressions.makeNEQ(dummy, cmp)), + newAssume(expressions.makeNEQforced(dummy, cmp)), newGoto(end), success, // CAS success branch mo.equals(Tag.Linux.MO_MB) ? newCoreMemoryBarrier() : null, loadSuccess = newRMWLoadWithMo(dummy, address, Tag.Linux.loadMO(mo)), - newAssume(expressions.makeEQ(dummy, cmp)), + newAssume(expressions.makeEQforced(dummy, cmp)), newRMWStoreWithMo(loadSuccess, address, e.getStoreValue(), Tag.Linux.storeMO(mo)), mo.equals(Tag.Linux.MO_MB) ? newCoreMemoryBarrier() : null, end, @@ -94,12 +95,12 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Event optionalMbBefore = mo.equals(Tag.Linux.MO_MB) ? newCoreMemoryBarrier() : null; Load load = newRMWLoadWithMo(dummy, address, Tag.Linux.loadMO(mo)); Event optionalMbAfter = mo.equals(Tag.Linux.MO_MB) ? newCoreMemoryBarrier() : null; - Expression storeValue = expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()); + Expression storeValue = expressions.makeIntBinaryForced(dummy,e.getOperator(), e.getOperand()); return eventSequence( optionalMbBefore, load, - newRMWStoreWithMo(load, address, storeValue, Tag.Linux.storeMO(mo)), + newRMWStoreWithMo(load, address, dummy.getType() instanceof IntegerType ? storeValue: expressions.makeIntToPtrCast(storeValue), Tag.Linux.storeMO(mo)), newLocal(resultRegister, dummy), optionalMbAfter ); @@ -128,11 +129,11 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Register dummy = e.getFunction().newRegister(operand.getType()); Load load = newRMWLoadWithMo(dummy, address, Tag.Linux.MO_ONCE); Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); - + Expression temp = expressions.makeIntBinaryForced(dummy, e.getOperator(), operand); return eventSequence( newCoreMemoryBarrier(), load, - newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), operand)), + newLocal(dummy, dummy.getType() instanceof IntegerType ? temp : expressions.makeIntToPtrCast(temp)), newRMWStoreWithMo(load, address, dummy, Tag.Linux.MO_ONCE), newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())), newCoreMemoryBarrier() @@ -149,11 +150,11 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { Load load = newRMWLoadWithMo(dummy, address, Tag.Linux.loadMO(mo)); Event optionalMbBefore = mo.equals(Tag.Linux.MO_MB) ? newCoreMemoryBarrier() : null; Event optionalMbAfter = mo.equals(Tag.Linux.MO_MB) ? newCoreMemoryBarrier() : null; - + Expression temp = expressions.makeIntBinaryForced(dummy,e.getOperator(), e.getOperand()); return eventSequence( optionalMbBefore, load, - newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())), + newLocal(dummy, resultRegister.getType() instanceof IntegerType ? temp: expressions.makeIntToPtrCast(temp) ), newRMWStoreWithMo(load, address, dummy, Tag.Linux.storeMO(mo)), newLocal(resultRegister, dummy), optionalMbAfter From 2fdfd3b8da32f35933aad632d388252ecd9facc3 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 6 Nov 2025 08:42:35 +0100 Subject: [PATCH 018/109] Litmus c11 fix --- .../dartagnan/program/processing/compilation/VisitorC11.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java index 49f39097d5..88de5e37e7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.type.BooleanType; +import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.EventFactory; @@ -82,7 +83,8 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadWithMo(resultRegister, address, Tag.C11.loadMO(mo)); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); + Expression temp = expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()); + Local localOp = newLocal(dummyReg, dummyReg.getType() instanceof IntegerType ? temp : expressions.makeIntToPtrCast(temp)); RMWStore store = newRMWStoreWithMo(load, address, dummyReg, Tag.C11.storeMO(mo)); return tagList(e, eventSequence( From 2825d0eb3865abdb977e4d688cf7627cbb7ed17a Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 6 Nov 2025 09:26:29 +0100 Subject: [PATCH 019/109] Added pointer concat and extract --- .../expression/ExpressionVisitor.java | 3 ++ .../expression/pointer/PtrConcat.java | 34 +++++++++++++++ .../expression/pointer/PtrExtract.java | 43 +++++++++++++++++++ 3 files changed, 80 insertions(+) create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 9023cb0310..f7f27e4465 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -63,6 +63,8 @@ public interface ExpressionVisitor { default TRet visitPtrToIntCastExpression(PtrToIntCast expr) { return visitCastExpression(expr); } default TRet visitPtrCmpExpression(PtrCmpExpr expr) { return visitBinaryExpression(expr); } default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } + default TRet visitPtrConcat(PtrConcat expr){ return visitExpression(expr); }; + default TRet visitPtrExtract(PtrExtract expr){ return visitUnaryExpression(expr); }; // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } @@ -80,4 +82,5 @@ private static UnsupportedOperationException unsupported(Expression expr, Class< expr.getClass().getSimpleName(), clazz.getSimpleName()); return new UnsupportedOperationException(error); } + } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java new file mode 100644 index 0000000000..d291b88801 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java @@ -0,0 +1,34 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.NaryExpressionBase; +import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.type.TypeFactory; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +public class PtrConcat extends NaryExpressionBase { + + public PtrConcat(List operands) { + super(getConcatType(operands), ExpressionKind.Other.BV_CONCAT, ImmutableList.copyOf(operands)); + } + + private static PointerType getConcatType(List operands) { + int size = 0; + for (Expression op : operands) { + ExpressionHelper.checkExpectedType(op, PointerType.class); + size += ((IntegerType)op.getType()).getBitWidth(); + } + return TypeFactory.getInstance().getPointerType(size); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitPtrConcat(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java new file mode 100644 index 0000000000..1b8baf8789 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java @@ -0,0 +1,43 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.UnaryExpressionBase; +import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.type.TypeFactory; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; +import com.google.common.base.Preconditions; + +public class PtrExtract extends UnaryExpressionBase { + + private final int lowBit; + private final int highBit; + + public PtrExtract(Expression operand, int lowBit, int highBit) { + super(TypeFactory.getInstance().getPointerType(highBit - lowBit + 1), + ExpressionKind.Other.BV_EXTRACT, + operand); + ExpressionHelper.checkExpectedType(operand, PointerType.class); + int originalWidth = ((IntegerType)operand.getType()).getBitWidth(); + Preconditions.checkArgument(0 <= lowBit && lowBit <= highBit && highBit < originalWidth); + this.lowBit = lowBit; + this.highBit = highBit; + } + + public int getLowBit() { return lowBit; } + public int getHighBit() { return highBit; } + + public boolean isExtractingLowBits() { + return lowBit == 0; + } + public boolean isExtractingHighBits() { + return operand.getType() instanceof IntegerType t && highBit + 1 == t.getBitWidth(); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitPtrExtract(this); + } +} From 63a4678a59c7d7f1c9b7433607c261455e0367a9 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 10 Nov 2025 12:33:18 +0100 Subject: [PATCH 020/109] Added pointer recognition to ops VisitorOpsConstant --- .../parsers/program/visitors/spirv/VisitorOpsConstant.java | 3 +++ 1 file changed, 3 insertions(+) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConstant.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConstant.java index 465e09b29f..57d199d67d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConstant.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConstant.java @@ -143,6 +143,9 @@ private Expression getConstantNullExpression(String typeId, Type type) { if (type instanceof IntegerType iType) { return expressions.makeZero(iType); } + if (type instanceof PointerType pType) { + return expressions.makeNullLiteral(pType); + } throw new ParsingException("Unsupported NULL constant type '%s'", typeId); } From a2a11d6a09a4672080d0ee23030aac956e3b38a9 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 10 Nov 2025 18:04:25 +0100 Subject: [PATCH 021/109] -- --- .../com/dat3m/dartagnan/program/processing/Intrinsics.java | 1 - .../dartagnan/program/processing/ProcessingManager.java | 2 ++ .../java/com/dat3m/dartagnan/utils/printer/Printer.java | 6 +++--- .../java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java | 2 +- 4 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index 93f4912733..c95ea7c3d8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -712,7 +712,6 @@ private List inlinePthreadKeyCreate(FunctionCall call) { final Expression destructor = call.getArguments().get(1); final Program program = call.getFunction().getProgram(); final long threadCount = program.getThreads().size(); - final int pointerBytes = types.getMemorySizeInBytes(types.getPointerType()); final Register storageAddressRegister = call.getFunction().newRegister(types.getArchType()); final Expression size = expressions.makeValue((threadCount + 1) * pointerBytes, types.getArchType()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index 0ea7d57060..63669efed0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -130,7 +130,9 @@ private ProcessingManager(Configuration config) throws InvalidConfigurationExcep simplifyFunction ), Target.FUNCTIONS, true ), + ThreadCreation.fromConfig(config), + DebugPrint.withHeader("--------Debug--------", Printer.Mode.ALL, config), ResolveNonDetChoices.newInstance(), reduceSymmetry ? SymmetryReduction.fromConfig(config) : null, intrinsics.lateInliningPass(), diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java index d653108b46..c18dac55c3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java @@ -41,7 +41,7 @@ public Printer setMode(Mode mode) { @Option(name = OptionNames.PRINTER_SHOW_INIT_THREADS, description = "Print init threads (default: false)", secure = true) - private boolean showInitThreads = false; + private boolean showInitThreads = true; @Option(name = OptionNames.PRINTER_SHOW_ANNOTATIONS, description = "Print annotation events (default: true)", @@ -56,12 +56,12 @@ public Printer setMode(Mode mode) { @Option(name = OptionNames.PRINTER_SHOW_PROGRAM_CONSTANTS, description = "Print non-deterministic program constants (default: false)", secure = true) - private boolean showProgramConstants = false; + private boolean showProgramConstants = true; @Option(name = OptionNames.PRINTER_SHOW_SPECIFICATION, description = "Print program specification and filter (default: false)", secure = true) - private boolean showSpecification = false; + private boolean showSpecification = true; // ================================================================================= diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java index 263d1d3c43..8a56445cee 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java @@ -42,7 +42,7 @@ protected Provider getBoundProvider() { @Override protected long getTimeout() { - return 10000; + return 1000000; } @Override From 8773284b8f110d34cacce20d9644ab1076f68d9f Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 11 Nov 2025 21:19:08 +0100 Subject: [PATCH 022/109] added encoding and printing of pointer tearing --- .../dartagnan/encoding/ExpressionEncoder.java | 60 +++++++++++++++---- .../expression/ExpressionFactory.java | 9 ++- .../expression/ExpressionPrinter.java | 10 ++++ .../expression/pointer/PtrConcat.java | 3 +- .../expression/pointer/PtrExtract.java | 5 +- .../processing/ExprTransformer.java | 16 +++-- .../expression/type/PointerType.java | 4 +- .../expression/type/TypeFactory.java | 4 +- .../program/processing/ProcessingManager.java | 2 +- .../dartagnan/program/processing/Tearing.java | 7 ++- .../program/processing/ThreadCreation.java | 14 ++--- 11 files changed, 97 insertions(+), 37 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index f059d47cc3..b45e5eb88a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -551,7 +551,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); final int targetBitWidth = expr.getTargetType().getBitWidth(); - final int sourceBitWidth = types.getArchType().getBitWidth(); + final int sourceBitWidth = expr.getSourceType().getBitWidth(); assert (sourceBitWidth == bvmgr.getLength(innerBv)); enc = bvmgr.extract(innerBv, targetBitWidth - 1, 0); } @@ -583,16 +583,16 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp }; return new TypedFormula<>(types.getBooleanType(), result); }else{ - final var left = (TypedFormula) encodePointerExpr(expr.getLeft()); - final var right = (TypedFormula) encodePointerExpr(expr.getRight()); + final BitvectorFormula left = (BitvectorFormula) encodePointerExpr(expr.getLeft()).formula(); + final BitvectorFormula right = (BitvectorFormula) encodePointerExpr(expr.getRight()).formula(); final BitvectorFormulaManager bvgr = bitvectorFormulaManager(); final BooleanFormula result = switch (expr.getKind()) { - case EQ -> bvgr.equal(left.formula(), right.formula()); - case NEQ -> bmgr.not(fmgr.equal(left.formula(), right.formula())); - case LT -> bvgr.lessThan(left.formula(), right.formula(),false); - case LTE -> bvgr.lessOrEquals(left.formula(), right.formula(),false); - case GT -> bvgr.greaterThan(left.formula(), right.formula(),false); - case GTE -> bvgr.greaterOrEquals(left.formula(), right.formula(),false); + case EQ -> bvgr.equal(left, right); + case NEQ -> bmgr.not(fmgr.equal(left, right)); + case LT -> bvgr.lessThan(left, right,false); + case LTE -> bvgr.lessOrEquals(left, right,false); + case GT -> bvgr.greaterThan(left, right,false); + case GTE -> bvgr.greaterOrEquals(left, right,false); }; return new TypedFormula<>(types.getBooleanType(), result); } @@ -607,9 +607,47 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp return new TypedFormula<>(lit.getType(), zero); } + @Override + public TypedFormula visitPtrExtract(PtrExtract expr) { + final Formula operand = encodePointerExpr(expr.getOperand()).formula(); + final Formula enc; + if (context.useIntegers) { + final IntegerFormulaManager imgr = integerFormulaManager(); + final IntegerFormula highBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getHighBit() + 1)); + final IntegerFormula lowBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getLowBit())); + final IntegerFormula op = (IntegerFormula) operand; + final IntegerFormula extracted = expr.isExtractingHighBits() ? op : imgr.modulo(op, highBitValue); + enc = expr.isExtractingLowBits() ? extracted : imgr.divide(extracted, lowBitValue); + } else { + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + enc = bvmgr.extract((BitvectorFormula) operand, expr.getHighBit(), expr.getLowBit()); + } + return new TypedFormula<>(expr.getType(), enc); + } - - + @Override + public TypedFormula visitPtrConcat(PtrConcat expr) { + Preconditions.checkArgument(!expr.getOperands().isEmpty()); + final List> operands = expr.getOperands().stream() + .map(this::encodePointerExpr) + .toList(); + Formula enc = operands.get(0).formula(); + if (context.useIntegers) { + final IntegerFormulaManager imgr = fmgr.getIntegerFormulaManager(); + int offset = operands.get(0).type().getBitWidth(); + for (TypedFormula op : operands.subList(1, operands.size())) { + final IntegerFormula offsetValue = imgr.makeNumber(BigInteger.TWO.pow(offset - 1)); + enc = imgr.add((IntegerFormula) enc, imgr.multiply((IntegerFormula) op.formula(), offsetValue)); + offset += op.type().getBitWidth(); + } + } else { + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + for (TypedFormula op : operands.subList(1, operands.size())) { + enc = bvmgr.concat((BitvectorFormula) op.formula(), (BitvectorFormula) enc); + } + } + return new TypedFormula<>(expr.getType(), enc); + } // ==================================================================================== // Aggregates diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index bc2420ad67..d5d0a0af19 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -414,7 +414,6 @@ public Expression makeIntToPtrCast(Expression operand) { } - public Expression makeNullLiteral(PointerType pointerType) { return new NullLiteral(pointerType); } @@ -427,6 +426,14 @@ public Expression makePtrCmp(Expression left, PointerCmpOp op, Expression right) return new PtrCmpExpr(types.getBooleanType(), left, op, right); } + public Expression makePtrExtract(Expression operand, int lowBit, int highBit) { + return new PtrExtract(operand, lowBit, highBit); + } + + public Expression makePtrConcat(List operands) { + return new PtrConcat(operands); + } + // ----------------------------------------------------------------------------------------------------------------- // Misc diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java index e267544d20..9e0fcc77e8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java @@ -140,6 +140,16 @@ public String visitPointerAddExpression(PointerAddExpr expr) { return String.format("%s + %s", visit(expr.getBase()), visit(expr.getOffset())); } + @Override + public String visitPtrConcat(PtrConcat expr) { + return Lists.reverse(expr.getOperands()).stream().map(this::visit).collect(Collectors.joining("::")); + } + + @Override + public String visitPtrExtract(PtrExtract expr) { + return String.format("%s[%d..%d]", expr.getOperand().accept(this), expr.getLowBit(), expr.getHighBit()); + } + @Override public String visitITEExpression(ITEExpr expr) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java index d291b88801..abe239c1b5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java @@ -4,7 +4,6 @@ import com.dat3m.dartagnan.expression.ExpressionKind; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.base.NaryExpressionBase; -import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; @@ -22,7 +21,7 @@ private static PointerType getConcatType(List operands) { int size = 0; for (Expression op : operands) { ExpressionHelper.checkExpectedType(op, PointerType.class); - size += ((IntegerType)op.getType()).getBitWidth(); + size += ((PointerType)op.getType()).getBitWidth(); } return TypeFactory.getInstance().getPointerType(size); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java index 1b8baf8789..8f74410104 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java @@ -4,7 +4,6 @@ import com.dat3m.dartagnan.expression.ExpressionKind; import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.base.UnaryExpressionBase; -import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; @@ -20,7 +19,7 @@ public PtrExtract(Expression operand, int lowBit, int highBit) { ExpressionKind.Other.BV_EXTRACT, operand); ExpressionHelper.checkExpectedType(operand, PointerType.class); - int originalWidth = ((IntegerType)operand.getType()).getBitWidth(); + int originalWidth = ((PointerType)operand.getType()).getBitWidth(); Preconditions.checkArgument(0 <= lowBit && lowBit <= highBit && highBit < originalWidth); this.lowBit = lowBit; this.highBit = highBit; @@ -33,7 +32,7 @@ public boolean isExtractingLowBits() { return lowBit == 0; } public boolean isExtractingHighBits() { - return operand.getType() instanceof IntegerType t && highBit + 1 == t.getBitWidth(); + return operand.getType() instanceof PointerType t && highBit + 1 == t.getBitWidth(); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index 9549e85cbd..b4051dab9b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -17,10 +17,8 @@ import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; -import com.dat3m.dartagnan.expression.pointer.IntToPtrCast; -import com.dat3m.dartagnan.expression.pointer.PointerAddExpr; -import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; -import com.dat3m.dartagnan.expression.pointer.PtrToIntCast; +import com.dat3m.dartagnan.expression.pointer.*; + import java.util.ArrayList; @@ -149,6 +147,16 @@ public Expression visitIntToPtrCastExpression(IntToPtrCast expr) { return expressions.makeIntToPtrCast(expr.getOperand().accept(this)); } + @Override + public Expression visitPtrConcat(PtrConcat expr) { + return expressions.makePtrConcat(expr.getOperands().stream().map(e -> e.accept(this)).toList()); + } + + @Override + public Expression visitPtrExtract(PtrExtract expr) { + return expressions.makePtrExtract(expr.getOperand().accept(this), expr.getLowBit(), expr.getHighBit()); + } + @Override public Expression visitGEPExpression(GEPExpr gep) { Expression base = gep.getBase().accept(this); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index 667b1bb3fb..4adadd85a5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -12,7 +12,6 @@ public class PointerType implements Type { this.bitWidth = bitWidth; } - @Override public String toString() { return "ptr_"+ bitWidth; @@ -24,4 +23,7 @@ public boolean equals(Object obj) { && other.bitWidth == this.bitWidth; } + public int getBitWidth() { + return bitWidth; + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 2a0ec6cfc8..547957e06d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -166,8 +166,8 @@ private int getMemorySizeInBytes(Type type, boolean padded) { if (type instanceof IntegerType integerType) { return IntMath.divide(integerType.getBitWidth(), 8, RoundingMode.CEILING); } - if (type instanceof PointerType) { - return getMemorySizeInBytes(getArchType()); + if (type instanceof PointerType pointerTypp) { + return IntMath.divide(pointerTypp.getBitWidth(), 8, RoundingMode.CEILING); } if (type instanceof FloatType floatType) { return IntMath.divide(floatType.getBitWidth(), 8, RoundingMode.CEILING); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index 63669efed0..3e0816254a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -132,7 +132,7 @@ private ProcessingManager(Configuration config) throws InvalidConfigurationExcep ), ThreadCreation.fromConfig(config), - DebugPrint.withHeader("--------Debug--------", Printer.Mode.ALL, config), + //DebugPrint.withHeader("--------Debug--------", Printer.Mode.ALL, config), ResolveNonDetChoices.newInstance(), reduceSymmetry ? SymmetryReduction.fromConfig(config) : null, intrinsics.lateInliningPass(), diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index ca4491fcc7..bb1c73cec2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -177,6 +177,7 @@ private List createTransaction(Load load, List offsets) { final PointerType addressType = checkPointerType(load.getAddress().getType(), "Non-Pointer address in '%s'", load); checkType(load.getAccessType(), "Non-integer or Pointer mixed-size access in '%s'", load); + final Register resultRegister = load.getResultRegister(); final Function function = load.getFunction(); final Register addressRegister = toRegister(load.getAddress(), function, replacement); final List smallerRegisters = new ArrayList<>(); @@ -184,7 +185,7 @@ private List createTransaction(Load load, List offsets) { int start = i < 0 ? 0 : offsets.get(i); int end = i + 1 < offsets.size() ? offsets.get(i + 1) : bytes; assert start < end; - smallerRegisters.add(newRegister(function, types.getIntegerType(8 * (end - start)))); + smallerRegisters.add(newRegister(function, resultRegister.getType() instanceof PointerType ?types.getPointerType(8 * (end - start)) :types.getIntegerType(8 * (end - start)))); } assert bytes == smallerRegisters.stream().mapToInt(t -> types.getMemorySizeInBytes(t.getType())).sum(); final InstructionBoundary begin = load.hasTag(Tag.NO_INSTRUCTION) ? null : EventFactory.newInstructionBegin(); @@ -206,7 +207,7 @@ private List createTransaction(Load load, List offsets) { final Event end = EventFactory.newInstructionEnd(begin); replacement.add(end); } - final Expression combination = expressions.makeIntConcat(smallerRegisters); + final Expression combination = resultRegister.getType() instanceof PointerType ? expressions.makePtrConcat(smallerRegisters): expressions.makeIntConcat(smallerRegisters); final Event computeResult = EventFactory.newLocal(load.getResultRegister(), combination); replacement.add(computeResult); return replacement; @@ -233,7 +234,7 @@ private List createTransaction(Store store, List offsets, Map createThreads(Entrypoint.Simple entrypoint) { final List replacement = eventSequence( newReleaseStore(spawnedThread.comAddress(), threadState(ALIVE | JOINABLE)), createEvent, - newLocal(tidRegister, new TIdExpr(archType, spawnedThread.thread())) + newLocal(tidRegister, new TIdExpr((IntegerType) tidRegister.getType(), spawnedThread.thread())) ); IRHelper.replaceWithMetadata(create, replacement); @@ -345,7 +345,7 @@ private void resolvePthreadSelf(Program program) { final Expression tidExpr = new TIdExpr(archType, call.getThread()); final Local tidAssignment = newLocal(resultRegister, expressions.makeIntToPtrCast(tidExpr)); IRHelper.replaceWithMetadata(call, tidAssignment); - }else { + }else{ final Expression tidExpr = new TIdExpr((IntegerType) regType, call.getThread()); final Local tidAssignment = newLocal(resultRegister, tidExpr); IRHelper.replaceWithMetadata(call, tidAssignment); @@ -435,7 +435,6 @@ private ThreadData createLLVMThreadFromFunction(Function function, int tid, Thre return new ThreadData(thread, null); } - private void replaceThreadLocalsWithStackalloc(Memory memory, Thread thread) { final TypeFactory types = TypeFactory.getInstance(); final ExpressionFactory exprs = ExpressionFactory.getInstance(); @@ -443,11 +442,8 @@ private void replaceThreadLocalsWithStackalloc(Memory memory, Thread thread) { // Translate thread-local memory object to local stack allocation Map toLocalRegister = new HashMap<>(); for (MemoryObject memoryObject : memory.getObjects()) { - if (!memoryObject.isThreadLocal()) { - continue; - } + if (!memoryObject.isThreadLocal()) {continue;} Preconditions.checkState(memoryObject.hasKnownSize()); - // Compute type of memory object based on initial values final List contentTypes = new ArrayList<>(); final List offsets = new ArrayList<>(); @@ -460,7 +456,7 @@ private void replaceThreadLocalsWithStackalloc(Memory memory, Thread thread) { // Allocate single object of memory type final Register reg = thread.newUniqueRegister("__threadLocal_" + memoryObject, types.getPointerType()); final Event localAlloc = EventFactory.newAlloc( - reg, memoryType, expressions.makeOne(types.getArchType()), + reg, memoryType, expressions.makeOne(archType), false, true ); @@ -468,7 +464,7 @@ private void replaceThreadLocalsWithStackalloc(Memory memory, Thread thread) { final List initialization = new ArrayList<>(); for (Integer initOffset : memoryObject.getInitializedFields()) { initialization.add(EventFactory.newStore( - exprs.makePtrAdd(reg, exprs.makeValue(initOffset, types.getArchType())), + exprs.makePtrAdd(reg, exprs.makeValue(initOffset, archType)), memoryObject.getInitialValue(initOffset) )); } From 2e5614072ac565ae2fa9eb42cad466f515f99bfc Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 12 Nov 2025 19:21:13 +0100 Subject: [PATCH 023/109] fixed test change --- .../test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java index 8a56445cee..263d1d3c43 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java @@ -42,7 +42,7 @@ protected Provider getBoundProvider() { @Override protected long getTimeout() { - return 1000000; + return 10000; } @Override From 7dcac060f1aef9e8ab92cadd332bbe41ed1eb7fb Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 16 Nov 2025 20:08:17 +0100 Subject: [PATCH 024/109] fixed more pointer compatibility problems --- .../dartagnan/encoding/ExpressionEncoder.java | 12 +++++++----- .../expression/pointer/PointerCmpOp.java | 10 ++++++++++ .../expression/pointer/PtrToIntCast.java | 9 +++++++++ .../expression/type/ScopedPointerType.java | 2 +- .../parsers/program/utils/ProgramBuilder.java | 2 +- .../visitors/spirv/VisitorOpsAtomic.java | 2 +- .../dartagnan/program/event/EventFactory.java | 1 - .../program/processing/Inlining.java | 4 ---- .../program/processing/MemToReg.java | 3 ++- .../processing/NaiveLoopBoundAnnotation.java | 4 ++++ .../processing/RemoveDeadCondJumps.java | 4 ++++ .../SparseConditionalConstantPropagation.java | 6 ++++-- .../dartagnan/program/processing/Tearing.java | 11 ++++++++--- .../program/processing/ThreadCreation.java | 2 +- .../processing/compilation/VisitorArm8.java | 18 +++++++++--------- .../processing/compilation/VisitorPower.java | 19 ++++++++++--------- .../processing/compilation/VisitorRISCV.java | 18 +++++++++--------- .../processing/compilation/VisitorTso.java | 10 +++++++++- .../transformers/MemoryTransformer.java | 4 +--- 19 files changed, 90 insertions(+), 51 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index b45e5eb88a..d4916eae04 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -539,13 +539,15 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitPtrToIntCastExpression(PtrToIntCast expr) { - // Todo: add support for extension final TypedFormula inner = encodePointerExpr(expr.getOperand()); final Formula enc; if (context.useIntegers) { + if (expr.isExtension()) { + enc = inner.formula(); + }else { final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); final IntegerFormulaManager imgr = integerFormulaManager(); - enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue)); + enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue));} } else { assert inner.formula() instanceof BitvectorFormula; final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); @@ -553,15 +555,15 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final int targetBitWidth = expr.getTargetType().getBitWidth(); final int sourceBitWidth = expr.getSourceType().getBitWidth(); assert (sourceBitWidth == bvmgr.getLength(innerBv)); - enc = bvmgr.extract(innerBv, targetBitWidth - 1, 0); + enc = expr.isExtension() + ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) + : bvmgr.extract(innerBv, targetBitWidth - 1, 0); } return new TypedFormula<>(expr.getType(), enc); - } @Override public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { - final TypedFormula address = encodeIntegerExpr(expr.getOperand()); return new TypedFormula<>(expr.getType(), address.formula()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java index 0e16c29e54..a0c164fbb4 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java @@ -21,5 +21,15 @@ public String getSymbol() { case LT -> "<"; }; } + public PointerCmpOp inverted() { + return switch (this) { + case EQ -> NEQ; + case NEQ -> EQ; + case GTE -> LT; + case LTE -> GT; + case GT -> LTE; + case LT -> GTE; + }; + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java index 82a370ef63..5b9feebd5f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; +import scala.concurrent.impl.FutureConvertersImpl; public final class PtrToIntCast extends CastExpressionBase { @@ -14,6 +15,14 @@ public PtrToIntCast(IntegerType integerType, Expression operand) { ExpressionHelper.checkExpectedType(operand, PointerType.class); } + public boolean isExtension() { + return isExtension(getSourceType(), getTargetType()); + } + + private static boolean isExtension(PointerType sourceType, IntegerType targetType) { + return sourceType.getBitWidth() < targetType.getBitWidth(); + } + @Override public T accept(ExpressionVisitor visitor) { return visitor.visitPtrToIntCastExpression(this); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java index eac26595d5..780d8c430e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/ScopedPointerType.java @@ -6,7 +6,7 @@ public class ScopedPointerType extends PointerType { - private static final int ARCH_SIZE = TypeFactory.getInstance().getArchType().getBitWidth(); + private static final int ARCH_SIZE = TypeFactory.getInstance().getPointerType().getBitWidth(); private final String scopeId; private final Type pointedType; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java index 292dbd995c..518c1d7243 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java @@ -270,7 +270,7 @@ public Register getRegister(int fid, String name){ } public Register getOrNewRegister(int fid, String name) { - return getOrNewRegister(fid, name, types.getArchType()); + return getOrNewRegister(fid, name, types.getPointerType()); } public Register getOrNewRegister(int fid, String name, Type type) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java index 0000843193..dd7cce41d0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java @@ -145,7 +145,7 @@ private Event visitOpAtomicExtremum( Set tags = getMemorySemanticsTags(tagsCtx.getText()); tags.add(builder.getPointerStorageClass(ptrCtx.getText())); if (!(ptr.getType() instanceof PointerType) || !(value.getType() instanceof IntegerType)) { - throw new ParsingException("Unexpected type at '%s' or '%s', expected pointer and integer but received '%s' and '%s'", + throw new ParsingException("Unexpected type at '%s' or '%s', expected pointer or integer but received '%s' and '%s'", ptrCtx.getText(), valCtx.getText(), ptr.getType(), value.getType()); } SpirvRmwExtremum event = newSpirvRmwExtremum(register, ptr, kind, value, scope, tags); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java index ef062b9a52..8ed55c8ac7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java @@ -165,7 +165,6 @@ public static NamedBarrier newNamedBarrier(String name, String instanceId, Strin public static Init newInit(MemoryObject base, int offset) { //TODO: We simplify here because virtual aliasing currently fails when pointer arithmetic is involved // meaning that and are treated differently. - // final Expression address = expressions.makePtrAdd(base, expressions.makeValue(offset, types.getArchType())); final Init init = new Init(base, offset, address); init.addTags(base.getFeatureTags()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java index 7f89b95a3b..e0b7ed86ca 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java @@ -33,8 +33,6 @@ import static com.dat3m.dartagnan.program.event.EventFactory.*; import static com.google.common.base.Verify.verify; - - @Options public class Inlining implements ProgramProcessor { @@ -44,8 +42,6 @@ public class Inlining implements ProgramProcessor { private int bound = 1; private static final ExpressionFactory expressions = ExpressionFactory.getInstance(); - - private Inlining() {} public static Inlining fromConfig(Configuration config) throws InvalidConfigurationException { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java index 8a54156b58..4703832749 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java @@ -42,7 +42,8 @@ public class MemToReg implements FunctionProcessor { private static final TypeFactory types = TypeFactory.getInstance(); private static final ExpressionFactory expressions = ExpressionFactory.getInstance(); - private MemToReg() {} + private MemToReg() { + } public static MemToReg fromConfig(Configuration config) throws InvalidConfigurationException { return new MemToReg(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java index 703ebeb7f8..3d5b9cee85 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java @@ -4,6 +4,9 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.NullLiteral; +import com.dat3m.dartagnan.expression.pointer.PointerCmpOp; +import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.analysis.DominatorAnalysis; @@ -108,6 +111,7 @@ public void run(Function function) { continue; } final Expression negatedGuard = jump.getGuard(); + // Now we check for the guard shape "r != 0" (i.e., we exit when r == 0 due to the inversion). if (!(negatedGuard instanceof IntCmpExpr cond && cond.getLeft() instanceof Register r diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java index 5da9e12c4e..f1ba75eb32 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryExpr; import com.dat3m.dartagnan.expression.integers.IntCmpExpr; +import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.Tag; @@ -125,6 +126,9 @@ private boolean mutuallyExclusiveIfs(CondJump jump, Event e) { if (jump.getGuard() instanceof IntCmpExpr a1 && other.getGuard() instanceof IntCmpExpr a2) { return a1.getKind().inverted() == a2.getKind() && a1.getLeft().equals(a2.getLeft()) && a1.getRight().equals(a2.getRight()); } + if (jump.getGuard() instanceof PtrCmpExpr a1 && other.getGuard() instanceof PtrCmpExpr a2) { + return a1.getKind().inverted() == a2.getKind() && a1.getLeft().equals(a2.getLeft()) && a1.getRight().equals(a2.getRight()); + } return false; } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java index 4c170c73d7..776f9af7de 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java @@ -3,7 +3,9 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.booleans.BoolLiteral; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointer.NullLiteral; import com.dat3m.dartagnan.expression.processing.ExprSimplifier; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; import com.dat3m.dartagnan.program.Register; @@ -70,8 +72,8 @@ public void run(Function func) { return; } final Predicate checkDoPropagate = propagateCopyAssignments - ? (expr -> expr instanceof MemoryObject || expr instanceof IntLiteral || expr instanceof BoolLiteral || expr instanceof Register) - : (expr -> expr instanceof MemoryObject || expr instanceof IntLiteral || expr instanceof BoolLiteral); + ? (expr -> expr instanceof MemoryObject || expr instanceof NullLiteral || expr instanceof IntLiteral || expr instanceof BoolLiteral || expr instanceof Register) + : (expr -> expr instanceof MemoryObject || expr instanceof NullLiteral || expr instanceof IntLiteral || expr instanceof BoolLiteral); // todo check nullLiteral Set reachableEvents = new HashSet<>(); Map> inflowMap = new HashMap<>(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index bb1c73cec2..062a364422 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -185,7 +185,9 @@ private List createTransaction(Load load, List offsets) { int start = i < 0 ? 0 : offsets.get(i); int end = i + 1 < offsets.size() ? offsets.get(i + 1) : bytes; assert start < end; - smallerRegisters.add(newRegister(function, resultRegister.getType() instanceof PointerType ?types.getPointerType(8 * (end - start)) :types.getIntegerType(8 * (end - start)))); + smallerRegisters.add(newRegister(function, resultRegister.getType() instanceof PointerType + ?types.getPointerType(8 * (end - start)) + :types.getIntegerType(8 * (end - start)))); } assert bytes == smallerRegisters.stream().mapToInt(t -> types.getMemorySizeInBytes(t.getType())).sum(); final InstructionBoundary begin = load.hasTag(Tag.NO_INSTRUCTION) ? null : EventFactory.newInstructionBegin(); @@ -207,7 +209,8 @@ private List createTransaction(Load load, List offsets) { final Event end = EventFactory.newInstructionEnd(begin); replacement.add(end); } - final Expression combination = resultRegister.getType() instanceof PointerType ? expressions.makePtrConcat(smallerRegisters): expressions.makeIntConcat(smallerRegisters); + final Expression combination = resultRegister.getType() instanceof PointerType + ? expressions.makePtrConcat(smallerRegisters): expressions.makeIntConcat(smallerRegisters); final Event computeResult = EventFactory.newLocal(load.getResultRegister(), combination); replacement.add(computeResult); return replacement; @@ -234,7 +237,9 @@ private List createTransaction(Store store, List offsets, Map visitLlvmRMW(LlvmRMW e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, ARMv8.extractLoadMoFromCMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, dummyReg, true, ARMv8.extractStoreMoFromCMo(mo)); @@ -218,7 +218,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, ARMv8.extractLoadMoFromCMo(mo)); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); Store store = newRMWStoreExclusiveWithMo(address, dummyReg, true, ARMv8.extractStoreMoFromCMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(resultRegister, label); @@ -379,7 +379,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Label casEnd = newLabel("CAS_end"); // The real scheme uses XOR instead of comparison, but both are semantically // equivalent and XOR harms performance substantially. - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQforced(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, e.getStoreValue(), true, ARMv8.extractStoreMoFromLKMo(mo)); @@ -431,7 +431,7 @@ public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { Expression address = e.getAddress(); Register dummy = e.getFunction().newRegister(e.getAccessType()); - Expression storeValue = expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()); + Expression storeValue = expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()),dummy.getType()); Load load = newRMWLoadExclusive(dummy, address); Store store = newRMWStoreExclusive(address, storeValue, true); Label label = newLabel("FakeDep"); @@ -464,7 +464,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( load, - newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())), + newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()),dummy.getType())), store, newLocal(resultRegister, dummy), fakeCtrlDep, @@ -485,7 +485,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register dummy = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); - Store store = newRMWStoreExclusiveWithMo(address, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()), + Store store = newRMWStoreExclusiveWithMo(address, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()), true, ARMv8.extractStoreMoFromLKMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(dummy, label); @@ -515,7 +515,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Register regValue = e.getFunction().newRegister(type); Load load = newRMWLoadExclusiveWithMo(regValue, address, ARMv8.extractLoadMoFromLKMo(mo)); - Store store = newRMWStoreExclusiveWithMo(address, expressions.makeAdd(regValue, e.getOperand()), true, ARMv8.extractStoreMoFromLKMo(mo)); + Store store = newRMWStoreExclusiveWithMo(address, expressions.makePtrAdd(regValue, e.getOperand()), true, ARMv8.extractStoreMoFromLKMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(regValue, label); @@ -528,7 +528,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeNEQ(regValue, unless), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeNEQforced(regValue, unless), dummy.getType())), branchOnCauCmpResult, store, fakeCtrlDep, @@ -554,7 +554,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); - Local localOp = newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())); Store store = newRMWStoreExclusiveWithMo(address, dummy, true, ARMv8.extractStoreMoFromLKMo(mo)); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java index aaff241615..95c6be0862 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.program.Register; @@ -177,7 +178,7 @@ public List visitLlvmRMW(LlvmRMW e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); // Power does not have mo tags, thus we use null Load load = newRMWLoadExclusive(resultRegister, address); @@ -367,7 +368,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister,e.getOperator() ,e.getOperand()),dummyReg.getType())); Load load = newRMWLoadExclusive(resultRegister, address); Store store = Power.newRMWStoreConditional(address, dummyReg, true); @@ -658,7 +659,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQforced(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); Store store = Power.newRMWStoreConditional(address, e.getStoreValue(), true); @@ -717,7 +718,7 @@ public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { String mo = e.getMo(); Register dummy = e.getFunction().newRegister(e.getAccessType()); - Expression storeValue = expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()); + Expression storeValue = expressions.makeCast(expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()), dummy.getType()); // Power does not have mo tags, thus we use the empty string Load load = newRMWLoadExclusive(dummy, address); Store store = Power.newRMWStoreConditional(address, storeValue, true); @@ -763,7 +764,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())), + newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()),dummy.getType())), store, newLocal(resultRegister, dummy), fakeCtrlDep, @@ -782,7 +783,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register dummy = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusive(dummy, address); - Store store = Power.newRMWStoreConditional(address, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()), true); + Store store = Power.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()), true); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(dummy, label); @@ -817,7 +818,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Register regValue = e.getFunction().newRegister(type); // Power does not have mo tags, thus we use the empty string Load load = newRMWLoadExclusive(regValue, address); - Store store = Power.newRMWStoreConditional(address, expressions.makeAdd(regValue, e.getOperand()), true); + Store store = Power.newRMWStoreConditional(address, expressions.makePtrAdd(regValue, e.getOperand()), true); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(regValue, label); @@ -834,7 +835,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeNEQ(regValue, unless)), + newLocal(dummy, expressions.makeNEQforced(regValue, unless)), branchOnCauCmpResult, store, fakeCtrlDep, @@ -860,7 +861,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusive(dummy, address); - Local localOp = newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())); Store store = Power.newRMWStoreConditional(address, dummy, true); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index c58379dbae..f3f05ad9ef 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -102,7 +102,7 @@ public List visitLlvmRMW(LlvmRMW e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(type); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, Tag.RISCV.extractLoadMoFromCMo(mo)); Store store = RISCV.newRMWStoreConditional(address, dummyReg, Tag.RISCV.extractStoreMoFromCMo(mo), true); @@ -225,7 +225,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(type); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, Tag.RISCV.extractLoadMoFromCMo(mo)); Store store = RISCV.newRMWStoreConditional(address, dummyReg, Tag.RISCV.extractStoreMoFromCMo(mo), true); @@ -395,7 +395,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQforced(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? Store store = RISCV.newRMWStoreConditional(address, e.getStoreValue(), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); @@ -462,7 +462,7 @@ public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { Register dummy = e.getFunction().newRegister(type); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); - Expression storeValue = expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()); + Expression storeValue = expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()); String moLoad = mo.equals(Tag.Linux.MO_MB) || mo.equals(Tag.Linux.MO_ACQUIRE) ? Tag.RISCV.MO_ACQ : ""; Load load = newRMWLoadExclusiveWithMo(dummy, address, moLoad); String moStore = mo.equals(Tag.Linux.MO_MB) || mo.equals(Tag.Linux.MO_RELEASE) ? Tag.RISCV.MO_ACQ_REL : ""; @@ -498,7 +498,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? - Store store = RISCV.newRMWStoreConditional(address, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()), + Store store = RISCV.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); ExecutionStatus status = newExecutionStatusWithDependencyTracking(statusReg, store); Label label = newLabel("FakeDep"); @@ -544,7 +544,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())), + newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())), store, status, newLocal(resultRegister, dummy), @@ -571,7 +571,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Register regValue = e.getFunction().newRegister(type); Load load = newRMWLoadExclusive(regValue, address); // TODO: No mo on the load? - Store store = RISCV.newRMWStoreConditional(address, expressions.makeAdd(regValue, e.getOperand()), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); + Store store = RISCV.newRMWStoreConditional(address, expressions.makePtrAdd(regValue, e.getOperand()), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); // TODO: Why does this use a different fake dep (from the load) than the other RMW events (from the store)? Label label = newLabel("FakeDep"); @@ -585,7 +585,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeNEQ(regValue, unless)), + newLocal(dummy, expressions.makeNEQforced(regValue, unless)), branchOnCauCmpResult, store, fakeCtrlDep, @@ -611,7 +611,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? - Local localOp = newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())); Store store = newRMWStoreExclusiveWithMo(address, dummy, true, mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : ""); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java index 80b4d45f23..1739e0a1db 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; @@ -163,11 +164,18 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Expression address = e.getAddress(); Load load = newRMWLoad(resultRegister, address); +// return tagList(eventSequence( +// load, +// newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())), +// newRMWStore(load, address, dummyReg) +// )); return tagList(eventSequence( load, - newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())), + newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister,e.getOperator(),e.getOperand()),dummyReg.getType())), newRMWStore(load, address, dummyReg) )); + + } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java index f26b46853b..e042875774 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java @@ -68,9 +68,7 @@ public void setThread(Thread thread) { tid = newTid; builtIn.setThreadId(tid); registerMapping = function.getRegisters().stream().collect( - toMap(r -> r, r -> { - return thread.getOrNewRegister(r.getName(),r.getType()); - })); + toMap(r -> r, r -> thread.getOrNewRegister(r.getName(),r.getType()))); nonDetMapping = new HashMap<>(); } From eef1112fe9e2736fbb7f82700a41fa32d0fd3120 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 18 Nov 2025 22:01:31 +0100 Subject: [PATCH 025/109] added pointer simplification --- .../expression/processing/ExprSimplifier.java | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index c50058a9d6..25ee846a94 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -11,6 +11,9 @@ import com.dat3m.dartagnan.expression.booleans.*; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.NullLiteral; +import com.dat3m.dartagnan.expression.pointer.PointerCmpOp; +import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; import com.dat3m.dartagnan.expression.utils.IntegerHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; import com.google.common.base.VerifyException; @@ -186,6 +189,61 @@ public Expression visitIntCmpExpression(IntCmpExpr cmp) { return expressions.makeIntCmp(left, op, right); } + @Override + public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { + final Expression rewrite = tryGeneralRewrite(cmp); + if (rewrite != null) { + return rewrite; + } + + final Expression l = cmp.getLeft().accept(this); + final Expression r = cmp.getRight().accept(this); + + // Normalize "x > y" to "y < x" (and similar). + final boolean swap = switch (cmp.getKind()) { + case GTE, GT -> true; + default -> false; + }; + final PointerCmpOp op = swap ? cmp.getKind().reverse() : cmp.getKind(); + final Expression left = swap ? r : l; + final Expression right = swap ? l : r; + + // ------- Operations on same value ------- + if (aggressive && left.equals(right)) { + return expressions.makeValue(!op.isStrict()); + } + + // ------- Operations with constants ------- + if (left instanceof NullLiteral && right instanceof NullLiteral) { + final boolean cmpResult = switch (op) { + case EQ -> true; + case NEQ -> false; + default -> + throw new VerifyException(String.format("Unexpected comparison operator '%s'.", op)); + }; + return expressions.makeValue(cmpResult); + } + + // ------- Operations on memory objects ------- + if (left instanceof MemoryObject lMem && right instanceof MemoryObject rMem) { + final boolean sameObj = lMem.equals(rMem); + + final Boolean cmpResult = switch (op) { + case EQ -> sameObj; + case NEQ -> !sameObj; + case LT-> sameObj ? false : null; + case LTE -> sameObj ? true : null; + default -> + throw new VerifyException(String.format("Unexpected comparison operator '%s'. Missing normalization?", op)); + }; + + if (cmpResult != null) { + return expressions.makeValue(cmpResult); + } + } + + return expressions.makePtrCmp(left, op, right); + } @Override public Expression visitIntSizeCastExpression(IntSizeCast expr) { From 35005fcf7dd2b9595391ba76a5a8bed00dfd882c Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 19 Nov 2025 20:50:16 +0100 Subject: [PATCH 026/109] pthread tests pass in 2.timeout --- .../expression/pointer/PointerCmpOp.java | 23 +++++++++++++++++++ .../program/processing/Intrinsics.java | 12 +++++----- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java index a0c164fbb4..3203e105f0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java @@ -1,6 +1,7 @@ package com.dat3m.dartagnan.expression.pointer; import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.integers.IntCmpOp; public enum PointerCmpOp implements ExpressionKind { EQ, NEQ, GTE, LTE, GT, LT; @@ -31,5 +32,27 @@ public PointerCmpOp inverted() { case LT -> GTE; }; } + public PointerCmpOp reverse() { + return switch (this) { + case EQ, NEQ -> this; + case GTE -> LTE; + case LTE -> GTE; + case GT -> LT; + case LT -> GT; + }; + } + public boolean isStrict() { + return switch (this) { + case NEQ, LT, GT -> true; + case EQ, LTE, GTE -> false; + }; + } + + public boolean isLessCategory() { + return switch (this) { + case LT, LTE-> true; + default -> false; + }; + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index c95ea7c3d8..6de422d6a3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -713,14 +713,14 @@ private List inlinePthreadKeyCreate(FunctionCall call) { final Program program = call.getFunction().getProgram(); final long threadCount = program.getThreads().size(); final int pointerBytes = types.getMemorySizeInBytes(types.getPointerType()); - final Register storageAddressRegister = call.getFunction().newRegister(types.getArchType()); + final Register storageAddressRegister = call.getFunction().newRegister(types.getPointerType()); final Expression size = expressions.makeValue((threadCount + 1) * pointerBytes, types.getArchType()); final Expression destructorOffset = expressions.makeValue(threadCount * pointerBytes, types.getArchType()); //TODO call destructor at each thread's normal exit return List.of( EventFactory.newAlloc(storageAddressRegister, types.getArchType(), size, true, true), newStore(keyAddress, storageAddressRegister), - newStore(expressions.makeAdd(storageAddressRegister, destructorOffset), destructor), + newStore(expressions.makePtrAdd(storageAddressRegister, destructorOffset), destructor), assignSuccess(errorRegister) ); } @@ -741,9 +741,9 @@ private List inlinePthreadGetSpecific(FunctionCall call) { final Register result = getResultRegisterAndCheckArguments(1, call); final Expression key = call.getArguments().get(0); final int threadID = call.getThread().getId(); - final Expression offset = expressions.makeValue(threadID, (IntegerType) key.getType()); + final Expression offset = expressions.makeValue(threadID, types.getArchType()); return List.of( - EventFactory.newLoad(result, expressions.makeAdd(key, offset)) + EventFactory.newLoad(result, expressions.makePtrAdd(expressions.makePtrCast(key,types.getPointerType()), offset)) ); } @@ -753,9 +753,9 @@ private List inlinePthreadSetSpecific(FunctionCall call) { final Expression key = call.getArguments().get(0); final Expression value = call.getArguments().get(1); final int threadID = call.getThread().getId(); - final Expression offset = expressions.makeValue(threadID, (IntegerType) key.getType()); + final Expression offset = expressions.makeValue(threadID, types.getArchType()); return List.of( - newStore(expressions.makeAdd(key, offset), value), + newStore(expressions.makePtrAdd(expressions.makePtrCast(key,types.getPointerType()), offset), value), // this cast is not a good idea todo discuss it assignSuccess(errorRegister) ); } From 4139da81da8f85d8f67bf35ec3cafb0086f5cf0e Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 19 Nov 2025 21:55:08 +0100 Subject: [PATCH 027/109] fixed some asm problems and ptrCmp refactoring --- .../dartagnan/expression/ExpressionFactory.java | 11 +++++------ .../dartagnan/expression/pointer/PtrCmpExpr.java | 4 ++-- .../pointer/{PointerCmpOp.java => PtrCmpOp.java} | 7 +++---- .../expression/processing/ExprSimplifier.java | 4 ++-- .../parsers/program/visitors/VisitorAsmArm.java | 14 ++++++++++---- .../parsers/program/visitors/VisitorLlvm.java | 2 +- .../processing/NaiveLoopBoundAnnotation.java | 3 --- .../SparseConditionalConstantPropagation.java | 2 +- 8 files changed, 24 insertions(+), 23 deletions(-) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/{PointerCmpOp.java => PtrCmpOp.java} (86%) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index d5d0a0af19..6c863aaa3b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -9,7 +9,6 @@ import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; -import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.memory.MemoryObject; import com.dat3m.dartagnan.program.memory.ScopedPointer; import com.dat3m.dartagnan.program.memory.ScopedPointerVariable; @@ -422,7 +421,7 @@ public Expression makeNullLiteral() { return makeNullLiteral(types.getPointerType()); } - public Expression makePtrCmp(Expression left, PointerCmpOp op, Expression right) { + public Expression makePtrCmp(Expression left, PtrCmpOp op, Expression right) { return new PtrCmpExpr(types.getBooleanType(), left, op, right); } @@ -496,7 +495,7 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { } else if (type instanceof IntegerType) { return makeIntCmp(leftOperand, IntCmpOp.EQ, rightOperand); } if (type instanceof PointerType) { - return makePtrCmp(leftOperand, PointerCmpOp.EQ, rightOperand); + return makePtrCmp(leftOperand, PtrCmpOp.EQ, rightOperand); }else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? return makeFloatCmp(leftOperand, FloatCmpOp.OEQ, rightOperand); @@ -524,7 +523,7 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { } else if (type instanceof IntegerType) { return makeIntCmp(leftOperand, IntCmpOp.NEQ, rightOperand); } if (type instanceof PointerType) { - return makePtrCmp(leftOperand, PointerCmpOp.NEQ, rightOperand); + return makePtrCmp(leftOperand, PtrCmpOp.NEQ, rightOperand); }else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? return makeFloatCmp(leftOperand, FloatCmpOp.ONEQ, rightOperand); @@ -566,7 +565,7 @@ public Expression makeBinary(Expression x, ExpressionKind op, Expression y) { return makeFloatBinary(x, floatOp, y); } else if (op instanceof IntCmpOp cmpOp) { return makeCompare(x, cmpOp, y); - }else if (op instanceof PointerCmpOp cmpOp) { + }else if (op instanceof PtrCmpOp cmpOp) { return makeCompare(x, cmpOp, y); } throw new UnsupportedOperationException(String.format("Expression kind %s is no binary operator.", op)); @@ -579,7 +578,7 @@ public Expression makeCompare(Expression x, ExpressionKind cmpOp, Expression y) return makeFloatCmp(x, floatOp, y); } else if (cmpOp instanceof AggregateCmpOp aggrCmpOp) { return makeAggregateCmp(x, aggrCmpOp, y); - }else if (cmpOp instanceof PointerCmpOp ptrCmpOp) { + }else if (cmpOp instanceof PtrCmpOp ptrCmpOp) { return makePtrCmp(x, ptrCmpOp, y); } throw new UnsupportedOperationException(String.format("Expression kind %s is no comparison operator.", cmpOp)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java index 8b2a392847..436862b5bf 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java @@ -7,9 +7,9 @@ import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; -public final class PtrCmpExpr extends BinaryExpressionBase { +public final class PtrCmpExpr extends BinaryExpressionBase { - public PtrCmpExpr(BooleanType type, Expression left, PointerCmpOp kind, Expression right) { + public PtrCmpExpr(BooleanType type, Expression left, PtrCmpOp kind, Expression right) { super(type, kind, left, right); ExpressionHelper.checkSameExpectedType(left, right, PointerType.class); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpOp.java similarity index 86% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpOp.java index 3203e105f0..443a071bd5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerCmpOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpOp.java @@ -1,9 +1,8 @@ package com.dat3m.dartagnan.expression.pointer; import com.dat3m.dartagnan.expression.ExpressionKind; -import com.dat3m.dartagnan.expression.integers.IntCmpOp; -public enum PointerCmpOp implements ExpressionKind { +public enum PtrCmpOp implements ExpressionKind { EQ, NEQ, GTE, LTE, GT, LT; @Override @@ -22,7 +21,7 @@ public String getSymbol() { case LT -> "<"; }; } - public PointerCmpOp inverted() { + public PtrCmpOp inverted() { return switch (this) { case EQ -> NEQ; case NEQ -> EQ; @@ -32,7 +31,7 @@ public PointerCmpOp inverted() { case LT -> GTE; }; } - public PointerCmpOp reverse() { + public PtrCmpOp reverse() { return switch (this) { case EQ, NEQ -> this; case GTE -> LTE; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 25ee846a94..8c8d3e1b8c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -12,7 +12,7 @@ import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.pointer.NullLiteral; -import com.dat3m.dartagnan.expression.pointer.PointerCmpOp; +import com.dat3m.dartagnan.expression.pointer.PtrCmpOp; import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; import com.dat3m.dartagnan.expression.utils.IntegerHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; @@ -204,7 +204,7 @@ public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { case GTE, GT -> true; default -> false; }; - final PointerCmpOp op = swap ? cmp.getKind().reverse() : cmp.getKind(); + final PtrCmpOp op = swap ? cmp.getKind().reverse() : cmp.getKind(); final Expression left = swap ? r : l; final Expression right = swap ? l : r; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index bbdaf7104f..f896cce686 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -10,7 +10,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntCmpOp; -import com.dat3m.dartagnan.expression.pointer.PointerCmpOp; +import com.dat3m.dartagnan.expression.pointer.PtrCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.parsers.AsmArmBaseVisitor; @@ -277,9 +277,15 @@ public Object visitCompare(AsmArmParser.CompareContext ctx) { public Object visitCompareBranchNonZero(AsmArmParser.CompareBranchNonZeroContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); Register firstRegister = (Register) ctx.register().accept(this); - Expression zero = expressions.makeZero((IntegerType) firstRegister.getType()); - Expression expr = expressions.makeIntCmp(firstRegister, IntCmpOp.NEQ, zero); - asmInstructions.add(EventFactory.newJump(expr, label)); + if (firstRegister.getType() instanceof PointerType){ + Expression zero = expressions.makeNullLiteral( (PointerType) firstRegister.getType()); + Expression expr = expressions.makePtrCmp(firstRegister, PtrCmpOp.NEQ, zero); + asmInstructions.add(EventFactory.newJump(expr, label)); + }else{ + Expression zero = expressions.makeZero( (IntegerType) firstRegister.getType()); + Expression expr = expressions.makeIntCmp(firstRegister, IntCmpOp.NEQ, zero); + asmInstructions.add(EventFactory.newJump(expr, label)); + } return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index e80c6ca85b..8f462d86c3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -1072,7 +1072,7 @@ private Expression checkExpression(Type type, ParserRuleContext context) { private Expression castExpression(TypeConstContext operand, TypeContext target, boolean signed) { final Expression operandExpression = visitTypeConst(operand); final Type targetType = parseType(target); - // checkSupport(targetType instanceof IntegerType, "Non-integer type %s.", target); + checkSupport(targetType instanceof IntegerType || targetType instanceof PointerType, "Non integer or pointer type %s.", target); return expressions.makeCast(operandExpression, targetType, signed); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java index 3d5b9cee85..d31e015ead 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java @@ -4,9 +4,6 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.NullLiteral; -import com.dat3m.dartagnan.expression.pointer.PointerCmpOp; -import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.analysis.DominatorAnalysis; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java index 776f9af7de..bc716b4172 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java @@ -5,7 +5,6 @@ import com.dat3m.dartagnan.expression.integers.IntLiteral; import com.dat3m.dartagnan.expression.pointer.NullLiteral; import com.dat3m.dartagnan.expression.processing.ExprSimplifier; -import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; import com.dat3m.dartagnan.program.Register; @@ -136,6 +135,7 @@ public void run(Function func) { final Expression expr = local.getExpr(); final Expression valueToPropagate = checkDoPropagate.test(expr) ? expr : null; propagationMap.compute(local.getResultRegister(), (k, v) -> valueToPropagate); + } else if (cur instanceof ThreadArgument arg) { // Propagate constant arguments passed across threads final Expression expr = arg.getCreator().getArguments().get(arg.getIndex()); From 02be40e85784b8e784b0aa5963123c257d1770cd Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 22 Nov 2025 18:21:41 +0100 Subject: [PATCH 028/109] improved pointer casts --- .../expression/ExpressionFactory.java | 17 +++----- .../expression/ExpressionVisitor.java | 1 + .../expression/pointer/PtrSizeCast.java | 43 +++++++++++++++++++ .../visitors/VisitorLitmusAArch64.java | 4 +- .../program/visitors/VisitorLitmusC.java | 2 +- .../program/processing/Inlining.java | 2 +- .../program/processing/Intrinsics.java | 4 +- .../dartagnan/program/processing/Tearing.java | 3 +- .../dartagnan/smt/FormulaManagerExt.java | 5 +++ 9 files changed, 63 insertions(+), 18 deletions(-) create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 6c863aaa3b..2d94856edd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -392,9 +392,11 @@ public Expression makePtrAdd(Expression base, Expression offset) { public Expression makePtrCast(Expression base,PointerType type){ if (base.getType() instanceof PointerType ) { return base; + // todo is ptr size cast needed for mixed arm } if (base.getType() instanceof IntegerType) { - return makeIntToPtrCast(makeCast(base, types.getArchType())); + int bw = ((IntegerType) base.getType()).getBitWidth(); + return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),types.getPointerType(bw)); } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } @@ -412,7 +414,6 @@ public Expression makeIntToPtrCast(Expression operand) { return new IntToPtrCast(types.getPointerType(), operand); } - public Expression makeNullLiteral(PointerType pointerType) { return new NullLiteral(pointerType); } @@ -464,18 +465,14 @@ public Expression makeGeneralZero(Type type) { } public Expression makeCast(Expression expression, Type type, boolean signed) { - if (expression.getType().equals(type)) { - return expression; - } - - if (type instanceof BooleanType) { - return makeBooleanCast(expression); - } else if (type instanceof IntegerType integerType) { + if (expression.getType().equals(type)) {return expression;} + if (type instanceof BooleanType) {return makeBooleanCast(expression);} + else if (type instanceof IntegerType integerType) { return makeIntegerCast(expression, integerType, signed); } else if (type instanceof FloatType floatType) { return makeFloatCast(expression, floatType, signed); }else if (type instanceof PointerType) { - return makeIntToPtrCast(makeCast(expression, types.getArchType())); + return makePtrCast(expression, (PointerType) type); } throw new UnsupportedOperationException(String.format("Cast %s into %s unsupported.", expression, type)); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index f7f27e4465..54add7318d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -65,6 +65,7 @@ public interface ExpressionVisitor { default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } default TRet visitPtrConcat(PtrConcat expr){ return visitExpression(expr); }; default TRet visitPtrExtract(PtrExtract expr){ return visitUnaryExpression(expr); }; + default TRet visitPtrSizeCastExpression(PtrSizeCast expr){return visitCastExpression(expr); }; // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java new file mode 100644 index 0000000000..ccd5a6d8b6 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java @@ -0,0 +1,43 @@ +package com.dat3m.dartagnan.expression.pointer; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.CastExpressionBase; +import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; + +public final class PtrSizeCast extends CastExpressionBase { + + private final boolean preserveSign; + + public PtrSizeCast(PointerType targetType, Expression operand, boolean preserveSign) { + super(targetType, operand); + ExpressionHelper.checkExpectedType(operand, PointerType.class); + this.preserveSign = (preserveSign && isExtension()) || isNoop(); + } + + public boolean isTruncation() { + return isExtension(getTargetType(), getSourceType()); + } + + public boolean isExtension() { + return isExtension(getSourceType(), getTargetType()); + } + + public boolean isNoop() { + return getSourceType().equals(getTargetType()); + } + + public boolean preservesSign() { + return preserveSign; + } + + private static boolean isExtension(PointerType sourceType, PointerType targetType) { + return sourceType.getBitWidth() < targetType.getBitWidth(); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitPtrSizeCastExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java index 19ef9b902a..c35f479a5c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java @@ -182,7 +182,7 @@ public Object visitLoad(LoadContext ctx) { final Register register = shrinkRegister(r64, ctx.rD32, inst.halfWordSize, inst.byteSize); final Expression address = parseAddress(ctx.address()); final String mo = inst.acquire ? MO_ACQ : ""; - add(EventFactory.newLoadWithMo(register, expressions.makePtrCast(address,pointerType), mo)); + add(EventFactory.newLoadWithMo(register, expressions.makeCast(address,pointerType), mo)); addRegister64Update(r64, register); return null; } @@ -389,7 +389,7 @@ private Expression parseExpression(Expr32Context x32, Expr64Context x64) { private Expression parseAddress(AddressContext ctx) { final Register base = programBuilder.getOrErrorRegister(mainThread, ctx.register64().id); if (ctx.offset() == null) { - return expressions.makePtrCast(base,pointerType); + return expressions.makeCast(base,pointerType); } final ExpressionConversionContext conversion = ctx.offset().expressionConversion(); final Register32Context register32 = conversion == null ? null : conversion.register32(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 05c48e3aa2..964076976e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -588,7 +588,7 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ Expression value = (Expression)ctx.re().accept(this); if(variable instanceof MemoryObject || variable instanceof Register){ - Event event = EventFactory.newStoreWithMo(variable, expressions.makePtrCast(value,pointerType), C11.NONATOMIC); + Event event = EventFactory.newStoreWithMo(variable, expressions.makeCast(value,pointerType), C11.NONATOMIC); if (isOpenCL) { event.addTags(Tag.OpenCL.DEFAULT_WEAK_SCOPE); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java index e0b7ed86ca..28e093ad34 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java @@ -135,7 +135,7 @@ private static Event inlineBody(FunctionCall call, Snapshot callTarget, int scop for (int j = 0; j < callTarget.parameters.size(); j++) { final Register register = registerMap.get(callTarget.parameters.get(j)); if (register.getType() instanceof PointerType) { - Expression v = expressions.makePtrCast(arguments.get(j),(PointerType) register.getType()); + Expression v = expressions.makeCast(arguments.get(j),(PointerType) register.getType()); parameterAssignments.add(newLocal(register, v)); }else{ Expression v = arguments.get(j); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index 6de422d6a3..e8516294a4 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -743,7 +743,7 @@ private List inlinePthreadGetSpecific(FunctionCall call) { final int threadID = call.getThread().getId(); final Expression offset = expressions.makeValue(threadID, types.getArchType()); return List.of( - EventFactory.newLoad(result, expressions.makePtrAdd(expressions.makePtrCast(key,types.getPointerType()), offset)) + EventFactory.newLoad(result, expressions.makePtrAdd(expressions.makeCast(key,types.getPointerType()), offset)) ); } @@ -755,7 +755,7 @@ private List inlinePthreadSetSpecific(FunctionCall call) { final int threadID = call.getThread().getId(); final Expression offset = expressions.makeValue(threadID, types.getArchType()); return List.of( - newStore(expressions.makePtrAdd(expressions.makePtrCast(key,types.getPointerType()), offset), value), // this cast is not a good idea todo discuss it + newStore(expressions.makePtrAdd(expressions.makeCast(key,types.getPointerType()), offset), value), // this cast does not seem like a good idea todo discuss it assignSuccess(errorRegister) ); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index 062a364422..2925a1e925 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -219,8 +219,7 @@ private List createTransaction(Load load, List offsets) { private List createTransaction(Store store, List offsets, Map> map, boolean bigEndian) { final int bytes = checkBytes(store, offsets); final List replacement = new ArrayList<>(); - final PointerType addressType = checkPointerType(store.getAddress().getType(), - "Non-Pointer address in '%s'", store); + checkPointerType(store.getAddress().getType(),"Non-Pointer address in '%s'", store); checkType(store.getAccessType(), "Non-integer or Pointer mixed-size access in '%s'", store); final Function function = store.getFunction(); final Register addressRegister = toRegister(store.getAddress(), function, replacement); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/smt/FormulaManagerExt.java b/dartagnan/src/main/java/com/dat3m/dartagnan/smt/FormulaManagerExt.java index cf22aeb622..c98e9f2d7f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/smt/FormulaManagerExt.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/smt/FormulaManagerExt.java @@ -62,6 +62,11 @@ public boolean hasSameType(Formula left, Formula right) { return false; } + public BooleanFormula isZeroBitVector(BitvectorFormula formula) { + BitvectorFormulaManager bvfm = fmgr.getBitvectorFormulaManager(); + return bvfm.equal(bvfm.makeBitvector(bvfm.getLength(formula),0), formula); + } + public BooleanFormula equal(Formula left, Formula right) { Preconditions.checkArgument(hasSameType(left, right)); From 8d5c7667263030c627c81d561c9c065fef7511c5 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 23 Nov 2025 20:21:04 +0100 Subject: [PATCH 029/109] added pointer addition simplification --- .../dartagnan/encoding/ExpressionEncoder.java | 46 +++++++++++++------ .../expression/ExpressionFactory.java | 15 +++--- .../expression/ExpressionPrinter.java | 2 +- .../expression/ExpressionVisitor.java | 2 +- .../{PointerAddExpr.java => PtrAddExpr.java} | 7 ++- .../expression/processing/ExprSimplifier.java | 22 ++++++++- .../processing/ExprTransformer.java | 2 +- .../expression/type/PointerType.java | 1 + .../expression/type/TypeFactory.java | 1 + 9 files changed, 70 insertions(+), 28 deletions(-) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/{PointerAddExpr.java => PtrAddExpr.java} (82%) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index d4916eae04..b94bd96ba8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -75,13 +75,13 @@ private BitvectorFormulaManager bitvectorFormulaManager() { @SuppressWarnings("unchecked") public TypedFormula encodeBooleanAt(Expression expression, Event at) { - Preconditions.checkArgument(expression.getType() instanceof BooleanType); + checkArgument(expression.getType() instanceof BooleanType); return (TypedFormula) encodeAt(expression, at); } @SuppressWarnings("unchecked") public TypedFormula encodeBooleanFinal(Expression expression) { - Preconditions.checkArgument(expression.getType() instanceof BooleanType); + checkArgument(expression.getType() instanceof BooleanType); return (TypedFormula) encodeFinal(expression); } @@ -93,10 +93,10 @@ public TypedFormula encodeBooleanFinal(Expression e variable = context.useIntegers ? integerFormulaManager().makeVariable(name) : bitvectorFormulaManager().makeVariable(integerType.getBitWidth(), name); - }else if (type instanceof PointerType) { + }else if (type instanceof PointerType pointerType) { variable = context.useIntegers ? integerFormulaManager().makeVariable(name) - : bitvectorFormulaManager().makeVariable(types.getArchType().getBitWidth(), name); + : bitvectorFormulaManager().makeVariable(pointerType.getBitWidth(), name); } else if (type instanceof AggregateType aggType) { final List fields = new ArrayList<>(aggType.getFields().size()); for (TypeOffset field : aggType.getFields()) { @@ -104,7 +104,7 @@ public TypedFormula encodeBooleanFinal(Expression e } variable = fmgr.getTupleFormulaManager().makeTuple(fields); } else if (type instanceof ArrayType arrType) { - Preconditions.checkArgument(arrType.hasKnownNumElements(), "Cannot encode array of unknown size."); + checkArgument(arrType.hasKnownNumElements(), "Cannot encode array of unknown size."); final List elements = new ArrayList<>(arrType.getNumElements()); for (int i = 0; i < arrType.getNumElements(); i++) { elements.add(makeVariable(name + "[" + i + "]", arrType.getElementType()).formula()); @@ -176,7 +176,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodeIntegerExpr(Expression expression) { - Preconditions.checkArgument(expression.getType() instanceof IntegerType); + checkArgument(expression.getType() instanceof IntegerType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof IntegerFormula || typedFormula.formula() instanceof BitvectorFormula; @@ -194,7 +194,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodeBooleanExpr(Expression expression) { - Preconditions.checkArgument(expression.getType() instanceof BooleanType); + checkArgument(expression.getType() instanceof BooleanType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof BooleanFormula; @@ -203,7 +203,7 @@ public TypedFormula encodeBooleanExpr(Expression ex @SuppressWarnings("unchecked") public TypedFormula encodeAggregateExpr(Expression expression) { - Preconditions.checkArgument(ExpressionHelper.isAggregateLike(expression)); + checkArgument(ExpressionHelper.isAggregateLike(expression)); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof TupleFormula; @@ -474,7 +474,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitIntConcat(IntConcat expr) { - Preconditions.checkArgument(!expr.getOperands().isEmpty()); + checkArgument(!expr.getOperands().isEmpty()); final List> operands = expr.getOperands().stream() .map(this::encodeIntegerExpr) .toList(); @@ -519,7 +519,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp // Pointers @Override - public TypedFormula visitPointerAddExpression(PointerAddExpr expr) { + public TypedFormula visitPtrAddExpression(PtrAddExpr expr) { final TypedFormula base = encodePointerExpr(expr.getBase()); final TypedFormula offset = encodeIntegerExpr(expr.getOffset()); @@ -534,7 +534,6 @@ public TypedFormula visitIntCmpExpression(IntCmpExp return new TypedFormula<>(base.getType(), bitvectorFormulaManager().add(baseForm, offsetForm)); } - } @Override @@ -565,6 +564,14 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { final TypedFormula address = encodeIntegerExpr(expr.getOperand()); + if (!context.useIntegers) { + int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); + int pbw = expr.getType().getBitWidth(); + if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() + .extend(((BitvectorFormula) address.formula()), pbw - ibw,false)); + }} + return new TypedFormula<>(expr.getType(), address.formula()); } @@ -585,12 +592,23 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp }; return new TypedFormula<>(types.getBooleanType(), result); }else{ + final int nullLocation = expr.getLeft() instanceof NullLiteral ? 1 : ( expr.getRight() instanceof NullLiteral ? 2 : 0); // 0 means no nullpointer final BitvectorFormula left = (BitvectorFormula) encodePointerExpr(expr.getLeft()).formula(); final BitvectorFormula right = (BitvectorFormula) encodePointerExpr(expr.getRight()).formula(); final BitvectorFormulaManager bvgr = bitvectorFormulaManager(); final BooleanFormula result = switch (expr.getKind()) { - case EQ -> bvgr.equal(left, right); - case NEQ -> bmgr.not(fmgr.equal(left, right)); + case EQ -> switch (nullLocation) { + case 0 -> bvgr.equal(left, right); + case 1 -> fmgr.isZeroBitVector(right); + case 2 -> fmgr.isZeroBitVector(left); + default -> throw new IllegalStateException(); + }; + case NEQ -> bmgr.not(switch (nullLocation) { + case 0 -> bvgr.equal(left, right); + case 1 -> fmgr.isZeroBitVector(right); + case 2 -> fmgr.isZeroBitVector(left); + default -> throw new IllegalStateException(); + }); case LT -> bvgr.lessThan(left, right,false); case LTE -> bvgr.lessOrEquals(left, right,false); case GT -> bvgr.greaterThan(left, right,false); @@ -629,7 +647,7 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp @Override public TypedFormula visitPtrConcat(PtrConcat expr) { - Preconditions.checkArgument(!expr.getOperands().isEmpty()); + checkArgument(!expr.getOperands().isEmpty()); final List> operands = expr.getOperands().stream() .map(this::encodePointerExpr) .toList(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 2d94856edd..64c793a81d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -386,32 +386,35 @@ public ScopedPointerVariable makeScopedPointerVariable(String id, ScopedPointerT } public Expression makePtrAdd(Expression base, Expression offset) { - return new PointerAddExpr(base, offset); + return new PtrAddExpr(base, offset); } - public Expression makePtrCast(Expression base,PointerType type){ + public Expression makePtrCast(Expression base, PointerType type, boolean tearing){ if (base.getType() instanceof PointerType ) { return base; // todo is ptr size cast needed for mixed arm } if (base.getType() instanceof IntegerType) { int bw = ((IntegerType) base.getType()).getBitWidth(); - return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),types.getPointerType(bw)); + // this causes problems in tearing if the pointer is not of the int size + return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing?types.getPointerType(bw):types.getPointerType()); } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } - public Expression makePtrToIntCast(Expression pointer) { return new PtrToIntCast(types.getArchType(), pointer); } +// public Expression makePtrToIntCast(Expression pointer, IntegerType type) { +// return new PtrToIntCast(type, pointer); +// } public Expression makeIntToPtrCast(Expression operand, PointerType pointerType) { return new IntToPtrCast(pointerType, operand); } public Expression makeIntToPtrCast(Expression operand) { - return new IntToPtrCast(types.getPointerType(), operand); + return makeIntToPtrCast(operand, types.getPointerType()); } public Expression makeNullLiteral(PointerType pointerType) { @@ -472,7 +475,7 @@ else if (type instanceof IntegerType integerType) { } else if (type instanceof FloatType floatType) { return makeFloatCast(expression, floatType, signed); }else if (type instanceof PointerType) { - return makePtrCast(expression, (PointerType) type); + return makePtrCast(expression, (PointerType) type, false); // todo fix for tearing(mixed test), maybe a teared pointer tracker. } throw new UnsupportedOperationException(String.format("Cast %s into %s unsupported.", expression, type)); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java index 9e0fcc77e8..0205506ec6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java @@ -136,7 +136,7 @@ public String visitPtrToIntCastExpression(PtrToIntCast expr) { } @Override - public String visitPointerAddExpression(PointerAddExpr expr) { + public String visitPtrAddExpression(PtrAddExpr expr) { return String.format("%s + %s", visit(expr.getBase()), visit(expr.getOffset())); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 54add7318d..9c0ada4429 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -58,7 +58,7 @@ public interface ExpressionVisitor { // =================================== Pointer =================================== default TRet visitGEPExpression(GEPExpr expr) { return visitExpression(expr); } - default TRet visitPointerAddExpression(PointerAddExpr expr) { return visitExpression(expr); } + default TRet visitPtrAddExpression(PtrAddExpr expr) { return visitExpression(expr); } default TRet visitIntToPtrCastExpression(IntToPtrCast expr) { return visitCastExpression(expr); } default TRet visitPtrToIntCastExpression(PtrToIntCast expr) { return visitCastExpression(expr); } default TRet visitPtrCmpExpression(PtrCmpExpr expr) { return visitBinaryExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java similarity index 82% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java index 9e5c01f19c..8c6b591102 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PointerAddExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java @@ -6,16 +6,15 @@ import com.dat3m.dartagnan.expression.base.ExpressionBase; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; -import com.dat3m.dartagnan.expression.type.TypeFactory; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; -public class PointerAddExpr extends ExpressionBase { +public class PtrAddExpr extends ExpressionBase { private final Expression base; private final Expression offset; - public PointerAddExpr(Expression base, Expression offset) { + public PtrAddExpr(Expression base, Expression offset) { super((PointerType) base.getType()); Preconditions.checkArgument(offset.getType() instanceof IntegerType); this.base = base; @@ -37,6 +36,6 @@ public ExpressionKind getKind() { @Override public T accept(ExpressionVisitor visitor) { - return visitor.visitPointerAddExpression(this); + return visitor.visitPtrAddExpression(this); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 8c8d3e1b8c..c636d739bd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -13,7 +13,9 @@ import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.pointer.NullLiteral; import com.dat3m.dartagnan.expression.pointer.PtrCmpOp; +import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.utils.IntegerHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; import com.google.common.base.VerifyException; @@ -343,7 +345,25 @@ public Expression visitIntBinaryExpression(IntBinaryExpr expr) { return expressions.makeIntBinary(left, op, right); } - // TODO: Add simplifications for IntExtract and IntConcat expressions + @Override + public Expression visitPtrAddExpression(PtrAddExpr expr) { + + final Expression base = expr.getBase().accept(this); + final Expression offset = expr.getOffset().accept(this); + + // Optimizations for "x op constant" + if (offset instanceof IntLiteral lit) { + if(lit.isZero()){return base;} + } + // fixme tearing problem + if (base instanceof NullLiteral) { + return expressions.makeIntToPtrCast(offset); + } + return expressions.makePtrAdd(base, offset); + } + + // TODO: Add simplifications for IntExtract and IntConcat expressions. + // TODO: Simplify int to ptr to int and so forth. @Override public Expression visitITEExpression(ITEExpr expr) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index b4051dab9b..88551079e9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -121,7 +121,7 @@ public Expression visitAggregateCmpExpression(AggregateCmpExpr expr) { @Override - public Expression visitPointerAddExpression(PointerAddExpr expr) { + public Expression visitPtrAddExpression(PtrAddExpr expr) { return expressions.makePtrAdd( expr.getBase().accept(this), expr.getOffset().accept(this) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index 4adadd85a5..02cff5d9fa 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -5,6 +5,7 @@ public class PointerType implements Type { public int bitWidth; + public boolean teared; // todo change the encoding to recognise bit width diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 547957e06d..c4bfd47842 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -44,6 +44,7 @@ public BooleanType getBooleanType() { public PointerType getPointerType() { return pointerType; } + public PointerType getPointerType(int bitWidth) { // to be used in tearing checkArgument(bitWidth > 0, "Non-positive bit width %s.", bitWidth); From 0a0f0515470ed51e7226d51fee5ddceb54e25b9c Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 23 Nov 2025 22:44:24 +0100 Subject: [PATCH 030/109] restructuring of ptr <-> int encoding --- .../dartagnan/encoding/ExpressionEncoder.java | 55 ++++++++++--------- .../expression/ExpressionFactory.java | 23 +++++--- .../expression/pointer/PtrAddExpr.java | 1 - .../expression/processing/ExprSimplifier.java | 47 ++++++++++++++-- .../processing/ExprTransformer.java | 2 +- 5 files changed, 86 insertions(+), 42 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index b94bd96ba8..db2d25fbe2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -539,38 +539,41 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitPtrToIntCastExpression(PtrToIntCast expr) { final TypedFormula inner = encodePointerExpr(expr.getOperand()); - final Formula enc; - if (context.useIntegers) { - if (expr.isExtension()) { - enc = inner.formula(); - }else { - final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); - final IntegerFormulaManager imgr = integerFormulaManager(); - enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue));} - } else { - assert inner.formula() instanceof BitvectorFormula; - final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); - final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); - final int targetBitWidth = expr.getTargetType().getBitWidth(); - final int sourceBitWidth = expr.getSourceType().getBitWidth(); - assert (sourceBitWidth == bvmgr.getLength(innerBv)); - enc = expr.isExtension() - ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) - : bvmgr.extract(innerBv, targetBitWidth - 1, 0); - } + final Formula enc = inner.formula(); + +// final Formula enc; +// if (context.useIntegers) { +// if (expr.isExtension()) { +// enc = inner.formula(); +// }else { +// final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); +// final IntegerFormulaManager imgr = integerFormulaManager(); +// enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue));} +// } else { +// assert inner.formula() instanceof BitvectorFormula; +// final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); +// final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); +// final int targetBitWidth = expr.getTargetType().getBitWidth(); +// final int sourceBitWidth = expr.getSourceType().getBitWidth(); +// assert (sourceBitWidth == bvmgr.getLength(innerBv)); +// enc = expr.isExtension() +// ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) +// : bvmgr.extract(innerBv, targetBitWidth - 1, 0); +// } return new TypedFormula<>(expr.getType(), enc); } @Override public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { final TypedFormula address = encodeIntegerExpr(expr.getOperand()); - if (!context.useIntegers) { - int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); - int pbw = expr.getType().getBitWidth(); - if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() - .extend(((BitvectorFormula) address.formula()), pbw - ibw,false)); - }} + // relevant for tearing +// if (!context.useIntegers) { +// int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); +// int pbw = expr.getType().getBitWidth(); +// if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() +// .extend(((BitvectorFormula) address.formula()), pbw - ibw,false)); +// }} return new TypedFormula<>(expr.getType(), address.formula()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 64c793a81d..bacdbfd04a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -14,6 +14,7 @@ import com.dat3m.dartagnan.program.memory.ScopedPointerVariable; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; +import edu.stanford.CVC4.PrettySExprs; import java.math.BigDecimal; import java.math.BigInteger; @@ -245,7 +246,7 @@ public Expression makeIntegerCast(Expression operand, IntegerType targetType, bo } else if (sourceType instanceof FloatType) { return new FloatToIntCast(targetType, operand, signed); }else if (sourceType instanceof PointerType) { - return new PtrToIntCast(targetType, operand); + return makePtrToIntCast(operand, targetType); } throw new UnsupportedOperationException(String.format("Cannot cast %s to %s.", sourceType, targetType)); @@ -397,26 +398,32 @@ public Expression makePtrCast(Expression base, PointerType type, boolean tearing if (base.getType() instanceof IntegerType) { int bw = ((IntegerType) base.getType()).getBitWidth(); // this causes problems in tearing if the pointer is not of the int size - return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing?types.getPointerType(bw):types.getPointerType()); + return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing ? types.getPointerType(bw):types.getPointerType()); } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } + + + public Expression makePtrToIntCast(Expression pointer) { - return new PtrToIntCast(types.getArchType(), pointer); + return makePtrToIntCast(pointer, types.getArchType()); + } + public Expression makePtrToIntCast(Expression pointer, IntegerType type) { + return makeIntegerCast( new PtrToIntCast(types.getIntegerType(((PointerType)pointer.getType()).getBitWidth()), pointer), type,false); } -// public Expression makePtrToIntCast(Expression pointer, IntegerType type) { -// return new PtrToIntCast(type, pointer); -// } public Expression makeIntToPtrCast(Expression operand, PointerType pointerType) { - return new IntToPtrCast(pointerType, operand); + return new IntToPtrCast(pointerType, makeIntegerCast(operand,types.getArchType(),false)); } - public Expression makeIntToPtrCast(Expression operand) { return makeIntToPtrCast(operand, types.getPointerType()); } + + + + public Expression makeNullLiteral(PointerType pointerType) { return new NullLiteral(pointerType); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java index 8c6b591102..cef4509598 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java @@ -1,5 +1,4 @@ package com.dat3m.dartagnan.expression.pointer; - import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionKind; import com.dat3m.dartagnan.expression.ExpressionVisitor; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index c636d739bd..844700a249 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -11,10 +11,7 @@ import com.dat3m.dartagnan.expression.booleans.*; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.NullLiteral; -import com.dat3m.dartagnan.expression.pointer.PtrCmpOp; -import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; -import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; +import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.utils.IntegerHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; @@ -363,7 +360,46 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { } // TODO: Add simplifications for IntExtract and IntConcat expressions. - // TODO: Simplify int to ptr to int and so forth. + + // Simplifies (int(i) -> ptr(i)) -> int(i). + @Override + public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { + final Expression sub = expr.getOperand().accept(this); + if (sub instanceof IntToPtrCast subT){ + final int originalBitWidth = subT.getSourceType().getBitWidth(); + final int inBetweenBitWidth = subT.getTargetType().getBitWidth(); + final int finalBitWidth = expr.getType().getBitWidth(); + + if (originalBitWidth == inBetweenBitWidth && finalBitWidth == originalBitWidth ) { + return subT.getOperand(); + } + } +// if (sub instanceof NullLiteral) { +// return expressions.makeZero(expr.getType()); +// } // the problem here is that + return expressions.makePtrToIntCast(expr.getOperand(), expr.getType()); + } + + // Simplifies (ptr(i) -> int(i)) -> ptr(i). + @Override + public Expression visitIntToPtrCastExpression(IntToPtrCast expr) { + final Expression sub = expr.getOperand().accept(this); + if (sub instanceof PtrToIntCast subT){ + final int originalBitWidth = subT.getSourceType().getBitWidth(); + final int inBetweenBitWidth = subT.getTargetType().getBitWidth(); + final int finalBitWidth = expr.getType().getBitWidth(); + + if (originalBitWidth == inBetweenBitWidth && finalBitWidth == originalBitWidth ) { + return subT.getOperand(); + } + } + if (sub instanceof IntLiteral && ((IntLiteral) sub).isZero()) { + return expressions.makeNullLiteral(expr.getType()); + } + return expressions.makeIntToPtrCast(expr.getOperand(), expr.getType()); + } + + @Override public Expression visitITEExpression(ITEExpr expr) { @@ -455,7 +491,6 @@ public Expression visitAggregateCmpExpression(AggregateCmpExpr expr) { } // =================================== Helper methods =================================== - // An expression is potentially eliminable if it either carries no dependencies // or we are in aggressive mode. private boolean isPotentiallyEliminable(Expression expr) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index 88551079e9..8b63c1f2d2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -139,7 +139,7 @@ public Expression visitPtrCmpExpression(PtrCmpExpr expr) { @Override public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { - return expressions.makePtrToIntCast(expr.getOperand().accept(this)); + return expressions.makeIntegerCast(expressions.makePtrToIntCast(expr.getOperand().accept(this)),expr.getType(),false); } @Override From 3f1d54a236545523629b2d50b06260f0d583d920 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 26 Nov 2025 20:44:22 +0100 Subject: [PATCH 031/109] - improved type recognition in c11 litmus - deleted ptr size cast - function-pointer ++ --- .../expression/ExpressionFactory.java | 9 ++-- .../expression/ExpressionVisitor.java | 2 +- .../expression/pointer/PtrSizeCast.java | 43 ------------------- .../expression/processing/ExprSimplifier.java | 12 +++--- .../processing/ExprTransformer.java | 2 +- .../program/visitors/VisitorLitmusC.java | 27 +++++++++--- .../com/dat3m/dartagnan/program/Function.java | 2 +- .../program/processing/ProcessingManager.java | 4 +- .../processing/compilation/VisitorC11.java | 2 +- 9 files changed, 39 insertions(+), 64 deletions(-) delete mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index bacdbfd04a..ec355ccd96 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -393,12 +393,16 @@ public Expression makePtrAdd(Expression base, Expression offset) { public Expression makePtrCast(Expression base, PointerType type, boolean tearing){ if (base.getType() instanceof PointerType ) { return base; - // todo is ptr size cast needed for mixed arm + // todo is ptr size cast needed for mixed arm (tearing) } if (base.getType() instanceof IntegerType) { int bw = ((IntegerType) base.getType()).getBitWidth(); // this causes problems in tearing if the pointer is not of the int size return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing ? types.getPointerType(bw):types.getPointerType()); + } + if (base.getType() instanceof BooleanType) { + + } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } @@ -406,7 +410,7 @@ public Expression makePtrCast(Expression base, PointerType type, boolean tearing - public Expression makePtrToIntCast(Expression pointer) { + public Expression makePtrToIntCast(Expression pointer) { // todo fix return makePtrToIntCast(pointer, types.getArchType()); } public Expression makePtrToIntCast(Expression pointer, IntegerType type) { @@ -551,7 +555,6 @@ public Expression makeNEQforced(Expression leftOperand, Expression rightOperand) return makeNEQ(leftOperand, rightOperand); } - public Expression makeUnary(ExpressionKind op, Expression expr) { if (op instanceof BoolUnaryOp boolOp) { return makeBoolUnary(boolOp, expr); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 9c0ada4429..091acfc341 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -65,7 +65,7 @@ public interface ExpressionVisitor { default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } default TRet visitPtrConcat(PtrConcat expr){ return visitExpression(expr); }; default TRet visitPtrExtract(PtrExtract expr){ return visitUnaryExpression(expr); }; - default TRet visitPtrSizeCastExpression(PtrSizeCast expr){return visitCastExpression(expr); }; + //default TRet visitPtrSizeCastExpression(PtrSizeCast expr){return visitCastExpression(expr); }; // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java deleted file mode 100644 index ccd5a6d8b6..0000000000 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrSizeCast.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dat3m.dartagnan.expression.pointer; - -import com.dat3m.dartagnan.expression.Expression; -import com.dat3m.dartagnan.expression.ExpressionVisitor; -import com.dat3m.dartagnan.expression.base.CastExpressionBase; -import com.dat3m.dartagnan.expression.type.PointerType; -import com.dat3m.dartagnan.expression.utils.ExpressionHelper; - -public final class PtrSizeCast extends CastExpressionBase { - - private final boolean preserveSign; - - public PtrSizeCast(PointerType targetType, Expression operand, boolean preserveSign) { - super(targetType, operand); - ExpressionHelper.checkExpectedType(operand, PointerType.class); - this.preserveSign = (preserveSign && isExtension()) || isNoop(); - } - - public boolean isTruncation() { - return isExtension(getTargetType(), getSourceType()); - } - - public boolean isExtension() { - return isExtension(getSourceType(), getTargetType()); - } - - public boolean isNoop() { - return getSourceType().equals(getTargetType()); - } - - public boolean preservesSign() { - return preserveSign; - } - - private static boolean isExtension(PointerType sourceType, PointerType targetType) { - return sourceType.getBitWidth() < targetType.getBitWidth(); - } - - @Override - public T accept(ExpressionVisitor visitor) { - return visitor.visitPtrSizeCastExpression(this); - } -} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 844700a249..642a6ff24c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -352,9 +352,9 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { if (offset instanceof IntLiteral lit) { if(lit.isZero()){return base;} } - // fixme tearing problem + // can cause a tearing problem if (base instanceof NullLiteral) { - return expressions.makeIntToPtrCast(offset); + return expressions.makeIntToPtrCast(offset,expr.getType()); } return expressions.makePtrAdd(base, offset); } @@ -374,9 +374,9 @@ public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { return subT.getOperand(); } } -// if (sub instanceof NullLiteral) { -// return expressions.makeZero(expr.getType()); -// } // the problem here is that + if (sub instanceof NullLiteral) { + return expressions.makeZero(expr.getType()); + } // the problem here is that return expressions.makePtrToIntCast(expr.getOperand(), expr.getType()); } @@ -399,8 +399,6 @@ public Expression visitIntToPtrCastExpression(IntToPtrCast expr) { return expressions.makeIntToPtrCast(expr.getOperand(), expr.getType()); } - - @Override public Expression visitITEExpression(ITEExpr expr) { final Expression cond = expr.getCondition().accept(this); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index 8b63c1f2d2..cf780c6304 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -139,7 +139,7 @@ public Expression visitPtrCmpExpression(PtrCmpExpr expr) { @Override public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { - return expressions.makeIntegerCast(expressions.makePtrToIntCast(expr.getOperand().accept(this)),expr.getType(),false); + return expressions.makeIntegerCast(expressions.makePtrToIntCast(expr.getOperand().accept(this)), expr.getType(),false); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 964076976e..1a8b541eab 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.exception.ParsingException; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionFactory; +import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntLiteral; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -348,7 +349,7 @@ public Expression visitReXchg(LitmusCParser.ReXchgContext ctx){ @Override public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicitContext ctx) { - Register register = getReturnRegister(true); + Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -361,7 +362,7 @@ public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicit @Override public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { - Register register = getReturnRegister(true); + Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -374,7 +375,7 @@ public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { @Override public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicitContext ctx) { - Register register = getReturnRegister(true); + Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -387,7 +388,7 @@ public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicit @Override public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { - Register register = getReturnRegister(true); + Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -400,7 +401,7 @@ public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { @Override public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ - Register register = getReturnRegister(true); + Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); Expression cmp = (Expression)ctx.cmp.accept(this); Expression value = (Expression)ctx.value.accept(this); Event event = EventFactory.Linux.newRMWCompareExchange(getAddress(ctx.address), register, cmp, value, ctx.mo); @@ -600,8 +601,13 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ @Override public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx){ Register register = programBuilder.getRegister(scope, ctx.varName().getText()); + if(register == null){ - register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType); //care + System.out.println(ctx.typeSpecifier().basicTypeSpecifier().getText()); + if (ctx.typeSpecifier().basicTypeSpecifier().getText().endsWith("*")){ + register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType); + }else{ + register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), archType);} //care if(ctx.re() != null){ returnRegister = register; ctx.re().accept(this); @@ -700,6 +706,7 @@ private Expression getAddress(LitmusCParser.ReContext ctx){ throw new ParsingException("Invalid syntax near " + ctx.getText()); } + private Expression returnExpressionOrOne(LitmusCParser.ReContext ctx) { return ctx != null ? (Expression) ctx.accept(this) : expressions.makeOne(archType); } @@ -712,6 +719,14 @@ private Register getReturnRegister(boolean createOnNull){ returnRegister = null; return register; } + private Register getReturnRegister(boolean createOnNull, Type t){ + Register register = returnRegister; + if(register == null && createOnNull){ + return programBuilder.getOrNewRegister(scope, null, t); + } + returnRegister = null; + return register; + } private Expression assignToReturnRegister(Register register, Expression value) { if (register != null) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/Function.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/Function.java index bf51489cf2..4935f0713d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/Function.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/Function.java @@ -62,7 +62,7 @@ public Function(String name, FunctionType type, List parameterNames, int @Override public Type getType() { - return TypeFactory.getInstance().getArchType(); + return TypeFactory.getInstance().getPointerType(); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index 3e0816254a..55e0808a05 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -147,10 +147,12 @@ private ProcessingManager(Configuration config) throws InvalidConfigurationExcep MemoryAllocation.fromConfig(config), detectMixedSizeAccesses ? Tearing.fromConfig(config) : null, detectMixedSizeAccesses ? simplifyBoundedProgram : null, + //DebugPrint.withHeader("Before non termination", Printer.Mode.ALL, config), NonterminationDetection.fromConfig(config), + //DebugPrint.withHeader("After non termination", Printer.Mode.ALL, config), // --- Statistics + verification --- - IdReassignment.newInstance(), // Normalize used Ids (remove any gaps) printAfterProcessing ? DebugPrint.withHeader("After processing", Printer.Mode.THREADS, config) : null, + IdReassignment.newInstance(), // Normalize used Ids (remove any gaps) ProgramProcessor.fromFunctionProcessor( CoreCodeVerification.fromConfig(config), Target.THREADS, false diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java index 88de5e37e7..13bcc9a1f7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java @@ -44,7 +44,7 @@ public List visitAtomicCmpXchg(AtomicCmpXchg e) { Expression address = e.getAddress(); String mo = e.getMo(); Expression expectedAddr = e.getAddressOfExpected(); - Type type = resultRegister.getType(); + Type type = resultRegister.getType(); // todo how can this be a pointer ? Register booleanResultRegister = type instanceof BooleanType ? resultRegister : e.getFunction().newRegister(types.getBooleanType()); Local castResult = type instanceof BooleanType ? null : From 2c5a8f0e5e5beb1e944f76a05204df8e73d03eb9 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 26 Nov 2025 21:34:53 +0100 Subject: [PATCH 032/109] fixed litmus type mismatch --- .../dartagnan/expression/ExpressionFactory.java | 2 +- .../parsers/program/visitors/VisitorLitmusC.java | 16 +++++++--------- .../program/processing/ProcessingManager.java | 3 --- 3 files changed, 8 insertions(+), 13 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index ec355ccd96..c1e2deea84 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -507,7 +507,7 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { return makeIntCmp(leftOperand, IntCmpOp.EQ, rightOperand); } if (type instanceof PointerType) { return makePtrCmp(leftOperand, PtrCmpOp.EQ, rightOperand); - }else if (type instanceof FloatType) { + } else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? return makeFloatCmp(leftOperand, FloatCmpOp.OEQ, rightOperand); } else if (ExpressionHelper.isAggregateLike(type)) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 1a8b541eab..94865645e9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -349,7 +349,7 @@ public Expression visitReXchg(LitmusCParser.ReXchgContext ctx){ @Override public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicitContext ctx) { - Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); + Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -362,7 +362,7 @@ public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicit @Override public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { - Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); + Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -375,7 +375,7 @@ public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { @Override public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicitContext ctx) { - Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); + Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -388,7 +388,7 @@ public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicit @Override public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { - Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); + Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -401,7 +401,7 @@ public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { @Override public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ - Register register = getReturnRegister(true,TypeFactory.getInstance().getBooleanType()); + Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); Expression cmp = (Expression)ctx.cmp.accept(this); Expression value = (Expression)ctx.value.accept(this); Event event = EventFactory.Linux.newRMWCompareExchange(getAddress(ctx.address), register, cmp, value, ctx.mo); @@ -719,11 +719,9 @@ private Register getReturnRegister(boolean createOnNull){ returnRegister = null; return register; } - private Register getReturnRegister(boolean createOnNull, Type t){ + private Register getReturnRegister(Type t){ Register register = returnRegister; - if(register == null && createOnNull){ - return programBuilder.getOrNewRegister(scope, null, t); - } + if(register == null){return programBuilder.getOrNewRegister(scope, null, t);} returnRegister = null; return register; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index 55e0808a05..a0aa87a6ee 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -132,7 +132,6 @@ private ProcessingManager(Configuration config) throws InvalidConfigurationExcep ), ThreadCreation.fromConfig(config), - //DebugPrint.withHeader("--------Debug--------", Printer.Mode.ALL, config), ResolveNonDetChoices.newInstance(), reduceSymmetry ? SymmetryReduction.fromConfig(config) : null, intrinsics.lateInliningPass(), @@ -147,9 +146,7 @@ private ProcessingManager(Configuration config) throws InvalidConfigurationExcep MemoryAllocation.fromConfig(config), detectMixedSizeAccesses ? Tearing.fromConfig(config) : null, detectMixedSizeAccesses ? simplifyBoundedProgram : null, - //DebugPrint.withHeader("Before non termination", Printer.Mode.ALL, config), NonterminationDetection.fromConfig(config), - //DebugPrint.withHeader("After non termination", Printer.Mode.ALL, config), // --- Statistics + verification --- printAfterProcessing ? DebugPrint.withHeader("After processing", Printer.Mode.THREADS, config) : null, IdReassignment.newInstance(), // Normalize used Ids (remove any gaps) From 05a2d183832c10c7f067b45b2901f23dcf60fc57 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Fri, 28 Nov 2025 20:07:04 +0100 Subject: [PATCH 033/109] refactoring --- .../dartagnan/encoding/ExpressionEncoder.java | 56 +++++++++---------- .../dartagnan/encoding/ProgramEncoder.java | 4 +- .../expression/ExpressionFactory.java | 46 +++++++-------- .../expression/ExpressionVisitor.java | 1 - .../expression/processing/ExprSimplifier.java | 5 +- .../processing/ExprTransformer.java | 2 +- .../expression/type/PointerType.java | 4 +- .../program/visitors/VisitorLitmusC.java | 3 +- .../program/processing/Intrinsics.java | 48 ++++++++-------- .../program/processing/ThreadCreation.java | 3 +- .../others/miscellaneous/AnalysisTest.java | 2 +- 11 files changed, 84 insertions(+), 90 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index db2d25fbe2..d0fd619d03 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -539,41 +539,39 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitPtrToIntCastExpression(PtrToIntCast expr) { final TypedFormula inner = encodePointerExpr(expr.getOperand()); - final Formula enc = inner.formula(); - -// final Formula enc; -// if (context.useIntegers) { -// if (expr.isExtension()) { -// enc = inner.formula(); -// }else { -// final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); -// final IntegerFormulaManager imgr = integerFormulaManager(); -// enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue));} -// } else { -// assert inner.formula() instanceof BitvectorFormula; -// final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); -// final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); -// final int targetBitWidth = expr.getTargetType().getBitWidth(); -// final int sourceBitWidth = expr.getSourceType().getBitWidth(); -// assert (sourceBitWidth == bvmgr.getLength(innerBv)); -// enc = expr.isExtension() -// ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) -// : bvmgr.extract(innerBv, targetBitWidth - 1, 0); -// } + final Formula enc; + if (context.useIntegers) { + if (expr.isExtension()) { + enc = inner.formula(); + }else { + final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); + final IntegerFormulaManager imgr = integerFormulaManager(); + enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue));} + } else { + assert inner.formula() instanceof BitvectorFormula; + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); + final int targetBitWidth = expr.getTargetType().getBitWidth(); + final int sourceBitWidth = expr.getSourceType().getBitWidth(); + assert (sourceBitWidth == bvmgr.getLength(innerBv)); + enc = expr.isExtension() + ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) + : bvmgr.extract(innerBv, targetBitWidth - 1, 0); + } return new TypedFormula<>(expr.getType(), enc); } @Override public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { final TypedFormula address = encodeIntegerExpr(expr.getOperand()); - // relevant for tearing -// if (!context.useIntegers) { -// int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); -// int pbw = expr.getType().getBitWidth(); -// if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() -// .extend(((BitvectorFormula) address.formula()), pbw - ibw,false)); -// }} + // todo add support for lossy cast like int128 to ptr(is it even possible?) + if (!context.useIntegers) { + int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); + int pbw = expr.getType().getBitWidth(); + if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() + .extend(((BitvectorFormula) address.formula()), pbw - ibw,false)); + }} return new TypedFormula<>(expr.getType(), address.formula()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java index 42c5c44157..ecf4d1e6f1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java @@ -426,7 +426,7 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { final List memoryObjects = ImmutableList.copyOf(memory.getObjects()); for (int i = 0; i < memoryObjects.size(); i++) { final MemoryObject cur = memoryObjects.get(i); - final Expression addrVar = exprs.makePtrToIntCast(context.address(cur)); + final Expression addrVar = exprs.makePtrToIntCast(context.address(cur), archType); final Expression sizeVar = context.size(cur); final Expression size; @@ -464,7 +464,7 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { enc.add(equate.apply(addrVar, alignment)); } else { final Expression nextAvailableAddr = exprs.makeAdd( - exprs.makePtrToIntCast(context.address(prev)), + exprs.makePtrToIntCast(context.address(prev),archType), context.size(prev) ); final Expression nextAlignedAddr = exprs.makeAdd(nextAvailableAddr, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index c1e2deea84..001b45ed7b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -14,7 +14,6 @@ import com.dat3m.dartagnan.program.memory.ScopedPointerVariable; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; -import edu.stanford.CVC4.PrettySExprs; import java.math.BigDecimal; import java.math.BigInteger; @@ -80,7 +79,7 @@ public Expression makeBooleanCast(Expression operand) { } else if (sourceType instanceof IntegerType intType) { return makeNEQ(operand, makeZero(intType)); }else if (sourceType instanceof PointerType) { - return makeBooleanCast(makePtrToIntCast(operand)); + return makeBooleanCast(makePtrToIntCast(operand, types.getArchType())); } throw new UnsupportedOperationException(String.format("Cannot cast %s to %s.", sourceType, booleanType)); } @@ -214,10 +213,10 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi public Expression makeIntCmpForced(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpForced(makePtrToIntCast(leftOperand), operator, rightOperand); + return makeIntCmpForced(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntCmpForced(leftOperand, operator, makePtrToIntCast(rightOperand)); + return makeIntCmpForced(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); } return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } @@ -228,10 +227,10 @@ public Expression makeIntBinary(Expression leftOperand, IntBinaryOp operator, Ex public Expression makeIntBinaryForced(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntBinaryForced(makePtrToIntCast(leftOperand), operator, rightOperand); + return makeIntBinaryForced(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntBinaryForced(leftOperand, operator, makePtrToIntCast(rightOperand)); + return makeIntBinaryForced(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); } return new IntBinaryExpr(leftOperand, operator, rightOperand); } @@ -390,35 +389,30 @@ public Expression makePtrAdd(Expression base, Expression offset) { return new PtrAddExpr(base, offset); } - public Expression makePtrCast(Expression base, PointerType type, boolean tearing){ + public Expression makePtrCast(Expression base, PointerType type){ if (base.getType() instanceof PointerType ) { return base; // todo is ptr size cast needed for mixed arm (tearing) } if (base.getType() instanceof IntegerType) { - int bw = ((IntegerType) base.getType()).getBitWidth(); + //int bw = ((IntegerType) base.getType()).getBitWidth(); // this causes problems in tearing if the pointer is not of the int size - return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing ? types.getPointerType(bw):types.getPointerType()); - } - if (base.getType() instanceof BooleanType) { - - + // return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing ? types.getPointerType(bw):types.getPointerType()); + return makeIntToPtrCast(base); } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } - - public Expression makePtrToIntCast(Expression pointer) { // todo fix - return makePtrToIntCast(pointer, types.getArchType()); - } public Expression makePtrToIntCast(Expression pointer, IntegerType type) { - return makeIntegerCast( new PtrToIntCast(types.getIntegerType(((PointerType)pointer.getType()).getBitWidth()), pointer), type,false); + return new PtrToIntCast(type, pointer); } - public Expression makeIntToPtrCast(Expression operand, PointerType pointerType) { - return new IntToPtrCast(pointerType, makeIntegerCast(operand,types.getArchType(),false)); + // it does not make sense to cast to a pointer not of the arch size. + + private Expression makeIntToPtrCast(Expression integer, PointerType pointerType) { + return new IntToPtrCast(pointerType, integer); } public Expression makeIntToPtrCast(Expression operand) { return makeIntToPtrCast(operand, types.getPointerType()); @@ -426,8 +420,6 @@ public Expression makeIntToPtrCast(Expression operand) { - - public Expression makeNullLiteral(PointerType pointerType) { return new NullLiteral(pointerType); } @@ -486,7 +478,7 @@ else if (type instanceof IntegerType integerType) { } else if (type instanceof FloatType floatType) { return makeFloatCast(expression, floatType, signed); }else if (type instanceof PointerType) { - return makePtrCast(expression, (PointerType) type, false); // todo fix for tearing(mixed test), maybe a teared pointer tracker. + return makePtrCast(expression, (PointerType) type); // todo fix for tearing(mixed test), maybe a teared pointer tracker. } throw new UnsupportedOperationException(String.format("Cast %s into %s unsupported.", expression, type)); } @@ -519,10 +511,10 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { public Expression makeEQforced(Expression leftOperand, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeEQforced(makePtrToIntCast(leftOperand), rightOperand); + return makeEQforced(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeEQforced(leftOperand, makePtrToIntCast(rightOperand)); + return makeEQforced(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); } return makeEQ(leftOperand, rightOperand); } @@ -547,10 +539,10 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { public Expression makeNEQforced(Expression leftOperand, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeNEQforced(makePtrToIntCast(leftOperand), rightOperand); + return makeNEQforced(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeNEQforced(leftOperand, makePtrToIntCast(rightOperand)); + return makeNEQforced(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); } return makeNEQ(leftOperand, rightOperand); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 091acfc341..3ee302f731 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -65,7 +65,6 @@ public interface ExpressionVisitor { default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } default TRet visitPtrConcat(PtrConcat expr){ return visitExpression(expr); }; default TRet visitPtrExtract(PtrExtract expr){ return visitUnaryExpression(expr); }; - //default TRet visitPtrSizeCastExpression(PtrSizeCast expr){return visitCastExpression(expr); }; // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 642a6ff24c..3ab7de8a08 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -12,7 +12,6 @@ import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.pointer.*; -import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.utils.IntegerHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; import com.google.common.base.VerifyException; @@ -354,7 +353,7 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { } // can cause a tearing problem if (base instanceof NullLiteral) { - return expressions.makeIntToPtrCast(offset,expr.getType()); + return expressions.makeIntToPtrCast(offset); } return expressions.makePtrAdd(base, offset); } @@ -396,7 +395,7 @@ public Expression visitIntToPtrCastExpression(IntToPtrCast expr) { if (sub instanceof IntLiteral && ((IntLiteral) sub).isZero()) { return expressions.makeNullLiteral(expr.getType()); } - return expressions.makeIntToPtrCast(expr.getOperand(), expr.getType()); + return expressions.makeIntToPtrCast(expr.getOperand()); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index cf780c6304..264037e1cc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -139,7 +139,7 @@ public Expression visitPtrCmpExpression(PtrCmpExpr expr) { @Override public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { - return expressions.makeIntegerCast(expressions.makePtrToIntCast(expr.getOperand().accept(this)), expr.getType(),false); + return expressions.makePtrToIntCast(expr.getOperand().accept(this), expr.getType()); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index 02cff5d9fa..dd012a468d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -7,7 +7,7 @@ public class PointerType implements Type { public int bitWidth; public boolean teared; - // todo change the encoding to recognise bit width + PointerType(int bitWidth) { this.bitWidth = bitWidth; @@ -15,7 +15,7 @@ public class PointerType implements Type { @Override public String toString() { - return "ptr_"+ bitWidth; + return "ptr"+ bitWidth; } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 94865645e9..c74a7fb04c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -603,7 +603,8 @@ public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx) Register register = programBuilder.getRegister(scope, ctx.varName().getText()); if(register == null){ - System.out.println(ctx.typeSpecifier().basicTypeSpecifier().getText()); + //todo remove printer + // System.out.println(ctx.typeSpecifier().basicTypeSpecifier().getText()); if (ctx.typeSpecifier().basicTypeSpecifier().getText().endsWith("*")){ register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType); }else{ diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index e8516294a4..d4fa101781 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -62,6 +62,7 @@ public class Intrinsics { private enum AssertionType { USER, OVERFLOW, INVALIDDEREF, UNKNOWN_FUNCTION } private final boolean detectMixedSizeAccesses; + private final IntegerType archType = types.getArchType(); private static final TypeFactory types = TypeFactory.getInstance(); private static final ExpressionFactory expressions = ExpressionFactory.getInstance(); @@ -424,7 +425,7 @@ private List inlinePthreadCreate(FunctionCall call) { final Register resultRegister = getResultRegister(call); assert resultRegister.getType() instanceof IntegerType; - final Register tidReg = call.getFunction().newUniqueRegister("__tid", types.getArchType()); + final Register tidReg = call.getFunction().newUniqueRegister("__tid", archType); final Event createEvent = newDynamicThreadCreate(tidReg, PTHREAD_THREAD_TYPE, targetFunction, List.of(argument)); final Label skipAttrLabel = newLabel("__pthread_create_skip_attr"); final Label skipDetachLabel = newLabel("__pthread_create_skip_detach"); @@ -714,11 +715,11 @@ private List inlinePthreadKeyCreate(FunctionCall call) { final long threadCount = program.getThreads().size(); final int pointerBytes = types.getMemorySizeInBytes(types.getPointerType()); final Register storageAddressRegister = call.getFunction().newRegister(types.getPointerType()); - final Expression size = expressions.makeValue((threadCount + 1) * pointerBytes, types.getArchType()); - final Expression destructorOffset = expressions.makeValue(threadCount * pointerBytes, types.getArchType()); + final Expression size = expressions.makeValue((threadCount + 1) * pointerBytes, archType); + final Expression destructorOffset = expressions.makeValue(threadCount * pointerBytes, archType); //TODO call destructor at each thread's normal exit return List.of( - EventFactory.newAlloc(storageAddressRegister, types.getArchType(), size, true, true), + EventFactory.newAlloc(storageAddressRegister, archType, size, true, true), newStore(keyAddress, storageAddressRegister), newStore(expressions.makePtrAdd(storageAddressRegister, destructorOffset), destructor), assignSuccess(errorRegister) @@ -741,7 +742,7 @@ private List inlinePthreadGetSpecific(FunctionCall call) { final Register result = getResultRegisterAndCheckArguments(1, call); final Expression key = call.getArguments().get(0); final int threadID = call.getThread().getId(); - final Expression offset = expressions.makeValue(threadID, types.getArchType()); + final Expression offset = expressions.makeValue(threadID, archType); return List.of( EventFactory.newLoad(result, expressions.makePtrAdd(expressions.makeCast(key,types.getPointerType()), offset)) ); @@ -753,7 +754,7 @@ private List inlinePthreadSetSpecific(FunctionCall call) { final Expression key = call.getArguments().get(0); final Expression value = call.getArguments().get(1); final int threadID = call.getThread().getId(); - final Expression offset = expressions.makeValue(threadID, types.getArchType()); + final Expression offset = expressions.makeValue(threadID, archType); return List.of( newStore(expressions.makePtrAdd(expressions.makeCast(key,types.getPointerType()), offset), value), // this cast does not seem like a good idea todo discuss it assignSuccess(errorRegister) @@ -906,7 +907,7 @@ private List inlinePthreadRwlockDestroy(FunctionCall call) { final Register errorRegister = getResultRegisterAndCheckArguments(1, call); //TODO store a value such that later uses of the lock fail //final Expression lock = call.getArguments().get(0); - //final Expression finalizedValue = expressions.makeZero(types.getArchType()); + //final Expression finalizedValue = expressions.makeZero(archType); return List.of( //EventFactory.newStore(lock, finalizedValue) assignSuccess(errorRegister) @@ -1032,7 +1033,7 @@ private List inlinePthreadRwlockUnlock(FunctionCall call) { } private IntegerType getRwlockDatatype() { - return types.getArchType(); + return archType; } private IntLiteral getRwlockUnlockedValue() { @@ -1605,10 +1606,10 @@ private List inlineMemCpy(FunctionCall call) { final List replacement = new ArrayList<>(2 * count + 1); //FIXME without MSA detection, each byte is treated as a 64-bit value. - final IntegerType type = detectMixedSizeAccesses ? types.getIntegerType(8 * count) : types.getArchType(); + final IntegerType type = detectMixedSizeAccesses ? types.getIntegerType(8 * count) : archType; final int typeSize = detectMixedSizeAccesses ? count : 1; for (int i = 0; i < count; i += typeSize) { - final Expression offset = expressions.makeValue(i, types.getArchType()); + final Expression offset = expressions.makeValue(i, archType); final Expression srcAddr = expressions.makePtrAdd(src, offset); final Expression destAddr = expressions.makePtrAdd(dest, offset); final Register reg = caller.getOrNewRegister("__memcpy_" + i, type); @@ -1658,18 +1659,21 @@ private List inlineMemCpyS(FunctionCall call) { final Expression srcIsNull = expressions.makeEQ(src, nullExpr); // We assume RSIZE_MAX = 2^64-1 - final Expression rsize_max = expressions.makeValue(BigInteger.ONE.shiftLeft(64).subtract(BigInteger.ONE), types.getArchType()); - // These parameters have type rsize_t/size_t which we model as types.getArchType(), thus the cast - final Expression castDestszExpr = expressions.makeCast(destszExpr, types.getArchType()); - final Expression castCountExpr = expressions.makeCast(countExpr, types.getArchType()); + final Expression rsize_max = expressions.makeValue(BigInteger.ONE.shiftLeft(64).subtract(BigInteger.ONE), archType); + // These parameters have type rsize_t/size_t which we model as archType, thus the cast + final Expression castDestszExpr = expressions.makeCast(destszExpr, archType); + final Expression castCountExpr = expressions.makeCast(countExpr, archType); final Expression invalidDestsz = expressions.makeGT(castDestszExpr, rsize_max, false); final Expression countGtMax = expressions.makeGT(castCountExpr, rsize_max, false); final Expression countGtdestszExpr = expressions.makeGT(castCountExpr, castDestszExpr, false); final Expression invalidCount = expressions.makeOr(countGtMax, countGtdestszExpr); final Expression overlap = expressions.makeAnd( - expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(src, castCountExpr)), expressions.makePtrToIntCast(dest), false), - expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(dest, castCountExpr)), expressions.makePtrToIntCast(src), false)); + expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(src, castCountExpr),archType), + expressions.makePtrToIntCast(dest, archType), false), + expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(dest, castCountExpr), archType), + expressions.makePtrToIntCast(src,archType), false)); + final List replacement = new ArrayList<>(); @@ -1705,9 +1709,9 @@ private List inlineMemCpyS(FunctionCall call) { skipE2 )); for (int i = 0; i < destsz; i++) { - final Expression offset = expressions.makeValue(i, types.getArchType()); + final Expression offset = expressions.makeValue(i, archType); final Expression destAddr = expressions.makePtrAdd(dest, offset); - final Expression zero = expressions.makeZero(types.getArchType()); + final Expression zero = expressions.makeZero(archType); replacement.add( newStore(destAddr, zero) ); @@ -1721,11 +1725,11 @@ private List inlineMemCpyS(FunctionCall call) { Local retSuccess = EventFactory.newLocal(resultRegister, errorCodeSuccess); replacement.add(success); for (int i = 0; i < count; i++) { - final Expression offset = expressions.makeValue(i, types.getArchType()); + final Expression offset = expressions.makeValue(i, archType); final Expression srcAddr = expressions.makePtrAdd(src, offset); final Expression destAddr = expressions.makePtrAdd(dest, offset); // FIXME: We have no other choice but to load ptr-sized chunks for now - final Register reg = caller.getOrNewRegister("__memcpy_" + i, types.getArchType()); + final Register reg = caller.getOrNewRegister("__memcpy_" + i, archType); replacement.addAll(List.of( EventFactory.newLoad(reg, srcAddr), @@ -1756,7 +1760,7 @@ private List inlineMemCmp(FunctionCall call) { final List replacement = new ArrayList<>(4 * count + 1); final Label endCmp = EventFactory.newLabel("__memcmp_end"); for (int i = 0; i < count; i++) { - final Expression offset = expressions.makeValue(i, types.getArchType()); + final Expression offset = expressions.makeValue(i, archType); final Expression src1Addr = expressions.makeAdd(src1, offset); final Expression src2Addr = expressions.makeAdd(src2, offset); //FIXME: This method should properly load byte chunks and compare them (unsigned). @@ -1808,7 +1812,7 @@ private List inlineMemSet(FunctionCall call) { final Expression zero = expressions.makeValue(fill, types.getByteType()); final List replacement = new ArrayList<>( count + 1); for (int i = 0; i < count; i++) { - final Expression offset = expressions.makeValue(i, types.getArchType()); + final Expression offset = expressions.makeValue(i, archType); final Expression destAddr = expressions.makePtrAdd(dest, offset); replacement.add(newStore(destAddr, zero)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java index 287a297eaf..feb5a38327 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java @@ -185,7 +185,8 @@ private void resolveDynamicThreadJoin(Program program, List threadDa for (DynamicThreadJoin join : program.getThreadEvents(DynamicThreadJoin.class)) { final Thread caller = join.getThread(); final Expression tidExpr_ = join.getTid(); - final Expression tidExpr = tidExpr_.getType() instanceof PointerType ? expressions.makePtrToIntCast(tidExpr_) : tidExpr_; + // todo check if this makes sense as functions are now pointers + final Expression tidExpr = tidExpr_.getType() instanceof PointerType ? expressions.makePtrToIntCast(tidExpr_, archType) : tidExpr_; final Register joinRegister = join.getResultRegister(); final IntegerType statusType = (IntegerType) ((AggregateType)joinRegister.getType()).getFields().get(0).type(); diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java index f441869e59..c9d698fe90 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java @@ -593,7 +593,7 @@ public void fullPropagation1() throws InvalidConfigurationException { Load e0 = newLoad(r0, y); // reads x b.addChild(0, e0); Label l0 = newLabel("l0"); - b.addChild(0, newJump(expressions.makeEQ(r0, expressions.makePtrToIntCast(x)), l0)); + b.addChild(0, newJump(expressions.makeEQ(r0, expressions.makePtrToIntCast(x, types.getArchType())), l0)); Load e1 = newLoad(r0, x); // reads y b.addChild(0, e1); b.addChild(0, l0); From 10bac52ebfc45a281c765690b037907d64b0ca6a Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 29 Nov 2025 19:01:10 +0100 Subject: [PATCH 034/109] non-termination tests pass --- .../dartagnan/expression/ExpressionFactory.java | 4 ++-- .../dartagnan/expression/type/IntegerType.java | 2 +- .../parsers/program/visitors/VisitorLitmusC.java | 13 ++++++------- .../program/processing/ProcessingManager.java | 2 +- 4 files changed, 10 insertions(+), 11 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 001b45ed7b..00348fd260 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -392,13 +392,13 @@ public Expression makePtrAdd(Expression base, Expression offset) { public Expression makePtrCast(Expression base, PointerType type){ if (base.getType() instanceof PointerType ) { return base; - // todo is ptr size cast needed for mixed arm (tearing) + // pointers of different size than arch should not be cast? Possible in wmm. } if (base.getType() instanceof IntegerType) { //int bw = ((IntegerType) base.getType()).getBitWidth(); // this causes problems in tearing if the pointer is not of the int size // return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing ? types.getPointerType(bw):types.getPointerType()); - return makeIntToPtrCast(base); + return makeIntToPtrCast(base, type); } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java index 7d49a462b3..f284c57133 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java @@ -53,6 +53,6 @@ public int hashCode() { @Override public String toString() { - return "bv" + bitWidth; + return "int" + bitWidth; } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index c74a7fb04c..4c9c85bfa7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -113,7 +113,6 @@ public Object visitGlobalDeclaratorRegisterLocation(LitmusCParser.GlobalDeclarat programBuilder.initRegEqConst(ctx.threadId().id, ctx.varName(0).getText(), object); } else { programBuilder.initRegEqLocVal(ctx.threadId().id, ctx.varName(0).getText(), ctx.varName(1).getText(), pointerType); - // todo verify pointerType or intType } } return null; @@ -603,12 +602,12 @@ public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx) Register register = programBuilder.getRegister(scope, ctx.varName().getText()); if(register == null){ - //todo remove printer - // System.out.println(ctx.typeSpecifier().basicTypeSpecifier().getText()); - if (ctx.typeSpecifier().basicTypeSpecifier().getText().endsWith("*")){ - register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType); + if (ctx.typeSpecifier().Ast().isEmpty()){ + System.out.println("int"); + register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), archType); }else{ - register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), archType);} //care + System.out.println("ptr"); + register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType);} //care if(ctx.re() != null){ returnRegister = register; ctx.re().accept(this); @@ -715,7 +714,7 @@ private Expression returnExpressionOrOne(LitmusCParser.ReContext ctx) { private Register getReturnRegister(boolean createOnNull){ Register register = returnRegister; if(register == null && createOnNull){ - return programBuilder.getOrNewRegister(scope, null, pointerType); + return programBuilder.getOrNewRegister(scope, null, archType); } returnRegister = null; return register; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index a0aa87a6ee..b3be734ee1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = false; + private boolean printAfterProcessing = true; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { From d40ac56cd3ea7f46f90da87bb05c422938883568 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 30 Nov 2025 21:56:46 +0100 Subject: [PATCH 035/109] fixed the litmus wrong ptr default reg type --- .../parsers/program/visitors/VisitorLitmusC.java | 11 +++++++---- .../parsers/program/visitors/VisitorLitmusRISCV.java | 1 + .../parsers/program/visitors/VisitorLlvm.java | 3 +++ .../program/processing/ProcessingManager.java | 2 +- 4 files changed, 12 insertions(+), 5 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 4c9c85bfa7..d77c7bbb00 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -198,8 +198,9 @@ public Object visitThreadArgument(LitmusCParser.ThreadArgumentContext ctx) { // TODO: Possibly parse attributes/type modifiers (const, ...) // For now, herd7 also seems to ignore most modifiers, in particular the atomic one. String name = ctx.varName().getText(); + Type type = ctx.pointerTypeSpecifier().Ast() == null ? archType : pointerType; // todo archType should never be used. MemoryObject object = programBuilder.getOrNewMemoryObject(name); - Register register = programBuilder.getOrNewRegister(scope, name, pointerType); + Register register = programBuilder.getOrNewRegister(scope, name, type); boolean atomicity = ctx.pointerTypeSpecifier().atomicTypeSpecifier() != null || ctx.pointerTypeSpecifier().basicTypeSpecifier().AtomicInt() != null; if (!atomicity) { @@ -674,6 +675,8 @@ public Object visitNreSrcuSync(LitmusCParser.NreSrcuSyncContext ctx) { // ---------------------------------------------------------------------------------------------------------------- // Utils + + // problem here @Override public Expression visitVarName(LitmusCParser.VarNameContext ctx){ if(scope > -1){ @@ -683,11 +686,11 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ } MemoryObject object = programBuilder.getMemoryObject(ctx.getText()); if(object != null){ - register = programBuilder.getOrNewRegister(scope, null, pointerType); + register = programBuilder.getOrNewRegister(scope, null, archType); programBuilder.addChild(currentThread, EventFactory.newLoadWithMo(register, object, C11.NONATOMIC)); return register; } - return programBuilder.getOrNewRegister(scope, ctx.getText(), pointerType); + return programBuilder.getOrNewRegister(scope, ctx.getText(), archType); } MemoryObject object = programBuilder.newMemoryObject(ctx.getText(), archSize); Register register = programBuilder.getOrNewRegister(scope, null, pointerType); @@ -698,7 +701,7 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ private Expression getAddress(LitmusCParser.ReContext ctx){ Expression address = (Expression)ctx.accept(this); if(address.getType() instanceof IntegerType){ - return expressions.makeIntToPtrCast(address); + return expressions.makeIntToPtrCast(address); } if(address.getType() instanceof PointerType){ return address; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java index 7fc60ae5a8..de5cbe5dcc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java @@ -137,6 +137,7 @@ public Object visitOr(LitmusRISCVParser.OrContext ctx) { @Override public Object visitAdd(LitmusRISCVParser.AddContext ctx) { + // todo check if pointer to use ptrAdd Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index 8f462d86c3..a9e84f2ae1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -589,6 +589,9 @@ public Expression visitICmpInst(ICmpInstContext ctx) { final Expression compared = switch (operator) { case "eq" -> expressions.makeEQ(left, right); case "ne" -> expressions.makeNEQ(left, right); + // todo pointers should belong to the same object to be comparable. + // The two arguments must be integer or pointer or integer vector typed. They must also be identical types. + // llvm doc: If the operands are pointer typed, the pointer values are compared as if they were integers. case "slt", "ult" -> expressions.makeLTforced(left, right, operator.startsWith("s")); case "sle", "ule" -> expressions.makeLTEforced(left, right, operator.startsWith("s")); case "sgt", "ugt" -> expressions.makeGTforced(left, right, operator.startsWith("s")); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index b3be734ee1..a0aa87a6ee 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = true; + private boolean printAfterProcessing = false; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { From b3f0997ede9894c7a474f1476ef47cc8df1993e7 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 2 Dec 2025 21:11:00 +0100 Subject: [PATCH 036/109] fixed some litmus compilation problems --- .../dartagnan/expression/type/IntegerType.java | 2 +- .../dartagnan/expression/type/TypeFactory.java | 1 - .../parsers/program/utils/ProgramBuilder.java | 2 +- .../program/visitors/VisitorAsmRISCV.java | 2 +- .../program/visitors/VisitorLitmusC.java | 7 ++----- .../program/visitors/VisitorLitmusRISCV.java | 18 +++++++++--------- .../parsers/program/visitors/VisitorLlvm.java | 2 +- .../visitors/spirv/VisitorOpsConversion.java | 7 ++++--- .../processing/compilation/VisitorArm8.java | 9 ++++++++- .../processing/compilation/VisitorPower.java | 9 ++++++++- .../processing/compilation/VisitorRISCV.java | 9 ++++++++- 11 files changed, 43 insertions(+), 25 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java index f284c57133..7d49a462b3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/IntegerType.java @@ -53,6 +53,6 @@ public int hashCode() { @Override public String toString() { - return "int" + bitWidth; + return "bv" + bitWidth; } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index c4bfd47842..061d0141b2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -51,7 +51,6 @@ public PointerType getPointerType(int bitWidth) { return typeNormalizer.normalize(new PointerType(bitWidth)); } - public IntegerType getIntegerType(int bitWidth) { checkArgument(bitWidth > 0, "Non-positive bit width %s.", bitWidth); return typeNormalizer.normalize(new IntegerType(bitWidth)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java index 518c1d7243..f763e163ff 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java @@ -269,7 +269,7 @@ public Register getRegister(int fid, String name){ return getFunctionOrError(fid).getRegister(name); } - public Register getOrNewRegister(int fid, String name) { + public Register getOrNewRegister(int fid, String name) { // use carefully return getOrNewRegister(fid, name, types.getPointerType()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java index 111c62e8ff..6a5d2f1c02 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java @@ -332,7 +332,7 @@ public Object visitValue(AsmRISCVParser.ValueContext ctx) { }else if (expectedType instanceof PointerType){ String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeIntToPtrCast(expressions.makeValue(value)); + return expressions.makeIntToPtrCast(expressions.makeValue(value)); // not directly !? } throw new RuntimeException("Unexpected type " + expectedType + " visited"); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index d77c7bbb00..c0dc4c009e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -198,7 +198,7 @@ public Object visitThreadArgument(LitmusCParser.ThreadArgumentContext ctx) { // TODO: Possibly parse attributes/type modifiers (const, ...) // For now, herd7 also seems to ignore most modifiers, in particular the atomic one. String name = ctx.varName().getText(); - Type type = ctx.pointerTypeSpecifier().Ast() == null ? archType : pointerType; // todo archType should never be used. + Type type = ctx.pointerTypeSpecifier().Ast() == null ? archType : pointerType; // as far as i understand the archtype is meaningless here. MemoryObject object = programBuilder.getOrNewMemoryObject(name); Register register = programBuilder.getOrNewRegister(scope, name, type); boolean atomicity = ctx.pointerTypeSpecifier().atomicTypeSpecifier() != null @@ -586,10 +586,9 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ } throw new ParsingException("Invalid syntax near " + ctx.getText()); } - Expression value = (Expression)ctx.re().accept(this); if(variable instanceof MemoryObject || variable instanceof Register){ - Event event = EventFactory.newStoreWithMo(variable, expressions.makeCast(value,pointerType), C11.NONATOMIC); + Event event = EventFactory.newStoreWithMo(expressions.makeCast(variable, pointerType), value, C11.NONATOMIC); if (isOpenCL) { event.addTags(Tag.OpenCL.DEFAULT_WEAK_SCOPE); } @@ -604,10 +603,8 @@ public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx) if(register == null){ if (ctx.typeSpecifier().Ast().isEmpty()){ - System.out.println("int"); register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), archType); }else{ - System.out.println("ptr"); register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType);} //care if(ctx.re() != null){ returnRegister = register; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java index de5cbe5dcc..af1edb2d4b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.integers.IntLiteral; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.LitmusRISCVBaseVisitor; import com.dat3m.dartagnan.parsers.LitmusRISCVParser; @@ -26,6 +27,7 @@ public class VisitorLitmusRISCV extends LitmusRISCVBaseVisitor { private final TypeFactory types = programBuilder.getTypeFactory(); private final ExpressionFactory expressions = programBuilder.getExpressionFactory(); private final IntegerType archType = types.getArchType(); + private final PointerType pointerType = types.getPointerType(); private int mainThread; private int threadCount = 0; @@ -34,7 +36,6 @@ public VisitorLitmusRISCV(){ // ---------------------------------------------------------------------------------------------------------------- // Entry point - @Override public Object visitMain(LitmusRISCVParser.MainContext ctx) { visitThreadDeclaratorList(ctx.program().threadDeclaratorList()); @@ -48,7 +49,6 @@ public Object visitMain(LitmusRISCVParser.MainContext ctx) { // ---------------------------------------------------------------------------------------------------------------- // Variable declarator list - @Override public Object visitVariableDeclaratorLocation(LitmusRISCVParser.VariableDeclaratorLocationContext ctx) { IntLiteral value = expressions.parseValue(ctx.constant().getText(), archType); @@ -75,10 +75,8 @@ public Object visitVariableDeclaratorLocationLocation(LitmusRISCVParser.Variable return null; } - // ---------------------------------------------------------------------------------------------------------------- // Thread declarator list (on top of instructions), e.g. " P0 | P1 | P2 ;" - @Override public Object visitThreadDeclaratorList(LitmusRISCVParser.ThreadDeclaratorListContext ctx) { for(LitmusRISCVParser.ThreadIdContext threadCtx : ctx.threadId()){ @@ -88,10 +86,8 @@ public Object visitThreadDeclaratorList(LitmusRISCVParser.ThreadDeclaratorListCo return null; } - // ---------------------------------------------------------------------------------------------------------------- // Instruction list (the program itself) - @Override public Object visitInstructionRow(LitmusRISCVParser.InstructionRowContext ctx) { for(int i = 0; i < threadCount; i++){ @@ -137,10 +133,15 @@ public Object visitOr(LitmusRISCVParser.OrContext ctx) { @Override public Object visitAdd(LitmusRISCVParser.AddContext ctx) { - // todo check if pointer to use ptrAdd - Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); + // todo problem here is an int reg being retrieved as r1. Should it be possible?? + Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), pointerType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); + if (r2.getType() instanceof PointerType && r3.getType() instanceof IntegerType) { + return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makePtrAdd(r2, r3))); + }else if (r3.getType() instanceof PointerType && r2.getType() instanceof IntegerType) { + return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makePtrAdd(r3, r2))); + } return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeAdd(r2, r3))); } @@ -257,7 +258,6 @@ public Object visitAmoswap(LitmusRISCVParser.AmoswapContext ctx) { // ======================================= // ================ Utils ================ // ======================================= - private String getMo(LitmusRISCVParser.MoRISCVContext mo1, LitmusRISCVParser.MoRISCVContext mo2) { String moR = mo1 != null ? mo1.mo : ""; String moW = mo2 != null ? mo2.mo : ""; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index a9e84f2ae1..f8894e581c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -589,7 +589,7 @@ public Expression visitICmpInst(ICmpInstContext ctx) { final Expression compared = switch (operator) { case "eq" -> expressions.makeEQ(left, right); case "ne" -> expressions.makeNEQ(left, right); - // todo pointers should belong to the same object to be comparable. + // todo should pointers belong to the same object to be comparable? // The two arguments must be integer or pointer or integer vector typed. They must also be identical types. // llvm doc: If the operands are pointer typed, the pointer values are compared as if they were integers. case "slt", "ult" -> expressions.makeLTforced(left, right, operator.startsWith("s")); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java index 730ee74816..b09a77ff25 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.type.ArrayType; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.ScopedPointerType; import com.dat3m.dartagnan.parsers.SpirvBaseVisitor; import com.dat3m.dartagnan.parsers.SpirvParser; @@ -40,8 +41,8 @@ public Event visitOpBitcast(SpirvParser.OpBitcastContext ctx) { throw new ParsingException("Bitcast between arrays is not supported for id '%s'", id); } - if (resultType instanceof ScopedPointerType pointerType1 && operandType instanceof ScopedPointerType pointerType2 - && !(pointerType1.getScopeId().equals(pointerType2.getScopeId()))) { + if (resultType instanceof ScopedPointerType scpPointerType1 && operandType instanceof ScopedPointerType scpPointerType2 + && !(scpPointerType1.getScopeId().equals(scpPointerType2.getScopeId()))) { throw new ParsingException("Storage class mismatch in OpBitcast between '%s' and '%s' for id '%s'", typeId, operand, id); } @@ -55,7 +56,7 @@ public Event visitOpConvertPtrToU(SpirvParser.OpConvertPtrToUContext ctx) { String id = ctx.idResult().getText(); Type type = builder.getType(ctx.idResultType().getText()); Expression pointer = builder.getExpression(ctx.pointer().getText()); - if (type instanceof ScopedPointerType || !(type instanceof IntegerType)) { + if (!(type instanceof IntegerType)) { throw new ParsingException("Illegal OpConvertPtrToU for '%s', " + "attempt to convent into a non-integer type", id); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index 75fe90354b..2be7fcef08 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.Tag; @@ -515,7 +516,13 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Register regValue = e.getFunction().newRegister(type); Load load = newRMWLoadExclusiveWithMo(regValue, address, ARMv8.extractLoadMoFromLKMo(mo)); - Store store = newRMWStoreExclusiveWithMo(address, expressions.makePtrAdd(regValue, e.getOperand()), true, ARMv8.extractStoreMoFromLKMo(mo)); + Expression expr; + if(regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { + expr = expressions.makePtrAdd(regValue, e.getOperand()); + } else if( regValue.getType() instanceof IntegerType){ + expr = expressions.makeAdd(regValue, e.getOperand()); + }else {throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless argument");} + Store store = newRMWStoreExclusiveWithMo(address, expr, true, ARMv8.extractStoreMoFromLKMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(regValue, label); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java index 95c6be0862..cd2a3c1982 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java @@ -5,6 +5,7 @@ import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.Tag; @@ -818,7 +819,13 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Register regValue = e.getFunction().newRegister(type); // Power does not have mo tags, thus we use the empty string Load load = newRMWLoadExclusive(regValue, address); - Store store = Power.newRMWStoreConditional(address, expressions.makePtrAdd(regValue, e.getOperand()), true); + Expression expr; + if(regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { + expr = expressions.makePtrAdd(regValue, e.getOperand()); + } else if( regValue.getType() instanceof IntegerType){ + expr = expressions.makeAdd(regValue, e.getOperand()); + }else {throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless operand");} + Store store = Power.newRMWStoreConditional(address, expr, true); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(regValue, label); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index f3f05ad9ef..338f7099a2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.Tag; @@ -571,7 +572,13 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Register regValue = e.getFunction().newRegister(type); Load load = newRMWLoadExclusive(regValue, address); // TODO: No mo on the load? - Store store = RISCV.newRMWStoreConditional(address, expressions.makePtrAdd(regValue, e.getOperand()), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); + Expression expr; + if(regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { + expr = expressions.makePtrAdd(regValue, e.getOperand()); + } else if( regValue.getType() instanceof IntegerType){ + expr = expressions.makeAdd(regValue, e.getOperand()); + }else {throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless argument");} + Store store = RISCV.newRMWStoreConditional(address, expr, mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); // TODO: Why does this use a different fake dep (from the load) than the other RMW events (from the store)? Label label = newLabel("FakeDep"); From b895b04277ac1257e3003c0e0ad8479bd7cc06d4 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Fri, 5 Dec 2025 20:07:18 +0100 Subject: [PATCH 037/109] renaming of some scoped pointer type variables (confusion between pointer and scoped pointer while searching) --- .../parsers/program/visitors/spirv/VisitorOpsAtomic.java | 3 ++- .../program/visitors/spirv/builders/ProgramBuilder.java | 4 ++-- .../dat3m/dartagnan/program/memory/ScopedPointerVariable.java | 4 ++-- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java index dd7cce41d0..d47d703b40 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsAtomic.java @@ -8,6 +8,7 @@ import com.dat3m.dartagnan.expression.integers.IntCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.type.ScopedPointerType; import com.dat3m.dartagnan.parsers.SpirvBaseVisitor; import com.dat3m.dartagnan.parsers.SpirvParser; import com.dat3m.dartagnan.parsers.program.visitors.spirv.helpers.HelperTags; @@ -144,7 +145,7 @@ private Event visitOpAtomicExtremum( String scope = getScopeTag(scopeCtx.getText()); Set tags = getMemorySemanticsTags(tagsCtx.getText()); tags.add(builder.getPointerStorageClass(ptrCtx.getText())); - if (!(ptr.getType() instanceof PointerType) || !(value.getType() instanceof IntegerType)) { + if (!(ptr.getType() instanceof ScopedPointerType) || !(value.getType() instanceof IntegerType)) { throw new ParsingException("Unexpected type at '%s' or '%s', expected pointer or integer but received '%s' and '%s'", ptrCtx.getText(), valCtx.getText(), ptr.getType(), value.getType()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/builders/ProgramBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/builders/ProgramBuilder.java index 10f4db6083..19d1ee5110 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/builders/ProgramBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/builders/ProgramBuilder.java @@ -199,8 +199,8 @@ public ScopedPointerVariable allocateMemory(String id, ScopedPointerType type, E public String getPointerStorageClass(String id) { Expression expression = getExpression(id); - if (expression.getType() instanceof ScopedPointerType pointerType) { - return pointerType.getScopeId(); + if (expression.getType() instanceof ScopedPointerType scpPointerType) { + return scpPointerType.getScopeId(); } throw new ParsingException("Reference to undefined pointer '%s'", id); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/ScopedPointerVariable.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/ScopedPointerVariable.java index 6d7ac5158d..58fb998682 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/ScopedPointerVariable.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/ScopedPointerVariable.java @@ -4,8 +4,8 @@ import com.dat3m.dartagnan.expression.type.ScopedPointerType; public class ScopedPointerVariable extends ScopedPointer { - public ScopedPointerVariable(String id, ScopedPointerType pointerType, MemoryObject address) { - super(id, pointerType, address); + public ScopedPointerVariable(String id, ScopedPointerType spt, MemoryObject address) { + super(id, spt, address); } @Override From 9931b070f1d786eb60dc772b1f9bdc6a29658214 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 7 Dec 2025 20:09:21 +0100 Subject: [PATCH 038/109] added comments --- .../java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java | 2 +- .../program/analysis/alias/InclusionBasedPointerAnalysis.java | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index d0fd619d03..3ce52f3738 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -564,7 +564,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { final TypedFormula address = encodeIntegerExpr(expr.getOperand()); - // todo add support for lossy cast like int128 to ptr(is it even possible?) + // todo add support for lossy casts like int64 to ptr32(is it even possible?) if (!context.useIntegers) { int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); int pbw = expr.getType().getBitWidth(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index 15bdc25849..c06bad82c4 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -326,6 +326,7 @@ private void processWriter(RegWriter event) { final DerivedVariable address = getResultVariable(load.getAddress(), load); if (address == null) { logger.warn("null pointer address for {}", synContext.get().getContextInfo(event)); + // fixme does this make sense here? return; } addressVariables.put(load, address); From e55b6f49991d705904758ceb91cc1d3521ff8640 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 7 Dec 2025 21:38:38 +0100 Subject: [PATCH 039/109] fixed inline asm unsupported operation --- .../dartagnan/expression/ExpressionFactory.java | 4 ++++ .../parsers/program/visitors/VisitorAsmPPC.java | 14 ++++++++++---- .../parsers/program/visitors/VisitorAsmRISCV.java | 6 ++++-- .../parsers/program/visitors/VisitorLitmusC.java | 6 +++++- 4 files changed, 23 insertions(+), 7 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 00348fd260..1b7aa76ac9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -103,6 +103,10 @@ public IntLiteral makeValue(BigInteger value) { return new IntLiteral(types.getArchType(), value); } + public IntLiteral makeValue(BigInteger value, int bitwidth) { + return new IntLiteral(types.getIntegerType(bitwidth), value); + } + public IntLiteral makeValue(long value, IntegerType type) { return makeValue(BigInteger.valueOf(value), type); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java index 7b5dbd82bb..e9778bd3aa 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java @@ -11,6 +11,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.parsers.AsmPPCBaseVisitor; import com.dat3m.dartagnan.parsers.AsmPPCParser; import com.dat3m.dartagnan.parsers.program.utils.AsmUtils; @@ -20,6 +21,8 @@ import com.dat3m.dartagnan.program.event.EventFactory; import com.dat3m.dartagnan.program.event.core.Label; import com.dat3m.dartagnan.program.event.core.Local; +import scala.concurrent.impl.FutureConvertersImpl; + import static com.google.common.base.Preconditions.checkState; public class VisitorAsmPPC extends AsmPPCBaseVisitor { @@ -89,7 +92,7 @@ public Object visitLoadReserve(AsmPPCParser.LoadReserveContext ctx) { Register address = (Register) ctx.register(1).accept(this); expectedType = address.getType(); Expression offset = (Expression) ctx.value().accept(this); - Expression newAddress = expressions.makeAdd(address,offset); + Expression newAddress = expressions.makePtrAdd(address,offset); asmInstructions.add(EventFactory.newRMWLoadExclusive(register, newAddress)); return null; } @@ -108,7 +111,7 @@ public Object visitStoreConditional(AsmPPCParser.StoreConditionalContext ctx) { Register address = (Register) ctx.register(1).accept(this); expectedType = address.getType(); Expression offset = (Expression) ctx.value().accept(this); - Expression newAddress = expressions.makeAdd(address,offset); + Expression newAddress = expressions.makePtrAdd(address,offset); Register resultRegister = llvmFunction.getOrNewRegister("CondStoreResult", value.getType()); this.comparator = new CmpInstruction(resultRegister,expressions.makeZero((IntegerType) value.getType())); asmInstructions.add(EventFactory.Common.newExclusiveStore(resultRegister, newAddress, value, "")); @@ -183,10 +186,13 @@ public Object visitLabelDefinition(AsmPPCParser.LabelDefinitionContext ctx) { @Override public Object visitValue(AsmPPCParser.ValueContext ctx) { - checkState(expectedType instanceof IntegerType, "Expected type is not an integer type"); + checkState(expectedType instanceof IntegerType || expectedType instanceof PointerType, "Expected type is not an integer or pointer type"); String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, (IntegerType) expectedType); + if (expectedType instanceof IntegerType) { + return expressions.makeValue(value, (IntegerType) expectedType); + } + return expressions.makeValue(value, ((PointerType) expectedType).getBitWidth()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java index 6a5d2f1c02..a1aef2021c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java @@ -329,10 +329,12 @@ public Object visitValue(AsmRISCVParser.ValueContext ctx) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); return expressions.makeValue(value, (IntegerType) expectedType); - }else if (expectedType instanceof PointerType){ + } + else if (expectedType instanceof PointerType){ String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeIntToPtrCast(expressions.makeValue(value)); // not directly !? + // return expressions.makeIntToPtrCast(expressions.makeValue(value)); // fixme works as int when expected type is pointer ?!? + return expressions.makeValue(value); } throw new RuntimeException("Unexpected type " + expectedType + " visited"); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index c0dc4c009e..f464ceb218 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -437,7 +437,7 @@ public Expression visitReLoad(LitmusCParser.ReLoadContext ctx){ @Override public Expression visitReReadOnce(LitmusCParser.ReReadOnceContext ctx){ - Register register = getReturnRegister(true); + Register register = getReturnRegister(pointerType); Event event = EventFactory.Linux.newLKMMLoad(register, getAddress(ctx.address), ctx.mo); programBuilder.addChild(currentThread, event); return register; @@ -588,6 +588,9 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ } Expression value = (Expression)ctx.re().accept(this); if(variable instanceof MemoryObject || variable instanceof Register){ + if (!(variable.getType() instanceof PointerType)){ + System.out.println("non ptr reg in nre??"); + } Event event = EventFactory.newStoreWithMo(expressions.makeCast(variable, pointerType), value, C11.NONATOMIC); if (isOpenCL) { event.addTags(Tag.OpenCL.DEFAULT_WEAK_SCOPE); @@ -698,6 +701,7 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ private Expression getAddress(LitmusCParser.ReContext ctx){ Expression address = (Expression)ctx.accept(this); if(address.getType() instanceof IntegerType){ + //System.out.println("int address in visitor litmus c"); return expressions.makeIntToPtrCast(address); } if(address.getType() instanceof PointerType){ From 3e9f80acd0601c7bc62367f39940fe60e56b60ed Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 8 Dec 2025 21:51:20 +0100 Subject: [PATCH 040/109] fixed litmus c bitvector problem --- .../dartagnan/encoding/EncodingContext.java | 2 +- .../parsers/program/utils/ProgramBuilder.java | 14 +++ .../program/visitors/VisitorAsmArm.java | 9 +- .../program/visitors/VisitorLitmusC.java | 97 +++++++++++-------- .../program/event/core/ExecutionStatus.java | 5 +- .../verification/solving/AssumeSolver.java | 1 + .../dartagnan/litmus/AbstractLitmusTest.java | 2 +- .../dat3m/dartagnan/llvm/AbstractCTest.java | 2 +- .../com/dat3m/dartagnan/llvm/MixedTest.java | 3 +- dartagnan/src/test/resources/log4j2.xml | 2 +- 10 files changed, 84 insertions(+), 53 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java index 507d4d5c9a..7ec046c451 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java @@ -311,7 +311,7 @@ private void initialize() { if (e instanceof RegWriter rw) { final Register register = rw.getResultRegister(); final String name = register.getName() + "(" + e.getGlobalId() + "_result)"; - results.put(e, exprEncoder.makeVariable(name, register.getType())); + results.put(e, exprEncoder.makeVariable(name, register.getType())); // !! } if (e instanceof MemoryCoreEvent memEvent) { addresses.put(e, exprEncoder.encodeAt(memEvent.getAddress(), memEvent)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java index f763e163ff..58fde7ab3f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java @@ -5,8 +5,11 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.integers.IntCmpExpr; +import com.dat3m.dartagnan.expression.integers.IntCmpOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; import com.dat3m.dartagnan.expression.type.FunctionType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.*; import com.dat3m.dartagnan.program.Thread; @@ -131,6 +134,16 @@ public void setAssertFilter(Expression ass) { program.setFilterSpecification(ass); } + public Expression makeIntCmpWithIntOutput(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmpWithIntOutput(expressions.makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); + } + if (rightOperand.getType() instanceof PointerType){ + return makeIntCmpWithIntOutput(leftOperand, operator, expressions.makePtrToIntCast(rightOperand, types.getArchType())); + } + return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); + } + // ---------------------------------------------------------------------------------------------------------------- // Threads and Functions @@ -297,6 +310,7 @@ public Label getEndOfThreadLabel(int tid) { return getOrCreateLabel(tid, "END_OF_T" + tid); } + // ---------------------------------------------------------------------------------------------------------------- // GPU public void newScopedThread(Arch arch, String name, int id, int ...scopeIds) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index f896cce686..7bd964d715 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -401,11 +401,12 @@ public Object visitValue(AsmArmParser.ValueContext ctx) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); return expressions.makeValue(value, (IntegerType) expectedType); - }else if (expectedType instanceof PointerType){ - String valueString = ctx.Numbers().getText(); - BigInteger value = new BigInteger(valueString); - return expressions.makeIntToPtrCast(expressions.makeValue(value)); } +// else if (expectedType instanceof PointerType){ +// String valueString = ctx.Numbers().getText(); +// BigInteger value = new BigInteger(valueString); +// return expressions.makeIntToPtrCast(expressions.makeValue(value)); +// } throw new RuntimeException("Unexpected type " + expectedType + " visited"); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index f464ceb218..98a3a11193 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -5,7 +5,9 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; @@ -20,6 +22,8 @@ import com.dat3m.dartagnan.program.event.core.*; import com.dat3m.dartagnan.program.event.lang.catomic.*; import com.dat3m.dartagnan.program.memory.MemoryObject; +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; import java.util.ArrayList; import java.util.List; @@ -27,6 +31,7 @@ import static com.dat3m.dartagnan.program.event.Tag.C11; public class VisitorLitmusC extends LitmusCBaseVisitor { + Logger logger = LogManager.getLogger(VisitorLitmusC.class); private final ProgramBuilder programBuilder = ProgramBuilder.forLanguage(Program.SourceLanguage.LITMUS); private final ExpressionFactory expressions = programBuilder.getExpressionFactory(); @@ -268,7 +273,7 @@ public Object visitWhileExpression(LitmusCParser.WhileExpressionContext ctx) { // Returns new value (the value after computation) @Override public Expression visitReAtomicOpReturn(LitmusCParser.ReAtomicOpReturnContext ctx){ - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = returnExpressionOrOne(ctx.value); Event event = EventFactory.Linux.newRMWOpReturn(getAddress(ctx.address), register, value, ctx.op, ctx.mo); programBuilder.addChild(currentThread, event); @@ -278,7 +283,7 @@ public Expression visitReAtomicOpReturn(LitmusCParser.ReAtomicOpReturnContext ct // Returns old value (the value before computation) @Override public Expression visitReAtomicFetchOp(LitmusCParser.ReAtomicFetchOpContext ctx){ - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = returnExpressionOrOne(ctx.value); Event event = EventFactory.Linux.newRMWFetchOp(getAddress(ctx.address), register, value, ctx.op, ctx.mo); programBuilder.addChild(currentThread, event); @@ -287,7 +292,7 @@ public Expression visitReAtomicFetchOp(LitmusCParser.ReAtomicFetchOpContext ctx) @Override public Expression visitC11AtomicOp(LitmusCParser.C11AtomicOpContext ctx) { - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = returnExpressionOrOne(ctx.value); Expression address = getAddress(ctx.address); Event event = EventFactory.Atomic.newFetchOp(register, address, value, ctx.op, ctx.c11Mo().mo); @@ -299,7 +304,7 @@ public Expression visitC11AtomicOp(LitmusCParser.C11AtomicOpContext ctx) { @Override public Expression visitReAtomicOpAndTest(LitmusCParser.ReAtomicOpAndTestContext ctx){ - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = returnExpressionOrOne(ctx.value); Event event = EventFactory.Linux.newRMWOpAndTest(getAddress(ctx.address), register, value, ctx.op); programBuilder.addChild(currentThread, event); @@ -309,7 +314,7 @@ public Expression visitReAtomicOpAndTest(LitmusCParser.ReAtomicOpAndTestContext // Returns non-zero if the addition was executed, zero otherwise @Override public Expression visitReAtomicAddUnless(LitmusCParser.ReAtomicAddUnlessContext ctx){ - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression) ctx.value.accept(this); Expression cmp = (Expression) ctx.cmp.accept(this); programBuilder.addChild(currentThread, EventFactory.Linux.newRMWAddUnless(getAddress(ctx.address), register, cmp, value)); @@ -318,7 +323,7 @@ public Expression visitReAtomicAddUnless(LitmusCParser.ReAtomicAddUnlessContext @Override public Expression visitReC11AtomicXchg(LitmusCParser.ReC11AtomicXchgContext ctx) { - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); Event event = EventFactory.Atomic.newExchange(register, address, value, Tag.C11.MO_SC); @@ -329,7 +334,7 @@ public Expression visitReC11AtomicXchg(LitmusCParser.ReC11AtomicXchgContext ctx) @Override public Expression visitReC11AtomicXchgExplicit(LitmusCParser.ReC11AtomicXchgExplicitContext ctx) { - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); Event event = EventFactory.Atomic.newExchange(register, address, value, ctx.c11Mo().mo); @@ -340,7 +345,7 @@ public Expression visitReC11AtomicXchgExplicit(LitmusCParser.ReC11AtomicXchgExpl @Override public Expression visitReXchg(LitmusCParser.ReXchgContext ctx){ - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression) ctx.value.accept(this); Event event = EventFactory.Linux.newRMWExchange(getAddress(ctx.address), register, value, ctx.mo); programBuilder.addChild(currentThread, event); @@ -349,7 +354,7 @@ public Expression visitReXchg(LitmusCParser.ReXchgContext ctx){ @Override public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicitContext ctx) { - Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -362,7 +367,7 @@ public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicit @Override public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { - Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -375,7 +380,7 @@ public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { @Override public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicitContext ctx) { - Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -388,7 +393,7 @@ public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicit @Override public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { - Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression)ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); @@ -401,7 +406,7 @@ public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { @Override public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ - Register register = getReturnRegister(TypeFactory.getInstance().getArchType()); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression cmp = (Expression)ctx.cmp.accept(this); Expression value = (Expression)ctx.value.accept(this); Event event = EventFactory.Linux.newRMWCompareExchange(getAddress(ctx.address), register, cmp, value, ctx.mo); @@ -410,7 +415,7 @@ public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ } @Override public Expression visitReC11LoadExplicit(LitmusCParser.ReC11LoadExplicitContext ctx) { - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression address = getAddress(ctx.address); AtomicLoad event = EventFactory.Atomic.newLoad(register, address, ctx.c11Mo().mo); addScopeTag(event, ctx.openCLScope()); @@ -419,7 +424,7 @@ public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ } @Override public Expression visitReC11Load(LitmusCParser.ReC11LoadContext ctx) { - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression address = getAddress(ctx.address); AtomicLoad event = EventFactory.Atomic.newLoad(register, address, C11.DEFAULT_MO); addScopeTag(event, null); @@ -429,7 +434,7 @@ public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ @Override public Expression visitReLoad(LitmusCParser.ReLoadContext ctx){ - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Event event = EventFactory.Linux.newLKMMLoad(register, getAddress(ctx.address), ctx.mo); programBuilder.addChild(currentThread, event); return register; @@ -437,7 +442,7 @@ public Expression visitReLoad(LitmusCParser.ReLoadContext ctx){ @Override public Expression visitReReadOnce(LitmusCParser.ReReadOnceContext ctx){ - Register register = getReturnRegister(pointerType); + Register register = getReReturnRegisterOrDefaultTo(archType); Event event = EventFactory.Linux.newLKMMLoad(register, getAddress(ctx.address), ctx.mo); programBuilder.addChild(currentThread, event); return register; @@ -445,7 +450,7 @@ public Expression visitReReadOnce(LitmusCParser.ReReadOnceContext ctx){ @Override public Expression visitReReadNa(LitmusCParser.ReReadNaContext ctx){ - Register register = getReturnRegister(true); + Register register = getReReturnRegisterOrDefaultTo(archType); Expression address = getAddress(ctx.address); Load event = EventFactory.newLoadWithMo(register, address, C11.NONATOMIC); programBuilder.addChild(currentThread, event); @@ -457,25 +462,31 @@ public Expression visitReReadNa(LitmusCParser.ReReadNaContext ctx){ @Override public Expression visitReOpCompare(LitmusCParser.ReOpCompareContext ctx){ - Register register = getReturnRegister(false); + Register register = getOptionalReturnRegister(); Expression v1 = (Expression)ctx.re(0).accept(this); Expression v2 = (Expression)ctx.re(1).accept(this); - Expression result = expressions.makeIntCmpForced(v1, ctx.opCompare().op, v2); + Expression result = programBuilder.makeIntCmpWithIntOutput(v1, ctx.opCompare().op, v2); return assignToReturnRegister(register, result); } @Override public Expression visitReOpArith(LitmusCParser.ReOpArithContext ctx){ - Register register = getReturnRegister(false); + Register register = getOptionalReturnRegister(); Expression v1 = (Expression)ctx.re(0).accept(this); Expression v2 = (Expression)ctx.re(1).accept(this); - Expression result = expressions.makeIntBinaryForced(v1, ctx.opArith().op, v2); + Expression result; + assert v2.getType() instanceof IntegerType || v1.getType() instanceof IntegerType; + if (ctx.opArith().op == IntBinaryOp.ADD && v1.getType() instanceof PointerType && v2.getType() instanceof IntegerType) { + result = expressions.makePtrAdd(v1, v2); + }else if (ctx.opArith().op == IntBinaryOp.ADD && v2.getType() instanceof PointerType && v1.getType() instanceof IntegerType) { + result = expressions.makePtrAdd(v2, v1); + } else { result = expressions.makeIntBinary(v1, ctx.opArith().op, v2);} return assignToReturnRegister(register, result); } @Override public Expression visitReOpBool(LitmusCParser.ReOpBoolContext ctx){ - Register register = getReturnRegister(false); + Register register = getOptionalReturnRegister(); Expression v1 = (Expression)ctx.re(0).accept(this); Expression v2 = (Expression)ctx.re(1).accept(this); v1 = expressions.makeBooleanCast(v1); @@ -486,7 +497,7 @@ public Expression visitReOpBool(LitmusCParser.ReOpBoolContext ctx){ @Override public Expression visitReOpBoolNot(LitmusCParser.ReOpBoolNotContext ctx){ - Register register = getReturnRegister(false); + Register register = getOptionalReturnRegister(); Expression v = (Expression)ctx.re().accept(this); v = expressions.makeBooleanCast(v); Expression result = expressions.makeNot(v); @@ -505,14 +516,14 @@ public Expression visitReParenthesis(LitmusCParser.ReParenthesisContext ctx){ @Override public Expression visitReCast(LitmusCParser.ReCastContext ctx){ - Register register = getReturnRegister(false); + Register register = getOptionalReturnRegister(); Expression result = (Expression)ctx.re().accept(this); return assignToReturnRegister(register, result); } @Override public Expression visitReVarName(LitmusCParser.ReVarNameContext ctx){ - Register register = getReturnRegister(false); + Register register = getOptionalReturnRegister(); Expression variable = visitVarName(ctx.varName()); if (variable instanceof Register result) { return assignToReturnRegister(register, result); @@ -522,7 +533,7 @@ public Expression visitReVarName(LitmusCParser.ReVarNameContext ctx){ @Override public Expression visitReConst(LitmusCParser.ReConstContext ctx){ - Register register = getReturnRegister(false); + Register register = getOptionalReturnRegister(); IntLiteral result = expressions.parseValue(ctx.getText(), archType); return assignToReturnRegister(register, result); } @@ -602,13 +613,8 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ @Override public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx){ - Register register = programBuilder.getRegister(scope, ctx.varName().getText()); - - if(register == null){ - if (ctx.typeSpecifier().Ast().isEmpty()){ - register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), archType); - }else{ - register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), pointerType);} //care + if(programBuilder.getRegister(scope, ctx.varName().getText()) == null){ + Register register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), parseNreDeclarationType(ctx)); if(ctx.re() != null){ returnRegister = register; ctx.re().accept(this); @@ -618,6 +624,12 @@ public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx) throw new ParsingException("Register " + ctx.varName().getText() + " is already initialised"); } + // helper + private Type parseNreDeclarationType(LitmusCParser.NreRegDeclarationContext ctx) { + if (ctx.typeSpecifier().Ast().isEmpty()) {return archType;} + else {return pointerType;} + } + @Override public Object visitNreC11Fence(LitmusCParser.NreC11FenceContext ctx) { AtomicThreadFence fence = EventFactory.Atomic.newFence(ctx.c11Mo().mo); @@ -701,7 +713,8 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ private Expression getAddress(LitmusCParser.ReContext ctx){ Expression address = (Expression)ctx.accept(this); if(address.getType() instanceof IntegerType){ - //System.out.println("int address in visitor litmus c"); + // todo reg default type is sometimes wrong ==> cast for now + logger.warn("Integer used as address."); return expressions.makeIntToPtrCast(address); } if(address.getType() instanceof PointerType){ @@ -715,24 +728,24 @@ private Expression returnExpressionOrOne(LitmusCParser.ReContext ctx) { return ctx != null ? (Expression) ctx.accept(this) : expressions.makeOne(archType); } - private Register getReturnRegister(boolean createOnNull){ + private Register getOptionalReturnRegister(){ Register register = returnRegister; - if(register == null && createOnNull){ - return programBuilder.getOrNewRegister(scope, null, archType); - } returnRegister = null; return register; } - private Register getReturnRegister(Type t){ + private Register getReReturnRegisterOrDefaultTo(Type defaultType){ Register register = returnRegister; - if(register == null){return programBuilder.getOrNewRegister(scope, null, t);} + if(register == null){ + logger.warn("Default register type used in a returning expression."); + return programBuilder.getOrNewRegister(scope, null, defaultType); + } returnRegister = null; return register; } private Expression assignToReturnRegister(Register register, Expression value) { if (register != null) { - Expression cast = expressions.makeCast(value, register.getType()); + Expression cast = expressions.makeCast(value, register.getType()); // !! programBuilder.addChild(currentThread, EventFactory.newLocal(register, cast)); } return value; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java index cf1de94589..ddd6820965 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java @@ -3,6 +3,7 @@ import com.dat3m.dartagnan.encoding.EncodingContext; import com.dat3m.dartagnan.encoding.ExpressionEncoder; import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.*; import org.sosy_lab.java_smt.api.BooleanFormula; @@ -20,6 +21,7 @@ public class ExecutionStatus extends AbstractEvent implements RegWriter, EventUs private final boolean trackDep; public ExecutionStatus(Register register, Event event, boolean trackDep) { + assert !(register.getType() instanceof PointerType); this.register = register; this.event = event; this.trackDep = trackDep; @@ -69,9 +71,10 @@ public BooleanFormula encodeExec(EncodingContext context) { // However, this is very counterintuitive and I think we should return 1/true on success and instead // change the compilation of Store-Conditional to invert the value. final Expression notExec = exprEncoder.wrap(bmgr.not(context.execution(event))); + var res = context.result(this); return bmgr.and( super.encodeExec(context), - context.getExpressionEncoder().equal(context.result(this), notExec, RIGHT_TO_LEFT) + context.getExpressionEncoder().equal(res, notExec, RIGHT_TO_LEFT) ); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java index 0bc81b3205..1f1c0e8141 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java @@ -83,6 +83,7 @@ private void run() throws InterruptedException, SolverException, InvalidConfigur logger.info("Starting second solver.check()"); res = prover.isUnsat() ? PASS : Result.UNKNOWN; } else { + // prover get model res = FAIL; saveFlaggedPairsOutput(memoryModel, wmmEncoder, prover, context, task.getProgram()); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java index 2a5cddbf5a..8dbb8b2712 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java @@ -87,7 +87,7 @@ protected Provider> getPropertyProvider() { protected Provider getConfigurationProvider() { return Provider.fromSupplier(() -> Configuration.builder() .setOption(INITIALIZE_REGISTERS, "true") - .setOption(USE_INTEGERS, "true") + .setOption(USE_INTEGERS, "false") .build()); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java index 4b27ed20c8..1bb62521bf 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java @@ -43,7 +43,7 @@ public AbstractCTest(String name, Arch target, Result expected) { protected Configuration getConfiguration() throws InvalidConfigurationException { return Configuration.builder() - .setOption(OptionNames.USE_INTEGERS, "true") + .setOption(OptionNames.USE_INTEGERS, "false") .build(); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MixedTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MixedTest.java index 842fb9f65a..a3a1cfe68f 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MixedTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MixedTest.java @@ -44,8 +44,7 @@ protected long getTimeout() { @Override protected Configuration getConfiguration() throws InvalidConfigurationException { - return Configuration.builder() - .setOption(MIXED_SIZE, "true") + return Configuration.builder().setOption(MIXED_SIZE, "true") .build(); } diff --git a/dartagnan/src/test/resources/log4j2.xml b/dartagnan/src/test/resources/log4j2.xml index 077745755f..627ff2e13d 100644 --- a/dartagnan/src/test/resources/log4j2.xml +++ b/dartagnan/src/test/resources/log4j2.xml @@ -16,7 +16,7 @@ - + From 7428666e3921144747e6c59710718d85d4a0856d Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 9 Dec 2025 21:15:10 +0100 Subject: [PATCH 041/109] improvement to casts --- .../dartagnan/encoding/ExpressionEncoder.java | 28 ++++++++++--------- .../expression/pointer/PtrToIntCast.java | 3 ++ .../expression/processing/ExprSimplifier.java | 9 +++--- 3 files changed, 23 insertions(+), 17 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 3ce52f3738..601ed07de6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -541,12 +541,11 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final TypedFormula inner = encodePointerExpr(expr.getOperand()); final Formula enc; if (context.useIntegers) { - if (expr.isExtension()) { - enc = inner.formula(); - }else { - final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); - final IntegerFormulaManager imgr = integerFormulaManager(); - enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue));} + if (!expr.isExtension()) { + final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); + final IntegerFormulaManager imgr = integerFormulaManager(); + enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue)); + }else{ enc = inner.formula(); } } else { assert inner.formula() instanceof BitvectorFormula; final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); @@ -554,9 +553,12 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final int targetBitWidth = expr.getTargetType().getBitWidth(); final int sourceBitWidth = expr.getSourceType().getBitWidth(); assert (sourceBitWidth == bvmgr.getLength(innerBv)); - enc = expr.isExtension() - ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) - : bvmgr.extract(innerBv, targetBitWidth - 1, 0); + if (expr.sameWidth()) { enc = innerBv;} + else{ + enc = expr.isExtension() + ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) + : bvmgr.extract(innerBv, targetBitWidth - 1, 0); + } } return new TypedFormula<>(expr.getType(), enc); } @@ -568,11 +570,11 @@ public TypedFormula visitIntCmpExpression(IntCmpExp if (!context.useIntegers) { int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); int pbw = expr.getType().getBitWidth(); - if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() + if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() .extend(((BitvectorFormula) address.formula()), pbw - ibw,false)); - }} - + } + } return new TypedFormula<>(expr.getType(), address.formula()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java index 5b9feebd5f..ad0c40558e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java @@ -22,6 +22,9 @@ public boolean isExtension() { private static boolean isExtension(PointerType sourceType, IntegerType targetType) { return sourceType.getBitWidth() < targetType.getBitWidth(); } + public boolean sameWidth() { + return getSourceType().getBitWidth() == getTargetType().getBitWidth(); + } @Override public T accept(ExpressionVisitor visitor) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 3ab7de8a08..51e605867b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -351,14 +351,15 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { if (offset instanceof IntLiteral lit) { if(lit.isZero()){return base;} } - // can cause a tearing problem - if (base instanceof NullLiteral) { - return expressions.makeIntToPtrCast(offset); - } + // can lower the alias analysis precision. +// if (base instanceof NullLiteral) { +// return expressions.makeIntToPtrCast(offset); +// } return expressions.makePtrAdd(base, offset); } // TODO: Add simplifications for IntExtract and IntConcat expressions. + // // Simplifies (int(i) -> ptr(i)) -> int(i). @Override From 05bec86f1e1a1a8189a55e7b2b9045dccab524e1 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 9 Dec 2025 21:52:26 +0100 Subject: [PATCH 042/109] added ptr add to InclusionBasedPointerAnalysis --- .../alias/InclusionBasedPointerAnalysis.java | 42 ++++++++++++++++++- 1 file changed, 41 insertions(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index c06bad82c4..152fda9f4a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -5,6 +5,7 @@ import com.dat3m.dartagnan.expression.aggregates.ConstructExpr; import com.dat3m.dartagnan.expression.aggregates.ExtractExpr; import com.dat3m.dartagnan.expression.integers.*; +import com.dat3m.dartagnan.expression.pointer.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.processing.ExpressionInspector; import com.dat3m.dartagnan.expression.type.TypeFactory; @@ -326,7 +327,6 @@ private void processWriter(RegWriter event) { final DerivedVariable address = getResultVariable(load.getAddress(), load); if (address == null) { logger.warn("null pointer address for {}", synContext.get().getContextInfo(event)); - // fixme does this make sense here? return; } addressVariables.put(load, address); @@ -1008,6 +1008,46 @@ public Expression visitMemoryObject(MemoryObject object) { record ExprFlip(Expression x, int factor) {} + + @Override + public List visitPtrAddExpression(PtrAddExpr x) { + BigInteger offset = BigInteger.ZERO; + final List operands = new ArrayList<>(); + final Stack stack = new Stack<>(); + if (!matchLinearExpression(new ExprFlip(x, 1), stack)) { + return visitExpression(x); + } + while (!stack.isEmpty()) { + final ExprFlip operand = stack.pop(); + if (matchLinearExpression(operand, stack)) { + continue; + } + if (operand.x instanceof IntLiteral literal) { + offset = offset.add(literal.getValue().multiply(BigInteger.valueOf(operand.factor))); + } else { + operands.add(operand); + } + } + final List result = new ArrayList<>(); + final int o = offset.intValue(); + for (int i = 0; i < operands.size(); i++) { + final ExprFlip operand = operands.get(i); + if (operand.factor != 1) { + result.addAll(visitExpression(operand.x)); + continue; + } + List alignment = List.of(); + for (int j = 0; j < operands.size(); j++) { + alignment = j == i ? alignment : compose(alignment, operands.get(j).factor); + } + for (IncludeEdge subResult : operand.x.accept(this)) { + addInto(result, compose(subResult, modifier(o, alignment)), false); + } + } + return result; + } + + @Override public List visitIntBinaryExpression(IntBinaryExpr x) { BigInteger offset = BigInteger.ZERO; From ea1af7154bddfed6f44a5aae8ce63b34e4b2b231 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 10 Dec 2025 21:00:03 +0100 Subject: [PATCH 043/109] fixes --- .../program/analysis/alias/InclusionBasedPointerAnalysis.java | 1 + .../dat3m/dartagnan/program/processing/ProcessingManager.java | 2 +- .../dat3m/dartagnan/program/processing/ThreadCreation.java | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index 152fda9f4a..9885fa93a0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -1009,6 +1009,7 @@ public Expression visitMemoryObject(MemoryObject object) { record ExprFlip(Expression x, int factor) {} + // fixme is ptr value treated the same as an int value? @Override public List visitPtrAddExpression(PtrAddExpr x) { BigInteger offset = BigInteger.ZERO; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index a0aa87a6ee..b3be734ee1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = false; + private boolean printAfterProcessing = true; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java index feb5a38327..2526296c8e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java @@ -185,7 +185,7 @@ private void resolveDynamicThreadJoin(Program program, List threadDa for (DynamicThreadJoin join : program.getThreadEvents(DynamicThreadJoin.class)) { final Thread caller = join.getThread(); final Expression tidExpr_ = join.getTid(); - // todo check if this makes sense as functions are now pointers + // todo check if this makes sense final Expression tidExpr = tidExpr_.getType() instanceof PointerType ? expressions.makePtrToIntCast(tidExpr_, archType) : tidExpr_; final Register joinRegister = join.getResultRegister(); @@ -465,7 +465,7 @@ private void replaceThreadLocalsWithStackalloc(Memory memory, Thread thread) { final List initialization = new ArrayList<>(); for (Integer initOffset : memoryObject.getInitializedFields()) { initialization.add(EventFactory.newStore( - exprs.makePtrAdd(reg, exprs.makeValue(initOffset, archType)), + exprs.makePtrAdd(reg, exprs.makeValue(initOffset, archType)),// null pointer store here!! memoryObject.getInitialValue(initOffset) )); } From 5f279b88a6e320315dcd2d38e7747c9b832556fc Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 11 Dec 2025 20:57:23 +0100 Subject: [PATCH 044/109] added encoding of ptrAdd in FieldSensitiveAndersen --- .../alias/FieldSensitiveAndersen.java | 33 ++++++++++++++ .../alias/InclusionBasedPointerAnalysis.java | 43 +++++++++++-------- 2 files changed, 59 insertions(+), 17 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java index 3fce6dd842..d4b598713f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.integers.IntSizeCast; import com.dat3m.dartagnan.expression.integers.IntUnaryExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Register; @@ -376,6 +377,38 @@ public Result visitIntBinaryExpression(IntBinaryExpr x) { return null; } +// @Override +// public Result visitPtrAddExpression(PtrAddExpr x) { +// Result l = x.getBase().accept(this); +// Result r = x.getOffset().accept(this); +// if (l == null || r == null ) { +// return null; +// } +// if (l.address == null && l.register == null && l.alignment == 0 && r.address == null && +// r.register == null && r.alignment == 0) { +// // TODO: Make sure that the type of normalization does not break this code. +// // Maybe always do signed normalization? +// return new Result(null, null, +// x.apply(l.offset, r.offset, x.getType().getBitWidth()), 0); +// } +// if (l.address != null && r.address != null) { +// return null; +// } +// MemoryObject base = l.address != null ? l.address : r.address; +// BigInteger offset = l.offset.add(r.offset); +// if (base != null) { +// return new Result(base, +// null, +// offset, +// min(min(l.alignment, l.register), min(r.alignment, r.register))); +// } +// if (l.register != null) { +// return new Result(null, l.register, offset, min(l.alignment, min(r.alignment, r.register))); +// } +// return new Result(null, r.register, offset, min(l.alignment, r.alignment)); +// +// } + @Override public Result visitIntUnaryExpression(IntUnaryExpr x) { Result i = x.getOperand().accept(this); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index 9885fa93a0..805b56d98d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -1006,24 +1006,23 @@ public Expression visitMemoryObject(MemoryObject object) { return edges; } - record ExprFlip(Expression x, int factor) {} - + record ExprFlip(Expression expr, int factor) {} // fixme is ptr value treated the same as an int value? @Override - public List visitPtrAddExpression(PtrAddExpr x) { + public List visitPtrAddExpression(PtrAddExpr expr) { BigInteger offset = BigInteger.ZERO; final List operands = new ArrayList<>(); final Stack stack = new Stack<>(); - if (!matchLinearExpression(new ExprFlip(x, 1), stack)) { - return visitExpression(x); + if (!matchPointerLinearExpression(new ExprFlip(expr, 1), stack)) { + return visitExpression(expr); } while (!stack.isEmpty()) { final ExprFlip operand = stack.pop(); - if (matchLinearExpression(operand, stack)) { + if (matchPointerLinearExpression(operand, stack)) { continue; } - if (operand.x instanceof IntLiteral literal) { + if (operand.expr instanceof IntLiteral literal) { offset = offset.add(literal.getValue().multiply(BigInteger.valueOf(operand.factor))); } else { operands.add(operand); @@ -1034,20 +1033,30 @@ public List visitPtrAddExpression(PtrAddExpr x) { for (int i = 0; i < operands.size(); i++) { final ExprFlip operand = operands.get(i); if (operand.factor != 1) { - result.addAll(visitExpression(operand.x)); + result.addAll(visitExpression(operand.expr)); continue; } List alignment = List.of(); for (int j = 0; j < operands.size(); j++) { alignment = j == i ? alignment : compose(alignment, operands.get(j).factor); } - for (IncludeEdge subResult : operand.x.accept(this)) { + for (IncludeEdge subResult : operand.expr.accept(this)) { addInto(result, compose(subResult, modifier(o, alignment)), false); } } return result; } + private boolean matchPointerLinearExpression(ExprFlip operand, Stack stack) { + if (!(operand.expr instanceof PtrAddExpr xp)) return false; + else { + final Expression left = xp.getBase(); + final Expression right = xp.getOffset(); + stack.push(new ExprFlip(right, operand.factor)); + stack.push(new ExprFlip(left, operand.factor)); + return true; + } + } @Override public List visitIntBinaryExpression(IntBinaryExpr x) { @@ -1062,7 +1071,7 @@ public List visitIntBinaryExpression(IntBinaryExpr x) { if (matchLinearExpression(operand, stack)) { continue; } - if (operand.x instanceof IntLiteral literal) { + if (operand.expr instanceof IntLiteral literal) { offset = offset.add(literal.getValue().multiply(BigInteger.valueOf(operand.factor))); } else { operands.add(operand); @@ -1073,14 +1082,14 @@ public List visitIntBinaryExpression(IntBinaryExpr x) { for (int i = 0; i < operands.size(); i++) { final ExprFlip operand = operands.get(i); if (operand.factor != 1) { - result.addAll(visitExpression(operand.x)); + result.addAll(visitExpression(operand.expr)); continue; } List alignment = List.of(); for (int j = 0; j < operands.size(); j++) { alignment = j == i ? alignment : compose(alignment, operands.get(j).factor); } - for (IncludeEdge subResult : operand.x.accept(this)) { + for (IncludeEdge subResult : operand.expr.accept(this)) { addInto(result, compose(subResult, modifier(o, alignment)), false); } } @@ -1088,11 +1097,11 @@ public List visitIntBinaryExpression(IntBinaryExpr x) { } private boolean matchLinearExpression(ExprFlip operand, Stack stack) { - final Expression left = operand.x instanceof IntBinaryExpr x ? x.getLeft() : null; - final Expression right = operand.x instanceof IntBinaryExpr x ? x.getRight() : null; - final boolean add = operand.x.getKind().equals(IntBinaryOp.ADD); - final boolean sub = operand.x.getKind().equals(IntBinaryOp.SUB); - final boolean mul = operand.x.getKind().equals(IntBinaryOp.MUL); + final Expression left = operand.expr instanceof IntBinaryExpr x ? x.getLeft() : null; + final Expression right = operand.expr instanceof IntBinaryExpr x ? x.getRight() : null; + final boolean add = operand.expr.getKind().equals(IntBinaryOp.ADD); + final boolean sub = operand.expr.getKind().equals(IntBinaryOp.SUB); + final boolean mul = operand.expr.getKind().equals(IntBinaryOp.MUL); if (add || sub) { stack.push(new ExprFlip(right, operand.factor * (add ? 1 : -1))); stack.push(new ExprFlip(left, operand.factor)); From d600b26e0137f75c3b72c85c04cb38d842265b47 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 11 Dec 2025 21:17:45 +0100 Subject: [PATCH 045/109] Temp fix for tearing not working correctly. Rll mixed tests pass (still take a long time because alias analysis is not yet optimal) --- .../dat3m/dartagnan/encoding/ExpressionEncoder.java | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 601ed07de6..4fae093c21 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -137,6 +137,16 @@ public enum ConversionMode { public BooleanFormula equal(Expression left, Expression right, ConversionMode cMode) { final ExpressionFactory exprs = context.getExpressionFactory(); + + // todo: this is just for the wmm encoding. So find a better place for it. Or add ptr size cast. + // But why is there an equal(ptr8, ptr64) in lockref1 and lockref2 tests? + // Is tearing not working correctly?? + + if (left.getType() instanceof PointerType && right.getType() instanceof PointerType) { + left = exprs.makeCast(left, types.getArchType()); + right = exprs.makeCast(right, types.getArchType()); + return encodeBooleanFinal(exprs.makeEQ(left, right)).formula(); + } switch (cMode) { case NO -> {} case LEFT_TO_RIGHT -> left = exprs.makeCast(left, right.getType()); From c70b0987fee820218a124cb43c1bd32e07dedd08 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Fri, 12 Dec 2025 20:49:51 +0100 Subject: [PATCH 046/109] more clarity --- .../dartagnan/encoding/ExpressionEncoder.java | 3 ++ .../program/visitors/VisitorLitmusC.java | 2 +- .../program/visitors/VisitorLitmusRISCV.java | 2 +- .../program/analysis/alias/AliasAnalysis.java | 4 +-- .../alias/FieldSensitiveAndersen.java | 32 +------------------ .../alias/InclusionBasedPointerAnalysis.java | 3 ++ .../dartagnan/litmus/AbstractLitmusTest.java | 2 +- .../dat3m/dartagnan/llvm/AbstractCTest.java | 2 +- dartagnan/src/test/resources/log4j2.xml | 2 +- 9 files changed, 14 insertions(+), 38 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 4fae093c21..20eef51b63 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -147,6 +147,9 @@ public BooleanFormula equal(Expression left, Expression right, ConversionMode cM right = exprs.makeCast(right, types.getArchType()); return encodeBooleanFinal(exprs.makeEQ(left, right)).formula(); } + + // -------------------------------------------------------------------------------------------- + switch (cMode) { case NO -> {} case LEFT_TO_RIGHT -> left = exprs.makeCast(left, right.getType()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 98a3a11193..91b9414c90 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -600,7 +600,7 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ Expression value = (Expression)ctx.re().accept(this); if(variable instanceof MemoryObject || variable instanceof Register){ if (!(variable.getType() instanceof PointerType)){ - System.out.println("non ptr reg in nre??"); + System.out.println("store to a non ptr (after cast) reg in nre??"); } Event event = EventFactory.newStoreWithMo(expressions.makeCast(variable, pointerType), value, C11.NONATOMIC); if (isOpenCL) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java index af1edb2d4b..efae3f1c4f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java @@ -133,7 +133,7 @@ public Object visitOr(LitmusRISCVParser.OrContext ctx) { @Override public Object visitAdd(LitmusRISCVParser.AddContext ctx) { - // todo problem here is an int reg being retrieved as r1. Should it be possible?? + // todo problem here is an int reg being retrieved as r1. Should this even be possible?? Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), pointerType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java index 51453e28dd..e5f0fa4141 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java @@ -79,7 +79,7 @@ final class Config { @Option(name = ALIAS_GRAPHVIZ, description = "If 'true', stores the results of the alias analysis as a PNG image." + " Defaults to 'false'.") - private boolean graphviz; + private boolean graphviz = true; @Option(name = ALIAS_GRAPHVIZ_SPLIT_BY_THREAD, description = "Controls which event sets are represented by nodes in the graph output." + @@ -99,7 +99,7 @@ final class Config { description = "If 'true' and supported, the graph shows an internal representation." + " Requires '" + ALIAS_GRAPHVIZ + "=true'." + " Defaults to 'false'.", secure = true) - boolean graphvizInternal; + boolean graphvizInternal = true; final boolean detectMixedSizeAccesses; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java index d4b598713f..08102684bc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java @@ -377,37 +377,7 @@ public Result visitIntBinaryExpression(IntBinaryExpr x) { return null; } -// @Override -// public Result visitPtrAddExpression(PtrAddExpr x) { -// Result l = x.getBase().accept(this); -// Result r = x.getOffset().accept(this); -// if (l == null || r == null ) { -// return null; -// } -// if (l.address == null && l.register == null && l.alignment == 0 && r.address == null && -// r.register == null && r.alignment == 0) { -// // TODO: Make sure that the type of normalization does not break this code. -// // Maybe always do signed normalization? -// return new Result(null, null, -// x.apply(l.offset, r.offset, x.getType().getBitWidth()), 0); -// } -// if (l.address != null && r.address != null) { -// return null; -// } -// MemoryObject base = l.address != null ? l.address : r.address; -// BigInteger offset = l.offset.add(r.offset); -// if (base != null) { -// return new Result(base, -// null, -// offset, -// min(min(l.alignment, l.register), min(r.alignment, r.register))); -// } -// if (l.register != null) { -// return new Result(null, l.register, offset, min(l.alignment, min(r.alignment, r.register))); -// } -// return new Result(null, r.register, offset, min(l.alignment, r.alignment)); -// -// } + // todo: add visitPtrAddExpression. @Override public Result visitIntUnaryExpression(IntUnaryExpr x) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index 805b56d98d..fffd9c9045 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -26,10 +26,13 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; +import java.io.File; +import java.io.FileWriter; import java.math.BigInteger; import java.util.*; import java.util.stream.IntStream; +import static com.dat3m.dartagnan.GlobalSettings.getOrCreateOutputDirectory; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Verify.verify; diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java index 8dbb8b2712..2a5cddbf5a 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/litmus/AbstractLitmusTest.java @@ -87,7 +87,7 @@ protected Provider> getPropertyProvider() { protected Provider getConfigurationProvider() { return Provider.fromSupplier(() -> Configuration.builder() .setOption(INITIALIZE_REGISTERS, "true") - .setOption(USE_INTEGERS, "false") + .setOption(USE_INTEGERS, "true") .build()); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java index 1bb62521bf..4b27ed20c8 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java @@ -43,7 +43,7 @@ public AbstractCTest(String name, Arch target, Result expected) { protected Configuration getConfiguration() throws InvalidConfigurationException { return Configuration.builder() - .setOption(OptionNames.USE_INTEGERS, "false") + .setOption(OptionNames.USE_INTEGERS, "true") .build(); } diff --git a/dartagnan/src/test/resources/log4j2.xml b/dartagnan/src/test/resources/log4j2.xml index 627ff2e13d..3660db934e 100644 --- a/dartagnan/src/test/resources/log4j2.xml +++ b/dartagnan/src/test/resources/log4j2.xml @@ -16,7 +16,7 @@ - + From a22b3b659a9e5a84d31e1d98c4748bfcec76e24a Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 13 Dec 2025 09:37:20 +0100 Subject: [PATCH 047/109] fixed null ptr store --- .../analysis/alias/InclusionBasedPointerAnalysis.java | 9 +++------ .../dat3m/dartagnan/program/event/EventFactory.java | 2 +- .../dat3m/dartagnan/program/processing/Intrinsics.java | 10 +++++++--- 3 files changed, 11 insertions(+), 10 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index fffd9c9045..686d310a2e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -26,13 +26,10 @@ import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; -import java.io.File; -import java.io.FileWriter; import java.math.BigInteger; import java.util.*; import java.util.stream.IntStream; -import static com.dat3m.dartagnan.GlobalSettings.getOrCreateOutputDirectory; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Verify.verify; @@ -1017,12 +1014,12 @@ public List visitPtrAddExpression(PtrAddExpr expr) { BigInteger offset = BigInteger.ZERO; final List operands = new ArrayList<>(); final Stack stack = new Stack<>(); - if (!matchPointerLinearExpression(new ExprFlip(expr, 1), stack)) { + if (!matchPtrAddExpression(new ExprFlip(expr, 1), stack)) { return visitExpression(expr); } while (!stack.isEmpty()) { final ExprFlip operand = stack.pop(); - if (matchPointerLinearExpression(operand, stack)) { + if (matchPtrAddExpression(operand, stack)) { continue; } if (operand.expr instanceof IntLiteral literal) { @@ -1050,7 +1047,7 @@ public List visitPtrAddExpression(PtrAddExpr expr) { return result; } - private boolean matchPointerLinearExpression(ExprFlip operand, Stack stack) { + private boolean matchPtrAddExpression(ExprFlip operand, Stack stack) { if (!(operand.expr instanceof PtrAddExpr xp)) return false; else { final Expression left = xp.getBase(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java index 8ed55c8ac7..39ae7507bb 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java @@ -119,7 +119,7 @@ public static Alloc newAlloc(Register register, Type allocType, Expression array public static Alloc newAlignedAlloc(Register register, Type allocType, Expression arraySize, Expression alignment, boolean isHeapAlloc, boolean doesZeroOutMemory) { - arraySize = expressions.makeCast(arraySize, types.getArchType(), false); + arraySize = expressions.makeCast(arraySize, types.getArchType(), false); // why cast? alignment = expressions.makeCast(alignment, types.getArchType(), false); return new Alloc(register, allocType, arraySize, alignment, isHeapAlloc, doesZeroOutMemory); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index d4fa101781..4fe6b91cf6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -6,8 +6,10 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointer.NullLiteral; import com.dat3m.dartagnan.expression.type.FunctionType; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; @@ -453,7 +455,9 @@ private List inlinePthreadJoin(FunctionCall call) { assert arguments.size() == 2; final Expression tidExpr = arguments.get(0); final Expression returnAddr = arguments.get(1); - final boolean hasReturnAddr = !(returnAddr instanceof IntLiteral lit && lit.isZero()); + // final boolean hasReturnAddr = !(returnAddr instanceof IntLiteral lit && lit.isZero()); + assert returnAddr.getType() instanceof PointerType; + final boolean hasReturnAddr = !(returnAddr instanceof NullLiteral); // is this enough? final Register statusRegister = getResultRegister(call); final IntegerType statusType = (IntegerType) statusRegister.getType(); @@ -1594,7 +1598,7 @@ private List inlineNonDet(FunctionCall call) { private List inlineMemCpy(FunctionCall call) { final Function caller = call.getFunction(); final Expression dest = call.getArguments().get(0); - final Expression src = call.getArguments().get(1); + final Expression src = call.getArguments().get(1); // null ptr !! final Expression countExpr = call.getArguments().get(2); // final Expression isVolatile = call.getArguments.get(3) // LLVM's memcpy has an extra argument @@ -1605,7 +1609,7 @@ private List inlineMemCpy(FunctionCall call) { final int count = countValue.getValueAsInt(); final List replacement = new ArrayList<>(2 * count + 1); - //FIXME without MSA detection, each byte is treated as a 64-bit value. + // FIXME without MSA detection, each byte is treated as a 64-bit value. final IntegerType type = detectMixedSizeAccesses ? types.getIntegerType(8 * count) : archType; final int typeSize = detectMixedSizeAccesses ? count : 1; for (int i = 0; i < count; i += typeSize) { From 252790db8f535fd1401815af36e787b6387993c6 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 13 Dec 2025 09:38:28 +0100 Subject: [PATCH 048/109] fixed null ptr store --- .../dat3m/dartagnan/program/processing/ProcessingManager.java | 2 +- dartagnan/src/test/resources/log4j2.xml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index b3be734ee1..a0aa87a6ee 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = true; + private boolean printAfterProcessing = false; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { diff --git a/dartagnan/src/test/resources/log4j2.xml b/dartagnan/src/test/resources/log4j2.xml index 3660db934e..7f30218ad7 100644 --- a/dartagnan/src/test/resources/log4j2.xml +++ b/dartagnan/src/test/resources/log4j2.xml @@ -16,7 +16,7 @@ - + From fc753ddbf8971075f1ae37ec12481b727188092e Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 14 Dec 2025 21:59:18 +0100 Subject: [PATCH 049/109] small changes --- .../dartagnan/expression/processing/ExprSimplifier.java | 6 +++--- .../parsers/program/visitors/VisitorAsmArm.java | 9 ++++----- .../dartagnan/program/analysis/alias/AliasAnalysis.java | 4 ++-- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 51e605867b..160efd41dd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -352,9 +352,9 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { if(lit.isZero()){return base;} } // can lower the alias analysis precision. -// if (base instanceof NullLiteral) { -// return expressions.makeIntToPtrCast(offset); -// } + if (base instanceof NullLiteral) { + return expressions.makeIntToPtrCast(offset); + } return expressions.makePtrAdd(base, offset); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index 7bd964d715..f896cce686 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -401,12 +401,11 @@ public Object visitValue(AsmArmParser.ValueContext ctx) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); return expressions.makeValue(value, (IntegerType) expectedType); + }else if (expectedType instanceof PointerType){ + String valueString = ctx.Numbers().getText(); + BigInteger value = new BigInteger(valueString); + return expressions.makeIntToPtrCast(expressions.makeValue(value)); } -// else if (expectedType instanceof PointerType){ -// String valueString = ctx.Numbers().getText(); -// BigInteger value = new BigInteger(valueString); -// return expressions.makeIntToPtrCast(expressions.makeValue(value)); -// } throw new RuntimeException("Unexpected type " + expectedType + " visited"); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java index e5f0fa4141..51453e28dd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java @@ -79,7 +79,7 @@ final class Config { @Option(name = ALIAS_GRAPHVIZ, description = "If 'true', stores the results of the alias analysis as a PNG image." + " Defaults to 'false'.") - private boolean graphviz = true; + private boolean graphviz; @Option(name = ALIAS_GRAPHVIZ_SPLIT_BY_THREAD, description = "Controls which event sets are represented by nodes in the graph output." + @@ -99,7 +99,7 @@ final class Config { description = "If 'true' and supported, the graph shows an internal representation." + " Requires '" + ALIAS_GRAPHVIZ + "=true'." + " Defaults to 'false'.", secure = true) - boolean graphvizInternal = true; + boolean graphvizInternal; final boolean detectMixedSizeAccesses; From 30ec75cf4570eea67a3445fe3be2d8459305ec66 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 17 Dec 2025 20:30:34 +0100 Subject: [PATCH 050/109] merged detached branch --- .../dartagnan/expression/processing/ExprSimplifier.java | 9 ++++----- .../parsers/program/visitors/VisitorAsmArm.java | 3 ++- .../parsers/program/visitors/VisitorLitmusC.java | 3 --- .../parsers/program/visitors/VisitorLitmusRISCV.java | 2 +- .../java/com/dat3m/dartagnan/utils/printer/Printer.java | 2 +- 5 files changed, 8 insertions(+), 11 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 160efd41dd..5a0f7edb10 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -351,15 +351,14 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { if (offset instanceof IntLiteral lit) { if(lit.isZero()){return base;} } - // can lower the alias analysis precision. - if (base instanceof NullLiteral) { - return expressions.makeIntToPtrCast(offset); - } + // can cause a tearing problem +// if (base instanceof NullLiteral) { +// return expressions.makeIntToPtrCast(offset); +// } return expressions.makePtrAdd(base, offset); } // TODO: Add simplifications for IntExtract and IntConcat expressions. - // // Simplifies (int(i) -> ptr(i)) -> int(i). @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index f896cce686..a6046d61b2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -401,7 +401,8 @@ public Object visitValue(AsmArmParser.ValueContext ctx) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); return expressions.makeValue(value, (IntegerType) expectedType); - }else if (expectedType instanceof PointerType){ + } + else if (expectedType instanceof PointerType){ String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); return expressions.makeIntToPtrCast(expressions.makeValue(value)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 91b9414c90..822f449a18 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -599,9 +599,6 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ } Expression value = (Expression)ctx.re().accept(this); if(variable instanceof MemoryObject || variable instanceof Register){ - if (!(variable.getType() instanceof PointerType)){ - System.out.println("store to a non ptr (after cast) reg in nre??"); - } Event event = EventFactory.newStoreWithMo(expressions.makeCast(variable, pointerType), value, C11.NONATOMIC); if (isOpenCL) { event.addTags(Tag.OpenCL.DEFAULT_WEAK_SCOPE); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java index efae3f1c4f..edb3d4f19a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java @@ -133,7 +133,7 @@ public Object visitOr(LitmusRISCVParser.OrContext ctx) { @Override public Object visitAdd(LitmusRISCVParser.AddContext ctx) { - // todo problem here is an int reg being retrieved as r1. Should this even be possible?? + // todo the problem here is pointer addition saved to int reg Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), pointerType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java index c18dac55c3..606b1f460f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java @@ -41,7 +41,7 @@ public Printer setMode(Mode mode) { @Option(name = OptionNames.PRINTER_SHOW_INIT_THREADS, description = "Print init threads (default: false)", secure = true) - private boolean showInitThreads = true; + private boolean showInitThreads = false; @Option(name = OptionNames.PRINTER_SHOW_ANNOTATIONS, description = "Print annotation events (default: true)", From 7a552cc8746d05981e7e27c21c57c2bbaf181ec2 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 18 Dec 2025 20:36:59 +0100 Subject: [PATCH 051/109] mem to reg gep fix to accept ptr add --- .../com/dat3m/dartagnan/expression/ExpressionVisitor.java | 4 ++-- .../dartagnan/parsers/program/visitors/VisitorLlvm.java | 2 +- .../com/dat3m/dartagnan/program/processing/MemToReg.java | 6 ++++-- 3 files changed, 7 insertions(+), 5 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 3ee302f731..e38a1ac601 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -63,8 +63,8 @@ public interface ExpressionVisitor { default TRet visitPtrToIntCastExpression(PtrToIntCast expr) { return visitCastExpression(expr); } default TRet visitPtrCmpExpression(PtrCmpExpr expr) { return visitBinaryExpression(expr); } default TRet visitNullLiteral(NullLiteral lit) { return visitLeafExpression(lit); } - default TRet visitPtrConcat(PtrConcat expr){ return visitExpression(expr); }; - default TRet visitPtrExtract(PtrExtract expr){ return visitUnaryExpression(expr); }; + default TRet visitPtrConcat(PtrConcat expr){ return visitExpression(expr); } + default TRet visitPtrExtract(PtrExtract expr){ return visitUnaryExpression(expr); } // =================================== Generic =================================== default TRet visitITEExpression(ITEExpr expr) { return visitExpression(expr); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index f8894e581c..75f0a4a84b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -590,7 +590,7 @@ public Expression visitICmpInst(ICmpInstContext ctx) { case "eq" -> expressions.makeEQ(left, right); case "ne" -> expressions.makeNEQ(left, right); // todo should pointers belong to the same object to be comparable? - // The two arguments must be integer or pointer or integer vector typed. They must also be identical types. + // The two arguments must be integer, pointer ,or integer vector typed. They must also be of identical types. // llvm doc: If the operands are pointer typed, the pointer values are compared as if they were integers. case "slt", "ult" -> expressions.makeLTforced(left, right, operator.startsWith("s")); case "sle", "ule" -> expressions.makeLTEforced(left, right, operator.startsWith("s")); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java index 4703832749..6319fa25a0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.integers.IntBinaryExpr; import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; @@ -428,9 +429,10 @@ private AddressOffset computeAddressOffsetFromState(Expression expression) { private static RegisterOffset matchGEP(Expression expression) { long sum = 0; while (!(expression instanceof Register register)) { - if (!(expression instanceof IntBinaryExpr bin) || + if ( (!(expression instanceof IntBinaryExpr bin) || bin.getKind() != IntBinaryOp.ADD || - !(bin.getRight() instanceof IntLiteral offset)) { + !(bin.getRight() instanceof IntLiteral offset)) || + !(expression.getKind() instanceof PtrAddExpr)) { return null; } sum += offset.getValueAsLong(); From 59d263b66a0b9e4d0a5b5c768342564dc7231cb5 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Fri, 19 Dec 2025 20:32:39 +0100 Subject: [PATCH 052/109] fixed int encoding llvm tests failing --- .../dartagnan/encoding/ExpressionEncoder.java | 2 +- .../expression/pointer/PtrToIntCast.java | 7 ++++--- .../program/processing/MemToReg.java | 2 +- .../processing/NaiveLoopBoundAnnotation.java | 19 +++++++++++++------ .../processing/RemoveDeadNullChecks.java | 19 +++++++++++++++++++ 5 files changed, 38 insertions(+), 11 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 20eef51b63..773118fcb6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -554,7 +554,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final TypedFormula inner = encodePointerExpr(expr.getOperand()); final Formula enc; if (context.useIntegers) { - if (!expr.isExtension()) { + if (expr.isShrinking()) { final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); final IntegerFormulaManager imgr = integerFormulaManager(); enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java index ad0c40558e..99eb42a50d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java @@ -16,12 +16,13 @@ public PtrToIntCast(IntegerType integerType, Expression operand) { } public boolean isExtension() { - return isExtension(getSourceType(), getTargetType()); + return getSourceType().getBitWidth() < getTargetType().getBitWidth(); } - private static boolean isExtension(PointerType sourceType, IntegerType targetType) { - return sourceType.getBitWidth() < targetType.getBitWidth(); + public boolean isShrinking() { + return getSourceType().getBitWidth() > getTargetType().getBitWidth(); } + public boolean sameWidth() { return getSourceType().getBitWidth() == getTargetType().getBitWidth(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java index 6319fa25a0..027eb84576 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java @@ -429,7 +429,7 @@ private AddressOffset computeAddressOffsetFromState(Expression expression) { private static RegisterOffset matchGEP(Expression expression) { long sum = 0; while (!(expression instanceof Register register)) { - if ( (!(expression instanceof IntBinaryExpr bin) || + if ((!(expression instanceof IntBinaryExpr bin) || bin.getKind() != IntBinaryOp.ADD || !(bin.getRight() instanceof IntLiteral offset)) || !(expression.getKind() instanceof PtrAddExpr)) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java index d31e015ead..e82dc71f8a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java @@ -4,6 +4,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.analysis.DominatorAnalysis; @@ -138,15 +139,21 @@ private Event findUniqueIncrement(List events, Register register, } // We found the non-trivial source. Check that this is indeed the desired increment: // (1) It is an addition operation - if (!(source instanceof Local local && local.getExpr() instanceof IntBinaryExpr add && add.getKind() == IntBinaryOp.ADD)) { - return null; + if (source instanceof Local local && local.getExpr() instanceof IntBinaryExpr add && add.getKind() == IntBinaryOp.ADD) { + // (2) The addition is a positive increment of the register. + if (add.getLeft().equals(register) && add.getRight() instanceof IntLiteral c && c.getValue().signum() > 0) { + return local; + } } - // (2) The addition is a positive increment of the register. - if (!(add.getLeft().equals(register) && add.getRight() instanceof IntLiteral c && c.getValue().signum() > 0)) { - return null; + // same as above + if (source instanceof Local local && local.getExpr() instanceof PtrAddExpr add) { + if (add.getBase().equals(register) && add.getOffset() instanceof IntLiteral c && c.getValue().signum() > 0) { + return local; + } } + return null; // TODO: return also the increment - return local; + } private Expression computeLoopBound(List events, Register exitReg, Register counterReg, int counterRegInitVal, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java index 451527c495..04778ca832 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java @@ -5,6 +5,8 @@ import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointer.NullLiteral; +import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.expression.processing.ExprTransformer; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; @@ -154,6 +156,10 @@ public Sign visitIntLiteral(IntLiteral lit) { final int cmpRes = lit.getValue().compareTo(BigInteger.ZERO); return cmpRes > 0 ? Sign.POS : cmpRes == 0 ? Sign.NON_NEG : Sign.UNKNOWN; } + @Override + public Sign visitNullLiteral(NullLiteral lit) { + return Sign.NON_NEG; + } @Override public Sign visitIntBinaryExpression(IntBinaryExpr expr) { @@ -174,6 +180,19 @@ public Sign visitIntBinaryExpression(IntBinaryExpr expr) { return Sign.UNKNOWN; } + @Override + public Sign visitPtrAddExpression(PtrAddExpr expr) { + final Sign leftSign = expr.getBase().accept(this); + final Sign rightSign = expr.getOffset().accept(this); + if (leftSign == Sign.UNKNOWN || rightSign == Sign.UNKNOWN) { + return Sign.UNKNOWN; + } + if (leftSign == Sign.POS || rightSign == Sign.POS) { + return Sign.POS; + } + return Sign.UNKNOWN; + } + @Override public Sign visitITEExpression(ITEExpr expr) { return Sign.meet(expr.getTrueCase().accept(this), expr.getFalseCase().accept(this)); From 239141eb4c8ed157d2f99d4e2e0a09189e2fa7ce Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 20 Dec 2025 20:35:09 +0100 Subject: [PATCH 053/109] fixed one of spirv assertions tests --- .../dartagnan/expression/ExpressionFactory.java | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 1b7aa76ac9..8cc7656cc6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -394,14 +394,16 @@ public Expression makePtrAdd(Expression base, Expression offset) { } public Expression makePtrCast(Expression base, PointerType type){ - if (base.getType() instanceof PointerType ) { - return base; - // pointers of different size than arch should not be cast? Possible in wmm. - } + if (base.getType() instanceof PointerType){ + if (base.getType().equals(type)) { + return base; + // pointers of different size than arch should not be used (store | load). Comparison is still possible in wmm. + }else{ + // we use this because spirv has some weird casts between scoped pointers. + // not the most elegant solution, maybe a dedicated ptr size/type cast? + return makeIntToPtrCast(makePtrToIntCast(base, TypeFactory.getInstance().getIntegerType(type.bitWidth)), type); + }} if (base.getType() instanceof IntegerType) { - //int bw = ((IntegerType) base.getType()).getBitWidth(); - // this causes problems in tearing if the pointer is not of the int size - // return makeIntToPtrCast(makeCast(base, types.getIntegerType(bw)),tearing ? types.getPointerType(bw):types.getPointerType()); return makeIntToPtrCast(base, type); } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); @@ -413,7 +415,6 @@ public Expression makePtrToIntCast(Expression pointer, IntegerType type) { return new PtrToIntCast(type, pointer); } - // it does not make sense to cast to a pointer not of the arch size. private Expression makeIntToPtrCast(Expression integer, PointerType pointerType) { return new IntToPtrCast(pointerType, integer); From d95646f70ea42b44b9a84c6ebbbe004f06b86308 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Tue, 23 Dec 2025 14:40:09 +0100 Subject: [PATCH 054/109] Initial commit for MemoryType support --- .../dartagnan/encoding/TypedFormula.java | 2 +- .../expression/ExpressionFactory.java | 23 ++++++++ .../expression/ExpressionVisitor.java | 10 ++++ .../expression/memory/FromMemoryCast.java | 21 +++++++ .../expression/memory/MemoryConcat.java | 33 +++++++++++ .../expression/memory/MemoryExtract.java | 35 +++++++++++ .../expression/memory/ToMemoryCast.java | 19 ++++++ .../processing/ExprTransformer.java | 24 ++++++++ .../dartagnan/expression/type/MemoryType.java | 59 +++++++++++++++++++ .../expression/type/TypeFactory.java | 15 +++++ 10 files changed, 240 insertions(+), 1 deletion(-) create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/FromMemoryCast.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/ToMemoryCast.java create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/MemoryType.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java index e025ebb549..9ffff167e2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java @@ -35,7 +35,7 @@ type of tuple formula. However, as in point (2), their bitwise representation is TODO: The above examples showcase that IR Types should have a unifying bitwise(?) representation which becomes relevant when communicating over memory. - We can give this representation an IR Type M = AbstractBytes parametric in the bitsize. + We can give this representation an IR Type M = AbstractBitsType parametric in the bitsize. Then this type should satisfy the following properties: - Every standard IR Type T should be convertable to an appropriately-sized M - M should be convertable to other IR types (not necessarily all?) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index f2210f1445..d133753110 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -4,6 +4,10 @@ import com.dat3m.dartagnan.expression.booleans.*; import com.dat3m.dartagnan.expression.floats.*; import com.dat3m.dartagnan.expression.integers.*; +import com.dat3m.dartagnan.expression.memory.FromMemoryCast; +import com.dat3m.dartagnan.expression.memory.MemoryConcat; +import com.dat3m.dartagnan.expression.memory.MemoryExtract; +import com.dat3m.dartagnan.expression.memory.ToMemoryCast; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.*; @@ -337,6 +341,25 @@ public ScopedPointerVariable makeScopedPointerVariable(String id, ScopedPointerT return new ScopedPointerVariable(id, type, memObj); } + // ----------------------------------------------------------------------------------------------------------------- + // Memory + + public Expression makeToMemoryCast(Expression operand) { + return new ToMemoryCast(types.getMemoryTypeFor(operand.getType()), operand); + } + + public Expression makeFromMemoryCast(Expression operand, Type type) { + return new FromMemoryCast(type, operand); + } + + public Expression makeMemoryConcat(List operands) { + return new MemoryConcat(operands); + } + + public Expression makeMemoryExtract(Expression operand, int lowBit, int highBit) { + return new MemoryExtract(operand, lowBit, highBit); + } + // ----------------------------------------------------------------------------------------------------------------- // Misc diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 3396f90063..c16f0d9873 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -9,6 +9,10 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryExpr; import com.dat3m.dartagnan.expression.floats.*; import com.dat3m.dartagnan.expression.integers.*; +import com.dat3m.dartagnan.expression.memory.FromMemoryCast; +import com.dat3m.dartagnan.expression.memory.MemoryConcat; +import com.dat3m.dartagnan.expression.memory.MemoryExtract; +import com.dat3m.dartagnan.expression.memory.ToMemoryCast; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.program.Function; @@ -68,6 +72,12 @@ public interface ExpressionVisitor { default TRet visitFinalMemoryValue(FinalMemoryValue val) { return visitLeafExpression(val); } default TRet visitNonDetValue(NonDetValue nonDet) { return visitLeafExpression(nonDet); } + // =================================== Memory =================================== + default TRet visitToMemoryCastExpression(ToMemoryCast expr) { return visitCastExpression(expr); } + default TRet visitFromMemoryCastExpression(FromMemoryCast expr) { return visitCastExpression(expr); } + default TRet visitMemoryConcatExpression(MemoryConcat expr) { return visitExpression(expr); } + default TRet visitMemoryExtractExpression(MemoryExtract expr) { return visitUnaryExpression(expr); } + private static UnsupportedOperationException unsupported(Expression expr, Class clazz) { final String error = String.format("Expression '%s' is unsupported by %s", diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/FromMemoryCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/FromMemoryCast.java new file mode 100644 index 0000000000..3eec74a64e --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/FromMemoryCast.java @@ -0,0 +1,21 @@ +package com.dat3m.dartagnan.expression.memory; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.base.CastExpressionBase; +import com.dat3m.dartagnan.expression.type.MemoryType; +import com.google.common.base.Preconditions; + +public final class FromMemoryCast extends CastExpressionBase { + + public FromMemoryCast(Type type, Expression operand) { + super(type, operand); + Preconditions.checkArgument(operand.getType() instanceof MemoryType); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitFromMemoryCastExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java new file mode 100644 index 0000000000..243dc2bb94 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java @@ -0,0 +1,33 @@ +package com.dat3m.dartagnan.expression.memory; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.NaryExpressionBase; +import com.dat3m.dartagnan.expression.type.MemoryType; +import com.dat3m.dartagnan.expression.type.TypeFactory; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; +import com.google.common.collect.ImmutableList; + +import java.util.List; + +public class MemoryConcat extends NaryExpressionBase { + + public MemoryConcat(List operands) { + super(getConcatType(operands), ExpressionKind.Other.BV_CONCAT, ImmutableList.copyOf(operands)); + } + + private static MemoryType getConcatType(List operands) { + int size = 0; + for (Expression op : operands) { + ExpressionHelper.checkExpectedType(op, MemoryType.class); + size += ((MemoryType)op.getType()).getBitWidth(); + } + return TypeFactory.getInstance().getMemoryType(size); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitMemoryConcatExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java new file mode 100644 index 0000000000..c0e6581f79 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java @@ -0,0 +1,35 @@ +package com.dat3m.dartagnan.expression.memory; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.UnaryExpressionBase; +import com.dat3m.dartagnan.expression.type.MemoryType; +import com.dat3m.dartagnan.expression.type.TypeFactory; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; +import com.google.common.base.Preconditions; + +public class MemoryExtract extends UnaryExpressionBase { + + private final int lowBit; + private final int highBit; + + public MemoryExtract(Expression operand, int lowBit, int highBit) { + super(TypeFactory.getInstance().getMemoryType(highBit - lowBit + 1), + ExpressionKind.Other.BV_EXTRACT, + operand); + ExpressionHelper.checkExpectedType(operand, MemoryType.class); + int originalWidth = ((MemoryType) operand.getType()).getBitWidth(); + Preconditions.checkArgument(0 <= lowBit && lowBit <= highBit && highBit < originalWidth); + this.lowBit = lowBit; + this.highBit = highBit; + } + + public int getLowBit() { return lowBit; } + public int getHighBit() { return highBit; } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitMemoryExtractExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/ToMemoryCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/ToMemoryCast.java new file mode 100644 index 0000000000..caa93272e2 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/ToMemoryCast.java @@ -0,0 +1,19 @@ +package com.dat3m.dartagnan.expression.memory; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.base.CastExpressionBase; +import com.dat3m.dartagnan.expression.type.MemoryType; + +public final class ToMemoryCast extends CastExpressionBase { + + public ToMemoryCast(MemoryType type, Expression operand) { + super(type, operand); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitToMemoryCastExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index f2213b26c1..a68e043b97 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -14,6 +14,10 @@ import com.dat3m.dartagnan.expression.floats.FloatCmpExpr; import com.dat3m.dartagnan.expression.floats.FloatUnaryExpr; import com.dat3m.dartagnan.expression.integers.*; +import com.dat3m.dartagnan.expression.memory.FromMemoryCast; +import com.dat3m.dartagnan.expression.memory.MemoryConcat; +import com.dat3m.dartagnan.expression.memory.MemoryExtract; +import com.dat3m.dartagnan.expression.memory.ToMemoryCast; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; @@ -127,6 +131,26 @@ public Expression visitGEPExpression(GEPExpr gep) { return expressions.makeGetElementPointer(gep.getIndexingType(), base, offsets); } + @Override + public Expression visitToMemoryCastExpression(ToMemoryCast expr) { + return expressions.makeToMemoryCast(expr.accept(this)); + } + + @Override + public Expression visitFromMemoryCastExpression(FromMemoryCast expr) { + return expressions.makeFromMemoryCast(expr.accept(this), expr.getTargetType()); + } + + @Override + public Expression visitMemoryConcatExpression(MemoryConcat expr) { + return expressions.makeMemoryConcat(expr.getOperands().stream().map(e -> e.accept(this)).toList()); + } + + @Override + public Expression visitMemoryExtractExpression(MemoryExtract expr) { + return expressions.makeMemoryExtract(expr.accept(this), expr.getLowBit(), expr.getHighBit()); + } + @Override public Expression visitLeafExpression(LeafExpression expr) { return expr; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/MemoryType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/MemoryType.java new file mode 100644 index 0000000000..a6771729c8 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/MemoryType.java @@ -0,0 +1,59 @@ +package com.dat3m.dartagnan.expression.type; + +import com.dat3m.dartagnan.expression.Type; +import com.google.common.base.Preconditions; + +/* + This type represents an abstract value in memory, typically understood as a sequence of bits/bytes with + additional metadata. Value instances of this type are referred to as "memory values". + Properties: + - Any other type that can be stored to/loaded from memory should be convertible to a memory type of + appropriate size, i.e., the memory type that has size matching the memory size of the type. + - Conversely, memory values must be convertible back to (at least) the type they originated from without loss of + information: if o is of type T, then "o == toT(toMemory(o))" should hold. + - To guarantee the above lossless round-trip property, for every metadata that some type may track + (e.g., pointer provenance, address space, ...), the memory type must also be able to track it. + - Storing any object "T o" in memory conceptually stores "toMemory(o)" in memory. + Conversely, any load of type T from memory conceptually loads "toT(o)". + Due the lossless round-trip property "o = toT(toMemory(o))", loads froms stores of the same type + guarantee that the load sees exactly the stored value. + - To support mixed-size accesses, MemoryType supports extraction and concatenation operations, + which also have a lossless round-trip property: + extracting single bits/bytes and then sticking them together again in the correct order must produce the original value + including all metadata like pointer provenance. + Concatenating bits from different memory values may or may not produce valid values: + Generally, metadata like provenance will not be retained, however, for metadata-less types like + integers, the concatenation may be reasonable. + */ +public class MemoryType implements Type { + + private final int bitWidth; + + MemoryType(int bitWidth) { + Preconditions.checkArgument(bitWidth > 0, "Size for memory type must be positive: %s", bitWidth); + Preconditions.checkArgument((bitWidth & 7) == 0, "Size must be a multiple of 8: %s", bitWidth); + this.bitWidth = bitWidth; + } + + public int getBitWidth() { + return bitWidth; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) { + return true; + } + return obj instanceof MemoryType other && other.bitWidth == this.bitWidth; + } + + @Override + public int hashCode() { + return 31 * bitWidth + getClass().hashCode(); + } + + @Override + public String toString() { + return "membits" + bitWidth; + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 09404a60c8..bb8633e452 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -49,6 +49,18 @@ public IntegerType getIntegerType(int bitWidth) { return typeNormalizer.normalize(new IntegerType(bitWidth)); } + public MemoryType getMemoryType(int bitWidth) { + checkArgument(bitWidth > 0, "Non-positive bit width %s.", bitWidth); + return typeNormalizer.normalize(new MemoryType(bitWidth)); + } + + public MemoryType getMemoryTypeFor(Type other) { + if (other instanceof MemoryType memType) { + return memType; + } + return getMemoryType(getMemorySizeInBits(other)); + } + public ScopedPointerType getScopedPointerType(String scopeId, Type pointedType, Integer stride) { checkNotNull(scopeId); checkNotNull(pointedType); @@ -156,6 +168,9 @@ private int getMemorySizeInBytes(Type type, boolean padded) { if (type instanceof BooleanType) { return 1; } + if (type instanceof MemoryType memType) { + return IntMath.divide(memType.getBitWidth(), 8, RoundingMode.CEILING); + } if (type instanceof IntegerType integerType) { return IntMath.divide(integerType.getBitWidth(), 8, RoundingMode.CEILING); } From a151d99f14b16e5bd21352822a9ec9eb849d64bb Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Tue, 23 Dec 2025 15:33:28 +0100 Subject: [PATCH 055/109] Basic encoding of assignments over memory (WIP) --- .../dartagnan/encoding/ExpressionEncoder.java | 111 ++++++++++++++++-- .../expression/ExpressionPrinter.java | 24 ++++ .../expression/memory/MemoryExtract.java | 7 ++ 3 files changed, 133 insertions(+), 9 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index f406fad9df..352585dfd3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -10,6 +10,10 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryExpr; import com.dat3m.dartagnan.expression.booleans.BoolUnaryOp; import com.dat3m.dartagnan.expression.integers.*; +import com.dat3m.dartagnan.expression.memory.FromMemoryCast; +import com.dat3m.dartagnan.expression.memory.MemoryConcat; +import com.dat3m.dartagnan.expression.memory.MemoryExtract; +import com.dat3m.dartagnan.expression.memory.ToMemoryCast; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; @@ -74,13 +78,13 @@ private BitvectorFormulaManager bitvectorFormulaManager() { @SuppressWarnings("unchecked") public TypedFormula encodeBooleanAt(Expression expression, Event at) { - Preconditions.checkArgument(expression.getType() instanceof BooleanType); + checkArgument(expression.getType() instanceof BooleanType); return (TypedFormula) encodeAt(expression, at); } @SuppressWarnings("unchecked") public TypedFormula encodeBooleanFinal(Expression expression) { - Preconditions.checkArgument(expression.getType() instanceof BooleanType); + checkArgument(expression.getType() instanceof BooleanType); return (TypedFormula) encodeFinal(expression); } @@ -99,7 +103,7 @@ public TypedFormula encodeBooleanFinal(Expression e } variable = fmgr.getTupleFormulaManager().makeTuple(fields); } else if (type instanceof ArrayType arrType) { - Preconditions.checkArgument(arrType.hasKnownNumElements(), "Cannot encode array of unknown size."); + checkArgument(arrType.hasKnownNumElements(), "Cannot encode array of unknown size."); final List elements = new ArrayList<>(arrType.getNumElements()); for (int i = 0; i < arrType.getNumElements(); i++) { elements.add(makeVariable(name + "[" + i + "]", arrType.getElementType()).formula()); @@ -131,14 +135,21 @@ public enum ConversionMode { } public BooleanFormula equal(Expression left, Expression right, ConversionMode cMode) { - final ExpressionFactory exprs = context.getExpressionFactory(); + /*final ExpressionFactory exprs = context.getExpressionFactory(); switch (cMode) { case NO -> {} case LEFT_TO_RIGHT -> left = exprs.makeCast(left, right.getType()); case RIGHT_TO_LEFT -> right = exprs.makeCast(right, left.getType()); } - return encodeBooleanFinal(exprs.makeEQ(left, right)).formula(); + return encodeBooleanFinal(exprs.makeEQ(left, right)).formula();*/ + + return switch (cMode) { + case NO -> assignEqual(left, right, true); + case LEFT_TO_RIGHT -> assignEqual(right, left, false); + case RIGHT_TO_LEFT -> assignEqual(left, right, false); + }; + } public BooleanFormula equal(Expression left, Expression right) { @@ -153,6 +164,41 @@ public BooleanFormula equalAt(Expression left, Event leftAt, Expression right, E return equal(encodeAt(left, leftAt), encodeAt(right, rightAt)); } + // Encodes "left := right" with a possible round-trip over memory (if strict==false) + public BooleanFormula assignEqual(Expression left, Expression right, boolean strict) { + final ExpressionFactory exprs = context.getExpressionFactory(); + + if (strict) { + assert left.getType().equals(right.getType()); + return encodeBooleanFinal(exprs.makeEQ(left, right)).formula(); + } + + final int leftSize = types.getMemorySizeInBits(left.getType()); + final int rightSize = types.getMemorySizeInBits(right.getType()); + + Expression rhsMem = exprs.makeToMemoryCast(right); + + if (leftSize < rightSize) { + rhsMem = exprs.makeMemoryExtract(rhsMem, 0, leftSize - 1); + rhsMem = exprs.makeFromMemoryCast(rhsMem, left.getType()); + } else if (leftSize == rightSize) { + rhsMem = exprs.makeFromMemoryCast(rhsMem, left.getType()); + } else { + assert (leftSize > rightSize); + rhsMem = exprs.makeFromMemoryCast(rhsMem, getCompatibleTypeOfMemorySize(left.getType(), rightSize)); + rhsMem = exprs.makeCast(rhsMem, left.getType()); + } + return encodeBooleanFinal(exprs.makeEQ(left, rhsMem)).formula(); + } + + private Type getCompatibleTypeOfMemorySize(Type type, int memSizeInBits) { + if (type instanceof IntegerType) { + return types.getIntegerType(memSizeInBits); + } + + throw new UnsupportedOperationException(String.format("Type %s has no compatible type of size %s", type, memSizeInBits)); + } + // ==================================================================================== // Private implementation @@ -171,7 +217,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodeIntegerExpr(Expression expression) { - Preconditions.checkArgument(expression.getType() instanceof IntegerType); + checkArgument(expression.getType() instanceof IntegerType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof IntegerFormula || typedFormula.formula() instanceof BitvectorFormula; @@ -180,7 +226,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodeBooleanExpr(Expression expression) { - Preconditions.checkArgument(expression.getType() instanceof BooleanType); + checkArgument(expression.getType() instanceof BooleanType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof BooleanFormula; @@ -189,7 +235,7 @@ public TypedFormula encodeBooleanExpr(Expression ex @SuppressWarnings("unchecked") public TypedFormula encodeAggregateExpr(Expression expression) { - Preconditions.checkArgument(ExpressionHelper.isAggregateLike(expression)); + checkArgument(ExpressionHelper.isAggregateLike(expression)); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof TupleFormula; @@ -472,7 +518,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitIntConcat(IntConcat expr) { - Preconditions.checkArgument(!expr.getOperands().isEmpty()); + checkArgument(!expr.getOperands().isEmpty()); final List> operands = expr.getOperands().stream() .map(this::encodeIntegerExpr) .toList(); @@ -552,6 +598,53 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { return new TypedFormula<>(insert.getType(), insertForm); } + // ==================================================================================== + // Memory type + + @Override + public TypedFormula visitToMemoryCastExpression(ToMemoryCast expr) { + final TypedFormula inner = encode(expr.getOperand()); + final MemoryType targetType = types.getMemoryTypeFor(expr.getSourceType()); + + // TODO: Do actual conversions + return new TypedFormula(targetType, inner.formula()); + } + + @Override + public TypedFormula visitFromMemoryCastExpression(FromMemoryCast expr) { + final TypedFormula inner = (TypedFormula) encode(expr.getOperand()); + final Type targetType = expr.getTargetType(); + + // TODO: Do actual conversions + return new TypedFormula(targetType, inner.formula()); + } + + @Override + public TypedFormula visitMemoryConcatExpression(MemoryConcat expr) { + return ExpressionVisitor.super.visitMemoryConcatExpression(expr); + } + + @Override + public TypedFormula visitMemoryExtractExpression(MemoryExtract expr) { + // TODO: We just do normal int extraction for now + + final Formula operand = encode(expr.getOperand()).formula(); + final Formula enc; + if (context.useIntegers) { + final IntegerFormulaManager imgr = integerFormulaManager(); + final IntegerFormula highBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getHighBit() + 1)); + final IntegerFormula lowBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getLowBit())); + final IntegerFormula op = (IntegerFormula) operand; + final IntegerFormula extracted = expr.isExtractingHighBits() ? op : imgr.modulo(op, highBitValue); + enc = expr.isExtractingLowBits() ? extracted : imgr.divide(extracted, lowBitValue); + } else { + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + enc = bvmgr.extract((BitvectorFormula) operand, expr.getHighBit(), expr.getLowBit()); + } + return new TypedFormula<>(expr.getType(), enc); + } + + // ==================================================================================== // Misc diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java index ad586d43ee..299460dae2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java @@ -8,6 +8,10 @@ import com.dat3m.dartagnan.expression.floats.FloatSizeCast; import com.dat3m.dartagnan.expression.floats.IntToFloatCast; import com.dat3m.dartagnan.expression.integers.*; +import com.dat3m.dartagnan.expression.memory.FromMemoryCast; +import com.dat3m.dartagnan.expression.memory.MemoryConcat; +import com.dat3m.dartagnan.expression.memory.MemoryExtract; +import com.dat3m.dartagnan.expression.memory.ToMemoryCast; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.program.Register; @@ -124,6 +128,26 @@ public String visitGEPExpression(GEPExpr expr) { return expr.getOperands().stream().map(this::visit).collect(Collectors.joining(", ", "GEP(", ")")); } + @Override + public String visitToMemoryCastExpression(ToMemoryCast expr) { + return String.format("toMem(%s)", visit(expr.getOperand())); + } + + @Override + public String visitFromMemoryCastExpression(FromMemoryCast expr) { + return String.format("fromMem(%s) to %s", visit(expr.getOperand()), expr.getTargetType()); + } + + @Override + public String visitMemoryConcatExpression(MemoryConcat expr) { + return ExpressionVisitor.super.visitMemoryConcatExpression(expr); + } + + @Override + public String visitMemoryExtractExpression(MemoryExtract expr) { + return ExpressionVisitor.super.visitMemoryExtractExpression(expr); + } + @Override public String visitITEExpression(ITEExpr expr) { return visit(expr.getCondition()) + " ? " + visit(expr.getTrueCase()) + " : " + visit(expr.getFalseCase()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java index c0e6581f79..a5dd159dd5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java @@ -25,6 +25,13 @@ public MemoryExtract(Expression operand, int lowBit, int highBit) { this.highBit = highBit; } + public boolean isExtractingLowBits() { + return lowBit == 0; + } + public boolean isExtractingHighBits() { + return operand.getType() instanceof MemoryType t && highBit + 1 == t.getBitWidth(); + } + public int getLowBit() { return lowBit; } public int getHighBit() { return highBit; } From f6707a755b3af681f3fbdb014f214465c5af6794 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Sun, 28 Dec 2025 18:52:19 +0100 Subject: [PATCH 056/109] - Added assignEqual methods to model assignments with possible conversions. - Reworked encodings to use the new assignEqual if the intention is to encode assignments. - Tearing now uses the new MemoryType to split/concat objects --- .../dartagnan/encoding/EncodingContext.java | 15 +- .../dartagnan/encoding/ExpressionEncoder.java | 128 +++++++++--------- .../dartagnan/encoding/ProgramEncoder.java | 20 +-- .../dartagnan/encoding/PropertyEncoder.java | 10 +- .../dat3m/dartagnan/encoding/WmmEncoder.java | 5 +- .../expression/ExpressionFactory.java | 49 ++++++- .../expression/ExpressionPrinter.java | 18 +-- .../expression/ExpressionVisitor.java | 6 +- .../expression/memory/MemoryConcat.java | 4 +- .../expression/memory/MemoryEqualExpr.java | 22 +++ .../expression/memory/MemoryExtract.java | 4 +- .../expression/processing/ExprSimplifier.java | 26 ++++ .../processing/ExprTransformer.java | 16 ++- .../expression/type/TypeFactory.java | 8 ++ .../dartagnan/program/event/core/Alloc.java | 2 +- .../program/event/core/ExecutionStatus.java | 4 +- .../dartagnan/program/event/core/Local.java | 2 +- .../program/memory/MemoryObject.java | 3 +- .../dartagnan/program/processing/Tearing.java | 23 ++-- 19 files changed, 230 insertions(+), 135 deletions(-) create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryEqualExpr.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java index 211eedfb7d..553cf735fb 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java @@ -24,17 +24,14 @@ import org.sosy_lab.common.configuration.InvalidConfigurationException; import org.sosy_lab.common.configuration.Option; import org.sosy_lab.common.configuration.Options; -import org.sosy_lab.java_smt.api.BooleanFormula; -import org.sosy_lab.java_smt.api.BooleanFormulaManager; -import org.sosy_lab.java_smt.api.FormulaManager; +import org.sosy_lab.java_smt.api.*; import org.sosy_lab.java_smt.api.NumeralFormula.IntegerFormula; -import org.sosy_lab.java_smt.api.ProverEnvironment; -import org.sosy_lab.java_smt.api.SolverException; import java.util.HashMap; import java.util.Map; import static com.dat3m.dartagnan.configuration.OptionNames.*; +import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.MEMORY_ROUND_TRIP_RELAXED; import static com.dat3m.dartagnan.program.event.Tag.INIT; import static com.dat3m.dartagnan.program.event.Tag.WRITE; import static com.google.common.base.Preconditions.checkArgument; @@ -189,12 +186,12 @@ public BooleanFormula sameResult(RegWriter first, RegWriter second) { return exprEncoder.equal(result(first), result(second)); } - public BooleanFormula sameValue(MemoryCoreEvent first, MemoryCoreEvent second, ExpressionEncoder.ConversionMode cmode) { - return exprEncoder.equal(value(first), value(second), cmode); + public BooleanFormula sameValue(MemoryCoreEvent first, MemoryCoreEvent second) { + return exprEncoder.equal(value(first), value(second)); } - public BooleanFormula sameValue(MemoryCoreEvent first, MemoryCoreEvent second) { - return sameValue(first, second, ExpressionEncoder.ConversionMode.NO); + public BooleanFormula assignValue(MemoryCoreEvent left, MemoryCoreEvent right) { + return exprEncoder.assignEqual(value(left), value(right), MEMORY_ROUND_TRIP_RELAXED); } public TypedFormula address(MemoryCoreEvent event) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 352585dfd3..937d1cd2be 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -10,10 +10,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryExpr; import com.dat3m.dartagnan.expression.booleans.BoolUnaryOp; import com.dat3m.dartagnan.expression.integers.*; -import com.dat3m.dartagnan.expression.memory.FromMemoryCast; -import com.dat3m.dartagnan.expression.memory.MemoryConcat; -import com.dat3m.dartagnan.expression.memory.MemoryExtract; -import com.dat3m.dartagnan.expression.memory.ToMemoryCast; +import com.dat3m.dartagnan.expression.memory.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; @@ -96,6 +93,9 @@ public TypedFormula encodeBooleanFinal(Expression e variable = context.useIntegers ? integerFormulaManager().makeVariable(name) : bitvectorFormulaManager().makeVariable(integerType.getBitWidth(), name); + } else if (type instanceof MemoryType memoryType) { + assert !context.useIntegers; + variable = bitvectorFormulaManager().makeVariable(memoryType.getBitWidth(), name); } else if (type instanceof AggregateType aggType) { final List fields = new ArrayList<>(aggType.getFields().size()); for (TypeOffset field : aggType.getFields()) { @@ -123,82 +123,55 @@ public TypedFormula wrap(BooleanFormula formula) { // ==================================================================================== // Utility - // TODO: For conversion operations, we might want to have an universal intermediate type T with the following properties: - // (1) every other type has a lossless conversion to T - // (2) T can be converted to every other type (possibly with loss) - // (3) A round-trip through T is always lossless. - // See comments on TypedFormula class for more details. - public enum ConversionMode { - NO, - LEFT_TO_RIGHT, - RIGHT_TO_LEFT, - } - - public BooleanFormula equal(Expression left, Expression right, ConversionMode cMode) { - /*final ExpressionFactory exprs = context.getExpressionFactory(); - switch (cMode) { - case NO -> {} - case LEFT_TO_RIGHT -> left = exprs.makeCast(left, right.getType()); - case RIGHT_TO_LEFT -> right = exprs.makeCast(right, left.getType()); - } - - return encodeBooleanFinal(exprs.makeEQ(left, right)).formula();*/ - - return switch (cMode) { - case NO -> assignEqual(left, right, true); - case LEFT_TO_RIGHT -> assignEqual(right, left, false); - case RIGHT_TO_LEFT -> assignEqual(left, right, false); - }; - - } - public BooleanFormula equal(Expression left, Expression right) { - return equal(left, right, ConversionMode.NO); - } - - public BooleanFormula equalAt(Expression left, Event leftAt, Expression right, Event rightAt, ConversionMode cMode) { - return equal(encodeAt(left, leftAt), encodeAt(right, rightAt), cMode); + checkArgument(left.getType().equals(right.getType())); + return encodeBooleanFinal(context.getExpressionFactory().makeEQ(left, right)).formula(); } public BooleanFormula equalAt(Expression left, Event leftAt, Expression right, Event rightAt) { return equal(encodeAt(left, leftAt), encodeAt(right, rightAt)); } - // Encodes "left := right" with a possible round-trip over memory (if strict==false) - public BooleanFormula assignEqual(Expression left, Expression right, boolean strict) { + public enum ConversionMode { + STRICT, // No conversion, types must match exactly + CAST, // Immediate cast + MEMORY_ROUND_TRIP_STRICT, // Round-trip over memory but source/target type sizes must match + MEMORY_ROUND_TRIP_RELAXED, // Round-trip over memory, source/target can have mismatching sizes + } + + // Encodes assignment equality "left := right" with a possible conversion applied to the rhs. + public BooleanFormula assignEqual(Expression left, Expression right, ConversionMode conversion) { final ExpressionFactory exprs = context.getExpressionFactory(); - if (strict) { - assert left.getType().equals(right.getType()); - return encodeBooleanFinal(exprs.makeEQ(left, right)).formula(); - } + final Expression value = switch (conversion) { + case STRICT -> { + checkArgument(left.getType().equals(right.getType())); + yield right; + } + case CAST -> { + yield exprs.makeCast(right, left.getType()); + } + case MEMORY_ROUND_TRIP_STRICT, MEMORY_ROUND_TRIP_RELAXED -> { + final boolean signed = true; + final boolean strict = conversion == ConversionMode.MEMORY_ROUND_TRIP_STRICT; + yield exprs.makeCastOverMemory(right, left.getType(), strict, signed); + } + }; - final int leftSize = types.getMemorySizeInBits(left.getType()); - final int rightSize = types.getMemorySizeInBits(right.getType()); + return equal(left, value); + } - Expression rhsMem = exprs.makeToMemoryCast(right); - if (leftSize < rightSize) { - rhsMem = exprs.makeMemoryExtract(rhsMem, 0, leftSize - 1); - rhsMem = exprs.makeFromMemoryCast(rhsMem, left.getType()); - } else if (leftSize == rightSize) { - rhsMem = exprs.makeFromMemoryCast(rhsMem, left.getType()); - } else { - assert (leftSize > rightSize); - rhsMem = exprs.makeFromMemoryCast(rhsMem, getCompatibleTypeOfMemorySize(left.getType(), rightSize)); - rhsMem = exprs.makeCast(rhsMem, left.getType()); - } - return encodeBooleanFinal(exprs.makeEQ(left, rhsMem)).formula(); + public BooleanFormula assignEqual(Expression left, Expression right) { + return assignEqual(left, right, ConversionMode.STRICT); } - private Type getCompatibleTypeOfMemorySize(Type type, int memSizeInBits) { - if (type instanceof IntegerType) { - return types.getIntegerType(memSizeInBits); - } - - throw new UnsupportedOperationException(String.format("Type %s has no compatible type of size %s", type, memSizeInBits)); + public BooleanFormula assignEqualAt(Expression left, Event leftAt, Expression right, Event rightAt) { + return assignEqual(encodeAt(left, leftAt), encodeAt(right, rightAt)); } + + // ==================================================================================== // Private implementation @@ -224,6 +197,15 @@ public void setEvent(Event e) { return (TypedFormula) typedFormula; } + @SuppressWarnings("unchecked") + public TypedFormula encodeMemoryExpr(Expression expression) { + checkArgument(expression.getType() instanceof MemoryType); + final TypedFormula typedFormula = encode(expression); + assert typedFormula.getType() == expression.getType(); + assert typedFormula.formula() instanceof BitvectorFormula; + return (TypedFormula) typedFormula; + } + @SuppressWarnings("unchecked") public TypedFormula encodeBooleanExpr(Expression expression) { checkArgument(expression.getType() instanceof BooleanType); @@ -621,7 +603,16 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { @Override public TypedFormula visitMemoryConcatExpression(MemoryConcat expr) { - return ExpressionVisitor.super.visitMemoryConcatExpression(expr); + checkArgument(!expr.getOperands().isEmpty()); + final List> operands = expr.getOperands().stream() + .map(this::encodeMemoryExpr) + .toList(); + Formula enc = operands.get(0).formula(); + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + for (TypedFormula op : operands.subList(1, operands.size())) { + enc = bvmgr.concat((BitvectorFormula) op.formula(), (BitvectorFormula) enc); + } + return new TypedFormula<>(expr.getType(), enc); } @Override @@ -644,6 +635,13 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { return new TypedFormula<>(expr.getType(), enc); } + @Override + public TypedFormula visitMemoryEqualExpression(MemoryEqualExpr expr) { + final Formula left = expr.getLeft().accept(this).formula(); + final Formula right = expr.getRight().accept(this).formula(); + + return new TypedFormula<>(types.getBooleanType(), fmgr.equal(left, right)); + } // ==================================================================================== // Misc diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java index 33a882c3a0..1f8f166001 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java @@ -447,21 +447,21 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { alignment = cur.hasKnownAlignment() ? cur.alignment() : exprs.makeITE(exec, cur.alignment(), one); } - final BiFunction equate = (a, b) -> { + final BiFunction assign = (a, b) -> { final Event alloc = cur.getAllocationSite(); return cur.isStaticallyAllocated() - ? exprEnc.equal(a, b) - : exprEnc.equalAt(a, alloc, b, alloc); + ? exprEnc.assignEqual(a, b) + : exprEnc.assignEqualAt(a, alloc, b, alloc); }; // Encode size - enc.add(equate.apply(sizeVar, size)); + enc.add(assign.apply(sizeVar, size)); // Encode address (we even give non-allocated objects a proper, well-aligned address) final MemoryObject prev = i > 0 ? memoryObjects.get(i - 1) : null; if (prev == null) { // First object is placed at alignment - enc.add(equate.apply(addrVar, alignment)); + enc.add(assign.apply(addrVar, alignment)); } else { final Expression nextAvailableAddr = exprs.makeAdd(context.address(prev), context.size(prev)); final Expression nextAlignedAddr = exprs.makeAdd(nextAvailableAddr, @@ -469,7 +469,7 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { ); // ... other objects are placed at the next well-aligned address that is available. - enc.add(equate.apply(addrVar, nextAlignedAddr)); + enc.add(assign.apply(addrVar, nextAlignedAddr)); } } @@ -514,7 +514,7 @@ public BooleanFormula encodeDependencies() { edge = context.dependency(writer, reader); enc.add(bmgr.equivalence(edge, bmgr.and(context.execution(writer), context.controlFlow(reader), bmgr.not(bmgr.or(overwrite))))); } - BooleanFormula equalValue = exprEncoder.equalAt(register, reader, context.result(writer), writer); + BooleanFormula equalValue = exprEncoder.assignEqualAt(register, reader, context.result(writer), writer); enc.add(bmgr.implication(edge, equalValue)); overwrite.add(context.execution(writer)); } @@ -522,7 +522,7 @@ public BooleanFormula encodeDependencies() { if(initializeRegisters && !reg.mustBeInitialized()) { final Expression zero = exprs.makeGeneralZero(register.getType()); overwrite.add(bmgr.not(context.controlFlow(reader))); - overwrite.add(exprEncoder.equalAt(register, reader, zero, reader)); + overwrite.add(exprEncoder.assignEqualAt(register, reader, zero, reader)); enc.add(bmgr.or(overwrite)); } } @@ -555,7 +555,7 @@ public BooleanFormula encodeFinalRegisterValues() { final List writers = registerWriters.getMayWriters(); if (initializeRegisters && !registerWriters.mustBeInitialized()) { List clause = new ArrayList<>(); - clause.add(exprEncoder.equal(register, exprs.makeGeneralZero(register.getType()))); + clause.add(exprEncoder.assignEqual(register, exprs.makeGeneralZero(register.getType()))); for (Event w : writers) { clause.add(context.execution(w)); } @@ -564,7 +564,7 @@ public BooleanFormula encodeFinalRegisterValues() { for (int i = 0; i < writers.size(); i++) { final RegWriter writer = writers.get(i); List clause = new ArrayList<>(); - clause.add(exprEncoder.equal(register, context.result(writer))); + clause.add(exprEncoder.assignEqual(register, context.result(writer))); clause.add(bmgr.not(context.execution(writer))); for (Event w : writers.subList(i + 1, writers.size())) { if (!exec.areMutuallyExclusive(writer, w)) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index bee7460ae5..6a228079bf 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -33,7 +33,7 @@ import java.util.stream.Collectors; import static com.dat3m.dartagnan.configuration.Property.*; -import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.RIGHT_TO_LEFT; +import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.MEMORY_ROUND_TRIP_RELAXED; import static com.dat3m.dartagnan.program.Program.SourceLanguage.LLVM; import static com.dat3m.dartagnan.program.Program.SpecificationType.ASSERT; import static com.dat3m.dartagnan.wmm.RelationNameRepository.CO; @@ -209,10 +209,10 @@ private BooleanFormula encodeLastCoConstraints() { continue; } BooleanFormula sameAddress = context.sameAddress(init, w1); - final BooleanFormula sameValue = exprEncoder.equal( + final BooleanFormula sameValue = exprEncoder.assignEqual( new FinalMemoryValue(null, init.getValue().getType(), init.getBase(), init.getOffset()), context.value(w1), - RIGHT_TO_LEFT + MEMORY_ROUND_TRIP_RELAXED ); enc.add(bmgr.implication(bmgr.and(lastCoExpr, sameAddress), sameValue)); } @@ -234,11 +234,11 @@ private BooleanFormula encodeLastCoConstraints() { } BooleanFormula isLast = context.lastCoVar(w); BooleanFormula sameAddr = context.sameAddress(init, w); - BooleanFormula sameValue = exprEncoder.equal(finalValue, context.value(w), RIGHT_TO_LEFT); + BooleanFormula sameValue = exprEncoder.assignEqual(finalValue, context.value(w), MEMORY_ROUND_TRIP_RELAXED); readLastStore = bmgr.or(readLastStore, bmgr.and(isLast, sameAddr, sameValue)); lastStoreExistsEnc = bmgr.or(lastStoreExistsEnc, bmgr.and(isLast, sameAddr)); } - BooleanFormula readInitValue = exprEncoder.equal(finalValue, context.value(init), RIGHT_TO_LEFT); + BooleanFormula readInitValue = exprEncoder.assignEqual(finalValue, context.value(init), MEMORY_ROUND_TRIP_RELAXED); enc.add(bmgr.ifThenElse(lastStoreExistsEnc, readLastStore, readInitValue)); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/WmmEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/WmmEncoder.java index 028426166a..33c3fe4dc3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/WmmEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/WmmEncoder.java @@ -40,7 +40,6 @@ import java.util.stream.Collectors; import static com.dat3m.dartagnan.configuration.OptionNames.*; -import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.LEFT_TO_RIGHT; import static com.dat3m.dartagnan.program.event.Tag.*; import static com.google.common.base.Verify.verify; @@ -636,7 +635,7 @@ public Void visitReadFrom(ReadFrom rfDef) { final BooleanFormula rfEdge = edge.encode(w, r); final BooleanFormula sameAddress = context.sameAddress(w, r); - final BooleanFormula sameValue = context.sameValue(w, r, LEFT_TO_RIGHT); + final BooleanFormula sameValue = context.assignValue(r, w); enc.add(bmgr.implication(rfEdge, bmgr.and(execution(w, r), sameAddress, sameValue))); read2RfEdges.computeIfAbsent(r, key -> new ArrayList<>()).add(rfEdge); @@ -647,7 +646,7 @@ public Void visitReadFrom(ReadFrom rfDef) { final BooleanFormula uninit = getUninitReadVar(r); if (memoryIsZeroed) { final Expression zero = context.getExpressionFactory().makeGeneralZero(r.getAccessType()); - enc.add(bmgr.implication(uninit, exprEncoder.equal(context.value(r), zero))); + enc.add(bmgr.implication(uninit, exprEncoder.assignEqual(context.value(r), zero))); } final List rfChoices = Lists.newArrayList(Iterables.concat( diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index d133753110..a1df7b7bee 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -4,10 +4,7 @@ import com.dat3m.dartagnan.expression.booleans.*; import com.dat3m.dartagnan.expression.floats.*; import com.dat3m.dartagnan.expression.integers.*; -import com.dat3m.dartagnan.expression.memory.FromMemoryCast; -import com.dat3m.dartagnan.expression.memory.MemoryConcat; -import com.dat3m.dartagnan.expression.memory.MemoryExtract; -import com.dat3m.dartagnan.expression.memory.ToMemoryCast; +import com.dat3m.dartagnan.expression.memory.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.*; @@ -345,10 +342,16 @@ public ScopedPointerVariable makeScopedPointerVariable(String id, ScopedPointerT // Memory public Expression makeToMemoryCast(Expression operand) { + if (operand.getType() instanceof MemoryType) { + return operand; + } return new ToMemoryCast(types.getMemoryTypeFor(operand.getType()), operand); } public Expression makeFromMemoryCast(Expression operand, Type type) { + if (operand.getType().equals(type)) { + return operand; + } return new FromMemoryCast(type, operand); } @@ -361,7 +364,39 @@ public Expression makeMemoryExtract(Expression operand, int lowBit, int highBit) } // ----------------------------------------------------------------------------------------------------------------- - // Misc + + // Cast via a round-trip through memory: "fromMem(toMem()) to ". + // If is false, the memory sizes of the source type and the target type may mismatch: + // "source type < target type": after the memory cast, a zero-extension is performed (if possible) + // "source type > target type": only the lowest bits of are used for the conversion. + public Expression makeCastOverMemory(Expression expr, Type targetType, boolean strict, boolean signed) { + final Type sourceType = expr.getType(); + if (sourceType.equals(targetType)) { + return expr; + } + + final int targetSize = types.getMemorySizeInBits(targetType); + final int sourceSize = types.getMemorySizeInBits(sourceType); + + if (strict && (targetSize != sourceSize)) { + final String error = String.format("Strict memory cast from %s to %s not possible: " + + "mismatching memory sizes.", sourceType, targetType); + throw new IllegalArgumentException(error); + } + + Expression exprMem = makeToMemoryCast(expr); + if (targetSize < sourceSize) { + exprMem = makeMemoryExtract(exprMem, 0, targetSize - 1); + exprMem = makeFromMemoryCast(exprMem, targetType); + } else if (targetSize == sourceSize) { + exprMem = makeFromMemoryCast(exprMem, targetType); + } else { + assert (targetSize > sourceSize); + exprMem = makeFromMemoryCast(exprMem, types.getCompatibleTypeOfMemorySize(targetType, sourceSize)); + exprMem = makeCast(exprMem, targetType, signed); + } + return exprMem; + } public Expression makeGeneralZero(Type type) { if (type instanceof ArrayType arrayType) { @@ -383,6 +418,8 @@ public Expression makeGeneralZero(Type type) { return makeFalse(); } else if (type instanceof FloatType floatType) { return makeZero(floatType); + } else if (type instanceof MemoryType memoryType) { + return makeToMemoryCast(makeZero(TypeFactory.getInstance().getIntegerType(memoryType.getBitWidth()))); } else { throw new UnsupportedOperationException("Cannot create zero of type " + type); } @@ -420,6 +457,8 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { } else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? return makeFloatCmp(leftOperand, FloatCmpOp.OEQ, rightOperand); + } else if (type instanceof MemoryType) { + return new MemoryEqualExpr(booleanType, leftOperand, rightOperand); } else if (ExpressionHelper.isAggregateLike(type)) { return makeAggregateCmp(leftOperand, AggregateCmpOp.EQ, rightOperand); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java index 299460dae2..b7c12d18a6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java @@ -8,10 +8,7 @@ import com.dat3m.dartagnan.expression.floats.FloatSizeCast; import com.dat3m.dartagnan.expression.floats.IntToFloatCast; import com.dat3m.dartagnan.expression.integers.*; -import com.dat3m.dartagnan.expression.memory.FromMemoryCast; -import com.dat3m.dartagnan.expression.memory.MemoryConcat; -import com.dat3m.dartagnan.expression.memory.MemoryExtract; -import com.dat3m.dartagnan.expression.memory.ToMemoryCast; +import com.dat3m.dartagnan.expression.memory.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.program.Register; @@ -130,22 +127,22 @@ public String visitGEPExpression(GEPExpr expr) { @Override public String visitToMemoryCastExpression(ToMemoryCast expr) { - return String.format("toMem(%s)", visit(expr.getOperand())); + return String.format("%s to %s", visit(expr.getOperand()), expr.getTargetType()); } @Override public String visitFromMemoryCastExpression(FromMemoryCast expr) { - return String.format("fromMem(%s) to %s", visit(expr.getOperand()), expr.getTargetType()); + return String.format("%s to %s", visit(expr.getOperand()), expr.getTargetType()); } @Override public String visitMemoryConcatExpression(MemoryConcat expr) { - return ExpressionVisitor.super.visitMemoryConcatExpression(expr); + return Lists.reverse(expr.getOperands()).stream().map(this::visit).collect(Collectors.joining("::")); } @Override public String visitMemoryExtractExpression(MemoryExtract expr) { - return ExpressionVisitor.super.visitMemoryExtractExpression(expr); + return String.format("%s[%d..%d]", expr.getOperand().accept(this), expr.getLowBit(), expr.getHighBit()); } @Override @@ -153,6 +150,11 @@ public String visitITEExpression(ITEExpr expr) { return visit(expr.getCondition()) + " ? " + visit(expr.getTrueCase()) + " : " + visit(expr.getFalseCase()); } + @Override + public String visitMemoryEqualExpression(MemoryEqualExpr expr) { + return String.format("%s == %s", expr.getLeft().accept(this), expr.getRight().accept(this)); + } + @Override public String visitRegister(Register reg) { return printRegistersWithFunctionId ? reg.getFunction().getId() + ":" + reg.getName() : reg.toString(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index c16f0d9873..5992a92aad 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -9,10 +9,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryExpr; import com.dat3m.dartagnan.expression.floats.*; import com.dat3m.dartagnan.expression.integers.*; -import com.dat3m.dartagnan.expression.memory.FromMemoryCast; -import com.dat3m.dartagnan.expression.memory.MemoryConcat; -import com.dat3m.dartagnan.expression.memory.MemoryExtract; -import com.dat3m.dartagnan.expression.memory.ToMemoryCast; +import com.dat3m.dartagnan.expression.memory.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.program.Function; @@ -77,6 +74,7 @@ public interface ExpressionVisitor { default TRet visitFromMemoryCastExpression(FromMemoryCast expr) { return visitCastExpression(expr); } default TRet visitMemoryConcatExpression(MemoryConcat expr) { return visitExpression(expr); } default TRet visitMemoryExtractExpression(MemoryExtract expr) { return visitUnaryExpression(expr); } + default TRet visitMemoryEqualExpression(MemoryEqualExpr expr) { return visitBinaryExpression(expr); } private static UnsupportedOperationException unsupported(Expression expr, Class clazz) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java index 243dc2bb94..a65a3db8f1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java @@ -11,10 +11,10 @@ import java.util.List; -public class MemoryConcat extends NaryExpressionBase { +public class MemoryConcat extends NaryExpressionBase { public MemoryConcat(List operands) { - super(getConcatType(operands), ExpressionKind.Other.BV_CONCAT, ImmutableList.copyOf(operands)); + super(getConcatType(operands), () -> "MEM_CONCAT", ImmutableList.copyOf(operands)); } private static MemoryType getConcatType(List operands) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryEqualExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryEqualExpr.java new file mode 100644 index 0000000000..f9d623e234 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryEqualExpr.java @@ -0,0 +1,22 @@ +package com.dat3m.dartagnan.expression.memory; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionKind; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.BinaryExpressionBase; +import com.dat3m.dartagnan.expression.type.BooleanType; +import com.dat3m.dartagnan.expression.type.MemoryType; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; + +public class MemoryEqualExpr extends BinaryExpressionBase { + + public MemoryEqualExpr(BooleanType type, Expression left, Expression right) { + super(type, () -> "EQ", left, right); + ExpressionHelper.checkSameExpectedType(left, right, MemoryType.class); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitMemoryEqualExpression(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java index a5dd159dd5..846e7e784a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java @@ -9,14 +9,14 @@ import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.google.common.base.Preconditions; -public class MemoryExtract extends UnaryExpressionBase { +public class MemoryExtract extends UnaryExpressionBase { private final int lowBit; private final int highBit; public MemoryExtract(Expression operand, int lowBit, int highBit) { super(TypeFactory.getInstance().getMemoryType(highBit - lowBit + 1), - ExpressionKind.Other.BV_EXTRACT, + () -> "MEM_EXTRACT", operand); ExpressionHelper.checkExpectedType(operand, MemoryType.class); int originalWidth = ((MemoryType) operand.getType()).getBitWidth(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index c50058a9d6..72f7fde1ed 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -10,6 +10,9 @@ import com.dat3m.dartagnan.expression.aggregates.ExtractExpr; import com.dat3m.dartagnan.expression.booleans.*; import com.dat3m.dartagnan.expression.integers.*; +import com.dat3m.dartagnan.expression.memory.FromMemoryCast; +import com.dat3m.dartagnan.expression.memory.MemoryEqualExpr; +import com.dat3m.dartagnan.expression.memory.ToMemoryCast; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.utils.IntegerHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; @@ -56,6 +59,16 @@ private Expression tryGeneralRewrite(BinaryExpression expression) { return hoistedIte; } + @Override + public Expression visitMemoryEqualExpression(MemoryEqualExpr expr) { + final Expression rewrite = tryGeneralRewrite(expr); + if (rewrite != null) { + return rewrite; + } + + return super.visitMemoryEqualExpression(expr); + } + @Override public Expression visitBoolBinaryExpression(BoolBinaryExpr expr) { final Expression rewrite = tryGeneralRewrite(expr); @@ -376,6 +389,19 @@ public Expression visitAggregateCmpExpression(AggregateCmpExpr expr) { return expressions.makeAggregateCmp(left, expr.getKind(), right); } + // =================================== Memory type =================================== + + @Override + public Expression visitFromMemoryCastExpression(FromMemoryCast cast) { + final Expression inner = cast.getOperand().accept(this); + if (inner instanceof ToMemoryCast toMemoryCast && toMemoryCast.getSourceType().equals(cast.getTargetType())) { + return inner; + } + + return expressions.makeFromMemoryCast(inner, cast.getTargetType()); + } + + // =================================== Helper methods =================================== // An expression is potentially eliminable if it either carries no dependencies diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index a68e043b97..efa54d0cfc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -14,10 +14,7 @@ import com.dat3m.dartagnan.expression.floats.FloatCmpExpr; import com.dat3m.dartagnan.expression.floats.FloatUnaryExpr; import com.dat3m.dartagnan.expression.integers.*; -import com.dat3m.dartagnan.expression.memory.FromMemoryCast; -import com.dat3m.dartagnan.expression.memory.MemoryConcat; -import com.dat3m.dartagnan.expression.memory.MemoryExtract; -import com.dat3m.dartagnan.expression.memory.ToMemoryCast; +import com.dat3m.dartagnan.expression.memory.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; @@ -92,6 +89,11 @@ public Expression visitITEExpression(ITEExpr expr) { expr.getFalseCase().accept(this)); } + @Override + public Expression visitMemoryEqualExpression(MemoryEqualExpr expr) { + return expressions.makeEQ(expr.getLeft().accept(this), expr.getRight().accept(this)); + } + @Override public Expression visitConstructExpression(ConstructExpr construct) { final var arguments = new ArrayList(); @@ -133,12 +135,12 @@ public Expression visitGEPExpression(GEPExpr gep) { @Override public Expression visitToMemoryCastExpression(ToMemoryCast expr) { - return expressions.makeToMemoryCast(expr.accept(this)); + return expressions.makeToMemoryCast(expr.getOperand().accept(this)); } @Override public Expression visitFromMemoryCastExpression(FromMemoryCast expr) { - return expressions.makeFromMemoryCast(expr.accept(this), expr.getTargetType()); + return expressions.makeFromMemoryCast(expr.getOperand().accept(this), expr.getTargetType()); } @Override @@ -148,7 +150,7 @@ public Expression visitMemoryConcatExpression(MemoryConcat expr) { @Override public Expression visitMemoryExtractExpression(MemoryExtract expr) { - return expressions.makeMemoryExtract(expr.accept(this), expr.getLowBit(), expr.getHighBit()); + return expressions.makeMemoryExtract(expr.getOperand().accept(this), expr.getLowBit(), expr.getHighBit()); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index bb8633e452..1b4c2b6f35 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -160,6 +160,14 @@ public IntegerType getByteType() { return getIntegerType(8); } + public Type getCompatibleTypeOfMemorySize(Type type, int memSizeInBits) { + if (type instanceof IntegerType) { + return getIntegerType(memSizeInBits); + } + + throw new UnsupportedOperationException(String.format("Type %s has no compatible type of size %s", type, memSizeInBits)); + } + public int getMemorySizeInBytes(Type type) { return getMemorySizeInBytes(type, true); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java index cd15dff390..8720395d28 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java @@ -133,7 +133,7 @@ public T accept(EventVisitor visitor) { public BooleanFormula encodeExec(EncodingContext ctx) { return ctx.getBooleanFormulaManager().and( super.encodeExec(ctx), - ctx.getExpressionEncoder().equalAt(ctx.result(this), this, getAllocatedObject(), this) + ctx.getExpressionEncoder().assignEqualAt(ctx.result(this), this, getAllocatedObject(), this) ); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java index cf1de94589..a805562407 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java @@ -11,7 +11,7 @@ import java.util.Map; import java.util.Set; -import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.RIGHT_TO_LEFT; +import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.CAST; public class ExecutionStatus extends AbstractEvent implements RegWriter, EventUser { @@ -71,7 +71,7 @@ public BooleanFormula encodeExec(EncodingContext context) { final Expression notExec = exprEncoder.wrap(bmgr.not(context.execution(event))); return bmgr.and( super.encodeExec(context), - context.getExpressionEncoder().equal(context.result(this), notExec, RIGHT_TO_LEFT) + context.getExpressionEncoder().assignEqual(context.result(this), notExec, CAST) ); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Local.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Local.java index 30df6848ef..3a76a30420 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Local.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Local.java @@ -63,7 +63,7 @@ public String defaultString() { public BooleanFormula encodeExec(EncodingContext ctx) { return ctx.getBooleanFormulaManager().and( super.encodeExec(ctx), - ctx.getExpressionEncoder().equalAt(ctx.result(this), this, expr, this) + ctx.getExpressionEncoder().assignEqualAt(ctx.result(this), this, expr, this) ); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java index fbc330b0e7..3a589bcbed 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java @@ -111,7 +111,8 @@ public void setInitialValue(int offset, Expression value) { setInitialValue(offset + innerOffset, structElements.get(i)); } } else if (value.getType() instanceof IntegerType - || value.getType() instanceof BooleanType) { + || value.getType() instanceof BooleanType + || value.getType() instanceof MemoryType) { checkArgument(isInRange(offset), "array index out of bounds"); initialValues.put(offset, value); } else { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index 31d190f021..62e32b8218 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -19,7 +19,6 @@ import com.dat3m.dartagnan.program.event.EventFactory; import com.dat3m.dartagnan.program.event.Tag; import com.dat3m.dartagnan.program.event.core.*; -import com.dat3m.dartagnan.program.event.core.InstructionBoundary; import com.dat3m.dartagnan.program.event.metadata.SourceLocation; import com.dat3m.dartagnan.program.memory.FinalMemoryValue; import com.dat3m.dartagnan.program.memory.MemoryObject; @@ -129,18 +128,19 @@ private int tearInits(Program program, AliasAnalysis alias, boolean bigEndian) { final int bytes = checkBytes(init, offsets); final MemoryObject base = init.getBase(); final int initOffset = init.getOffset(); - final Expression value = init.getValue(); + final Expression value = expressions.makeToMemoryCast(init.getValue()); // Tear initial values final int frontBegin = bigEndian ? bytes - offsets.get(0) : 0; final int frontEnd = bigEndian ? bytes : offsets.get(0); - final Expression frontValue = expressions.makeIntExtract(value, 8 * frontBegin, 8 * frontEnd - 1); + + final Expression frontValue = expressions.makeMemoryExtract(value, 8 * frontBegin, 8 * frontEnd - 1); base.setInitialValue(initOffset, frontValue); for (int i = 0; i < offsets.size(); i++) { final int offset = offsets.get(i); final int next = i + 1 < offsets.size() ? offsets.get(i + 1) : bytes; final int begin = bigEndian ? bytes - next : offset; final int end = bigEndian ? bytes - offset : next; - final Expression tearedValue = expressions.makeIntExtract(value, 8 * begin, 8 * end - 1); + final Expression tearedValue = expressions.makeMemoryExtract(value, 8 * begin, 8 * end - 1); base.setInitialValue(initOffset + offset, tearedValue); } // Tear init event @@ -183,7 +183,8 @@ private List createTransaction(Load load, List offsets) { int start = i < 0 ? 0 : offsets.get(i); int end = i + 1 < offsets.size() ? offsets.get(i + 1) : bytes; assert start < end; - smallerRegisters.add(newRegister(function, types.getIntegerType(8 * (end - start)))); + smallerRegisters.add(newRegister(function, + types.getMemoryType(8 * (end - start)))); } assert bytes == smallerRegisters.stream().mapToInt(t -> types.getMemorySizeInBytes(t.getType())).sum(); final InstructionBoundary begin = load.hasTag(Tag.NO_INSTRUCTION) ? null : EventFactory.newInstructionBegin(); @@ -205,8 +206,8 @@ private List createTransaction(Load load, List offsets) { final Event end = EventFactory.newInstructionEnd(begin); replacement.add(end); } - final Expression combination = expressions.makeIntConcat(smallerRegisters); - final Event computeResult = EventFactory.newLocal(load.getResultRegister(), combination); + final Expression combination = expressions.makeMemoryConcat(smallerRegisters); + final Event computeResult = EventFactory.newLocal(load.getResultRegister(), expressions.makeFromMemoryCast(combination, load.getAccessType())); replacement.add(computeResult); return replacement; } @@ -226,13 +227,15 @@ private List createTransaction(Store store, List offsets, Map Date: Sun, 28 Dec 2025 21:09:36 +0100 Subject: [PATCH 057/109] Fix memory cast to types whose size is not a multiple of 8. --- .../java/com/dat3m/dartagnan/expression/ExpressionFactory.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index a1df7b7bee..1d1f4a2612 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -387,7 +387,8 @@ public Expression makeCastOverMemory(Expression expr, Type targetType, boolean s Expression exprMem = makeToMemoryCast(expr); if (targetSize < sourceSize) { exprMem = makeMemoryExtract(exprMem, 0, targetSize - 1); - exprMem = makeFromMemoryCast(exprMem, targetType); + exprMem = makeFromMemoryCast(exprMem, types.getCompatibleTypeOfMemorySize(targetType, targetSize)); + exprMem = makeCast(exprMem, targetType, signed); } else if (targetSize == sourceSize) { exprMem = makeFromMemoryCast(exprMem, targetType); } else { From 959cca766171aa934bac6983420291b23f023183 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Sun, 28 Dec 2025 21:16:57 +0100 Subject: [PATCH 058/109] Minor refactor --- .../dartagnan/encoding/ExpressionEncoder.java | 22 +++++++------------ 1 file changed, 8 insertions(+), 14 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 937d1cd2be..a19efa88fa 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -594,7 +594,7 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { @Override public TypedFormula visitFromMemoryCastExpression(FromMemoryCast expr) { - final TypedFormula inner = (TypedFormula) encode(expr.getOperand()); + final TypedFormula inner = encodeMemoryExpr(expr.getOperand()); final Type targetType = expr.getTargetType(); // TODO: Do actual conversions @@ -604,6 +604,9 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { @Override public TypedFormula visitMemoryConcatExpression(MemoryConcat expr) { checkArgument(!expr.getOperands().isEmpty()); + Preconditions.checkState(!context.useIntegers); + + // TODO: We just do normal bitvector concatenation for now final List> operands = expr.getOperands().stream() .map(this::encodeMemoryExpr) .toList(); @@ -617,21 +620,12 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { @Override public TypedFormula visitMemoryExtractExpression(MemoryExtract expr) { - // TODO: We just do normal int extraction for now + Preconditions.checkState(!context.useIntegers); + // TODO: We just do normal bitvector extraction for now final Formula operand = encode(expr.getOperand()).formula(); - final Formula enc; - if (context.useIntegers) { - final IntegerFormulaManager imgr = integerFormulaManager(); - final IntegerFormula highBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getHighBit() + 1)); - final IntegerFormula lowBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getLowBit())); - final IntegerFormula op = (IntegerFormula) operand; - final IntegerFormula extracted = expr.isExtractingHighBits() ? op : imgr.modulo(op, highBitValue); - enc = expr.isExtractingLowBits() ? extracted : imgr.divide(extracted, lowBitValue); - } else { - final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); - enc = bvmgr.extract((BitvectorFormula) operand, expr.getHighBit(), expr.getLowBit()); - } + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + final Formula enc = bvmgr.extract((BitvectorFormula) operand, expr.getHighBit(), expr.getLowBit()); return new TypedFormula<>(expr.getType(), enc); } From c1543de69383234b044f6bf2f55ffa2afd997cf1 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Sun, 28 Dec 2025 23:26:01 +0100 Subject: [PATCH 059/109] Add back integer encoding for MemoryExtract --- .../dartagnan/encoding/ExpressionEncoder.java | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index a19efa88fa..dbdda82a29 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -202,7 +202,7 @@ public void setEvent(Event e) { checkArgument(expression.getType() instanceof MemoryType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); - assert typedFormula.formula() instanceof BitvectorFormula; + assert typedFormula.formula() instanceof IntegerFormula || typedFormula.formula() instanceof BitvectorFormula; return (TypedFormula) typedFormula; } @@ -620,12 +620,21 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { @Override public TypedFormula visitMemoryExtractExpression(MemoryExtract expr) { - Preconditions.checkState(!context.useIntegers); - // TODO: We just do normal bitvector extraction for now - final Formula operand = encode(expr.getOperand()).formula(); - final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); - final Formula enc = bvmgr.extract((BitvectorFormula) operand, expr.getHighBit(), expr.getLowBit()); + // NOTE: We need to support mathematical integers for some unit tests, which is a bit awkward + final Formula operand = encodeMemoryExpr(expr.getOperand()).formula(); + final Formula enc; + if (context.useIntegers) { + final IntegerFormulaManager imgr = integerFormulaManager(); + final IntegerFormula highBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getHighBit() + 1)); + final IntegerFormula lowBitValue = imgr.makeNumber(BigInteger.TWO.pow(expr.getLowBit())); + final IntegerFormula op = (IntegerFormula) operand; + final IntegerFormula extracted = expr.isExtractingHighBits() ? op : imgr.modulo(op, highBitValue); + enc = expr.isExtractingLowBits() ? extracted : imgr.divide(extracted, lowBitValue); + } else { + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + enc = bvmgr.extract((BitvectorFormula) operand, expr.getHighBit(), expr.getLowBit()); + } return new TypedFormula<>(expr.getType(), enc); } From 131a4842ee510159701f480f9f16c0195191c698 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Mon, 29 Dec 2025 18:14:49 +0100 Subject: [PATCH 060/109] Minor refactor Bug fix in ExprSimplifier for fromMem(toMem(x)) casts --- .../expression/ExpressionFactory.java | 5 ++++- .../expression/ExpressionPrinter.java | 10 ++++----- .../expression/processing/ExprSimplifier.java | 22 +++++++++---------- .../processing/ExprTransformer.java | 10 ++++----- 4 files changed, 25 insertions(+), 22 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 1d1f4a2612..87048c39db 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.memory.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.processing.ExprSimplifier; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; @@ -27,6 +28,7 @@ public final class ExpressionFactory { private static final ExpressionFactory instance = new ExpressionFactory(); private final TypeFactory types = TypeFactory.getInstance(); + private final ExprSimplifier simplifier = new ExprSimplifier(false); private final BooleanType booleanType = types.getBooleanType(); private final BoolLiteral falseConstant = new BoolLiteral(booleanType, false); private final BoolLiteral trueConstant = new BoolLiteral(booleanType, true); @@ -396,7 +398,8 @@ public Expression makeCastOverMemory(Expression expr, Type targetType, boolean s exprMem = makeFromMemoryCast(exprMem, types.getCompatibleTypeOfMemorySize(targetType, sourceSize)); exprMem = makeCast(exprMem, targetType, signed); } - return exprMem; + + return exprMem.accept(simplifier); } public Expression makeGeneralZero(Type type) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java index b7c12d18a6..3e42b79177 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java @@ -142,17 +142,17 @@ public String visitMemoryConcatExpression(MemoryConcat expr) { @Override public String visitMemoryExtractExpression(MemoryExtract expr) { - return String.format("%s[%d..%d]", expr.getOperand().accept(this), expr.getLowBit(), expr.getHighBit()); + return String.format("%s[%d..%d]", visit(expr.getOperand()), expr.getLowBit(), expr.getHighBit()); } @Override - public String visitITEExpression(ITEExpr expr) { - return visit(expr.getCondition()) + " ? " + visit(expr.getTrueCase()) + " : " + visit(expr.getFalseCase()); + public String visitMemoryEqualExpression(MemoryEqualExpr expr) { + return String.format("%s == %s", visit(expr.getLeft()), visit(expr.getRight())); } @Override - public String visitMemoryEqualExpression(MemoryEqualExpr expr) { - return String.format("%s == %s", expr.getLeft().accept(this), expr.getRight().accept(this)); + public String visitITEExpression(ITEExpr expr) { + return visit(expr.getCondition()) + " ? " + visit(expr.getTrueCase()) + " : " + visit(expr.getFalseCase()); } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 72f7fde1ed..3544262619 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -59,16 +59,6 @@ private Expression tryGeneralRewrite(BinaryExpression expression) { return hoistedIte; } - @Override - public Expression visitMemoryEqualExpression(MemoryEqualExpr expr) { - final Expression rewrite = tryGeneralRewrite(expr); - if (rewrite != null) { - return rewrite; - } - - return super.visitMemoryEqualExpression(expr); - } - @Override public Expression visitBoolBinaryExpression(BoolBinaryExpr expr) { final Expression rewrite = tryGeneralRewrite(expr); @@ -391,11 +381,21 @@ public Expression visitAggregateCmpExpression(AggregateCmpExpr expr) { // =================================== Memory type =================================== + @Override + public Expression visitMemoryEqualExpression(MemoryEqualExpr expr) { + final Expression rewrite = tryGeneralRewrite(expr); + if (rewrite != null) { + return rewrite; + } + + return super.visitMemoryEqualExpression(expr); + } + @Override public Expression visitFromMemoryCastExpression(FromMemoryCast cast) { final Expression inner = cast.getOperand().accept(this); if (inner instanceof ToMemoryCast toMemoryCast && toMemoryCast.getSourceType().equals(cast.getTargetType())) { - return inner; + return toMemoryCast.getOperand(); } return expressions.makeFromMemoryCast(inner, cast.getTargetType()); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index efa54d0cfc..b02afcd9d9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -89,11 +89,6 @@ public Expression visitITEExpression(ITEExpr expr) { expr.getFalseCase().accept(this)); } - @Override - public Expression visitMemoryEqualExpression(MemoryEqualExpr expr) { - return expressions.makeEQ(expr.getLeft().accept(this), expr.getRight().accept(this)); - } - @Override public Expression visitConstructExpression(ConstructExpr construct) { final var arguments = new ArrayList(); @@ -153,6 +148,11 @@ public Expression visitMemoryExtractExpression(MemoryExtract expr) { return expressions.makeMemoryExtract(expr.getOperand().accept(this), expr.getLowBit(), expr.getHighBit()); } + @Override + public Expression visitMemoryEqualExpression(MemoryEqualExpr expr) { + return expressions.makeEQ(expr.getLeft().accept(this), expr.getRight().accept(this)); + } + @Override public Expression visitLeafExpression(LeafExpression expr) { return expr; From 39d4c17253fddf4b45ce01d3acb8d8a2269c92f3 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Mon, 29 Dec 2025 19:09:52 +0100 Subject: [PATCH 061/109] Fix buggy initialization of cyclic static dependencies. --- .../dartagnan/expression/ExpressionFactory.java | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 87048c39db..76c581d67c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -25,10 +25,19 @@ public final class ExpressionFactory { - private static final ExpressionFactory instance = new ExpressionFactory(); + private static final ExpressionFactory instance; + private static final ExprSimplifier simplifier; + + static { + // This is a bit awkward, but ExpressionFactory and ExprTransformer/Simplifier have + // cyclic dependencies, and so we need to ensure a specific initialization order. + // Maybe we should not use ExpressionSimplifier in this class or avoid ExpressionSimplifier + // caching a static instance of ExpressionFactory. + instance = new ExpressionFactory(); + simplifier = new ExprSimplifier(false); + } private final TypeFactory types = TypeFactory.getInstance(); - private final ExprSimplifier simplifier = new ExprSimplifier(false); private final BooleanType booleanType = types.getBooleanType(); private final BoolLiteral falseConstant = new BoolLiteral(booleanType, false); private final BoolLiteral trueConstant = new BoolLiteral(booleanType, true); From e7b59642c3c39a261d96eebcdcf62b94b012fd5e Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Sun, 4 Jan 2026 17:39:57 +0100 Subject: [PATCH 062/109] Cleanup --- .../dartagnan/encoding/ExpressionEncoder.java | 25 +++++++++---------- .../expression/ExpressionFactory.java | 2 +- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index dbdda82a29..f2cc32a3b7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -29,7 +29,6 @@ import java.util.ArrayList; import java.util.List; -import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.base.Preconditions.checkState; import static java.util.Arrays.asList; @@ -75,13 +74,13 @@ private BitvectorFormulaManager bitvectorFormulaManager() { @SuppressWarnings("unchecked") public TypedFormula encodeBooleanAt(Expression expression, Event at) { - checkArgument(expression.getType() instanceof BooleanType); + Preconditions.checkArgument(expression.getType() instanceof BooleanType); return (TypedFormula) encodeAt(expression, at); } @SuppressWarnings("unchecked") public TypedFormula encodeBooleanFinal(Expression expression) { - checkArgument(expression.getType() instanceof BooleanType); + Preconditions.checkArgument(expression.getType() instanceof BooleanType); return (TypedFormula) encodeFinal(expression); } @@ -103,7 +102,7 @@ public TypedFormula encodeBooleanFinal(Expression e } variable = fmgr.getTupleFormulaManager().makeTuple(fields); } else if (type instanceof ArrayType arrType) { - checkArgument(arrType.hasKnownNumElements(), "Cannot encode array of unknown size."); + Preconditions.checkArgument(arrType.hasKnownNumElements(), "Cannot encode array of unknown size."); final List elements = new ArrayList<>(arrType.getNumElements()); for (int i = 0; i < arrType.getNumElements(); i++) { elements.add(makeVariable(name + "[" + i + "]", arrType.getElementType()).formula()); @@ -124,7 +123,7 @@ public TypedFormula wrap(BooleanFormula formula) { // Utility public BooleanFormula equal(Expression left, Expression right) { - checkArgument(left.getType().equals(right.getType())); + Preconditions.checkArgument(left.getType().equals(right.getType())); return encodeBooleanFinal(context.getExpressionFactory().makeEQ(left, right)).formula(); } @@ -145,7 +144,7 @@ public BooleanFormula assignEqual(Expression left, Expression right, ConversionM final Expression value = switch (conversion) { case STRICT -> { - checkArgument(left.getType().equals(right.getType())); + Preconditions.checkArgument(left.getType().equals(right.getType())); yield right; } case CAST -> { @@ -190,7 +189,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodeIntegerExpr(Expression expression) { - checkArgument(expression.getType() instanceof IntegerType); + Preconditions.checkArgument(expression.getType() instanceof IntegerType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof IntegerFormula || typedFormula.formula() instanceof BitvectorFormula; @@ -199,7 +198,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodeMemoryExpr(Expression expression) { - checkArgument(expression.getType() instanceof MemoryType); + Preconditions.checkArgument(expression.getType() instanceof MemoryType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof IntegerFormula || typedFormula.formula() instanceof BitvectorFormula; @@ -208,7 +207,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodeBooleanExpr(Expression expression) { - checkArgument(expression.getType() instanceof BooleanType); + Preconditions.checkArgument(expression.getType() instanceof BooleanType); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof BooleanFormula; @@ -217,7 +216,7 @@ public TypedFormula encodeBooleanExpr(Expression ex @SuppressWarnings("unchecked") public TypedFormula encodeAggregateExpr(Expression expression) { - checkArgument(ExpressionHelper.isAggregateLike(expression)); + Preconditions.checkArgument(ExpressionHelper.isAggregateLike(expression)); final TypedFormula typedFormula = encode(expression); assert typedFormula.getType() == expression.getType(); assert typedFormula.formula() instanceof TupleFormula; @@ -500,7 +499,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitIntConcat(IntConcat expr) { - checkArgument(!expr.getOperands().isEmpty()); + Preconditions.checkArgument(!expr.getOperands().isEmpty()); final List> operands = expr.getOperands().stream() .map(this::encodeIntegerExpr) .toList(); @@ -603,7 +602,7 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { @Override public TypedFormula visitMemoryConcatExpression(MemoryConcat expr) { - checkArgument(!expr.getOperands().isEmpty()); + Preconditions.checkArgument(!expr.getOperands().isEmpty()); Preconditions.checkState(!context.useIntegers); // TODO: We just do normal bitvector concatenation for now @@ -684,7 +683,7 @@ public TypedFormula visitMemoryEqualExpression(Memo checkState(event == null, "Cannot evaluate final memory value of %s at event %s.", val, event); final MemoryObject base = val.getMemoryObject(); final int offset = val.getOffset(); - checkArgument(base.isInRange(offset), "Array index out of bounds"); + Preconditions.checkArgument(base.isInRange(offset), "Array index out of bounds"); final String name = String.format("last_val_at_%s_%d", base, offset); return makeVariable(name, val.getType()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 76c581d67c..abaf26756b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -432,7 +432,7 @@ public Expression makeGeneralZero(Type type) { } else if (type instanceof FloatType floatType) { return makeZero(floatType); } else if (type instanceof MemoryType memoryType) { - return makeToMemoryCast(makeZero(TypeFactory.getInstance().getIntegerType(memoryType.getBitWidth()))); + return makeToMemoryCast(makeZero(types.getIntegerType(memoryType.getBitWidth()))); } else { throw new UnsupportedOperationException("Cannot create zero of type " + type); } From b63ef328b6a46ffffda7cfb1f5611c1fcbc6e6d3 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 24 Jan 2026 15:16:59 +0100 Subject: [PATCH 063/109] All non broken Litmus tests pass. --- .../analysis/alias/VirtualAliasAnalysis.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java index ad8a31d8da..e05ef7bf07 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java @@ -1,5 +1,6 @@ package com.dat3m.dartagnan.program.analysis.alias; +import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.program.event.core.MemoryCoreEvent; import com.dat3m.dartagnan.program.memory.VirtualMemoryObject; @@ -37,10 +38,22 @@ public List mayMixedSizeAccesses(MemoryCoreEvent event) { // Checking address1 and address2 hold the same physical address private boolean samePhysicalAddress(MemoryCoreEvent e1, MemoryCoreEvent e2) { // TODO: Add support for pointers - if (!(e1.getAddress() instanceof VirtualMemoryObject addr1) - || !(e2.getAddress() instanceof VirtualMemoryObject addr2)) { - return false; - } - return addr1.getPhysicalAddress() == addr2.getPhysicalAddress(); + // FIXME: Ugly code because somewhere a (virtual address + 0) is being generated. + VirtualMemoryObject v1; + VirtualMemoryObject v2; + + if (e1.getAddress() instanceof VirtualMemoryObject addr){ + v1 = addr; + }else if(e1.getAddress() instanceof PtrAddExpr addr){ + v1 =(VirtualMemoryObject) addr.getBase(); + }else{return false;} + + if (e2.getAddress() instanceof VirtualMemoryObject addr){ + v2 = addr; + }else if(e2.getAddress() instanceof PtrAddExpr addr){ + v2 =(VirtualMemoryObject) addr.getBase(); + }else{return false;} + + return v1.getPhysicalAddress() == v2.getPhysicalAddress(); } } \ No newline at end of file From 86bcf0826ff027ef63bc1c04235eee40a47f7805 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 24 Jan 2026 17:23:57 +0100 Subject: [PATCH 064/109] Fixed memory + 0 and constant ptr mocking --- .../expression/ExpressionFactory.java | 2 +- .../analysis/alias/VirtualAliasAnalysis.java | 23 +++++-------------- .../dartagnan/program/event/EventFactory.java | 3 ++- .../spirv/mocks/MockProgramBuilder.java | 4 ++++ 4 files changed, 13 insertions(+), 19 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 8cc7656cc6..a3311d4d45 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -416,7 +416,7 @@ public Expression makePtrToIntCast(Expression pointer, IntegerType type) { } - private Expression makeIntToPtrCast(Expression integer, PointerType pointerType) { + public Expression makeIntToPtrCast(Expression integer, PointerType pointerType) { return new IntToPtrCast(pointerType, integer); } public Expression makeIntToPtrCast(Expression operand) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java index e05ef7bf07..76dd2d6c63 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java @@ -1,5 +1,6 @@ package com.dat3m.dartagnan.program.analysis.alias; +import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.program.event.core.MemoryCoreEvent; import com.dat3m.dartagnan.program.memory.VirtualMemoryObject; @@ -38,22 +39,10 @@ public List mayMixedSizeAccesses(MemoryCoreEvent event) { // Checking address1 and address2 hold the same physical address private boolean samePhysicalAddress(MemoryCoreEvent e1, MemoryCoreEvent e2) { // TODO: Add support for pointers - // FIXME: Ugly code because somewhere a (virtual address + 0) is being generated. - VirtualMemoryObject v1; - VirtualMemoryObject v2; - - if (e1.getAddress() instanceof VirtualMemoryObject addr){ - v1 = addr; - }else if(e1.getAddress() instanceof PtrAddExpr addr){ - v1 =(VirtualMemoryObject) addr.getBase(); - }else{return false;} - - if (e2.getAddress() instanceof VirtualMemoryObject addr){ - v2 = addr; - }else if(e2.getAddress() instanceof PtrAddExpr addr){ - v2 =(VirtualMemoryObject) addr.getBase(); - }else{return false;} - - return v1.getPhysicalAddress() == v2.getPhysicalAddress(); + if (!(e1.getAddress() instanceof VirtualMemoryObject addr1) + || !(e2.getAddress() instanceof VirtualMemoryObject addr2)) { + return false; + } + return addr1.getPhysicalAddress() == addr2.getPhysicalAddress(); } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java index 39ae7507bb..8d5eda35a1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java @@ -165,7 +165,8 @@ public static NamedBarrier newNamedBarrier(String name, String instanceId, Strin public static Init newInit(MemoryObject base, int offset) { //TODO: We simplify here because virtual aliasing currently fails when pointer arithmetic is involved // meaning that and are treated differently. - final Expression address = expressions.makePtrAdd(base, expressions.makeValue(offset, types.getArchType())); + final Expression address = offset == 0 ? base : + expressions.makePtrAdd(base, expressions.makeValue(offset, types.getArchType())); final Init init = new Init(base, offset, address); init.addTags(base.getFeatureTags()); return init; diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/mocks/MockProgramBuilder.java b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/mocks/MockProgramBuilder.java index 5261757872..f53b64012a 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/mocks/MockProgramBuilder.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/mocks/MockProgramBuilder.java @@ -17,6 +17,7 @@ import com.dat3m.dartagnan.program.memory.MemoryObject; import com.dat3m.dartagnan.program.memory.ScopedPointerVariable; +import java.math.BigInteger; import java.util.*; import java.util.stream.Collectors; @@ -89,6 +90,9 @@ public Expression mockConstant(String id, String typeId, Object value) { } else if (type instanceof IntegerType iType) { IntLiteral iValue = exprFactory.makeValue((int) value, iType); return addExpression(id, iValue); + }else if (type instanceof PointerType pType) { + IntLiteral pValue = exprFactory.makeValue(BigInteger.valueOf((int)value), pType.getBitWidth()); + return addExpression(id, exprFactory.makeIntToPtrCast(pValue,pType)); } else if (type instanceof ArrayType aType) { List elements = mockConstantArrayElements(aType.getElementType(), value); Expression construction = exprFactory.makeArray(aType, elements); From 6f91cb0a23329b07d27fd1a56521ed4999d05928 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 25 Jan 2026 15:23:38 +0100 Subject: [PATCH 065/109] Corrected asm riscv ptr type and extended llvm misc test by 4 sec --- .../dartagnan/parsers/program/visitors/VisitorAsmRISCV.java | 3 +-- .../test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java index a1aef2021c..7dbbc01389 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java @@ -333,8 +333,7 @@ public Object visitValue(AsmRISCVParser.ValueContext ctx) { else if (expectedType instanceof PointerType){ String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - // return expressions.makeIntToPtrCast(expressions.makeValue(value)); // fixme works as int when expected type is pointer ?!? - return expressions.makeValue(value); + return expressions.makeValue(value, ((PointerType) expectedType).getBitWidth()); } throw new RuntimeException("Unexpected type " + expectedType + " visited"); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java index 263d1d3c43..05c4897f6b 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java @@ -42,7 +42,7 @@ protected Provider getBoundProvider() { @Override protected long getTimeout() { - return 10000; + return 14000; } @Override From 6c5795e1feb5a1970b7ff37500b20c85d0a6c604 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 25 Jan 2026 15:55:47 +0100 Subject: [PATCH 066/109] . --- .../test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java index 89acf1ed6e..7b8f5f16b8 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/MiscellaneousTest.java @@ -42,7 +42,7 @@ protected Provider getBoundProvider() { @Override protected long getTimeout() { - return 14000; + return 10000; } @Override From b38e1aa5a73101a9b55d8b41730dc3c33220c1e6 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 25 Jan 2026 17:34:30 +0100 Subject: [PATCH 067/109] tearing only int inits fix --- .../com/dat3m/dartagnan/program/processing/Tearing.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index 2925a1e925..eb1bfa1788 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -131,17 +131,22 @@ private int tearInits(Program program, AliasAnalysis alias, boolean bigEndian) { final MemoryObject base = init.getBase(); final int initOffset = init.getOffset(); final Expression value = init.getValue(); + final boolean isIntTearing = value.getType() instanceof IntegerType; // Tear initial values final int frontBegin = bigEndian ? bytes - offsets.get(0) : 0; final int frontEnd = bigEndian ? bytes : offsets.get(0); - final Expression frontValue = expressions.makeIntExtract(value, 8 * frontBegin, 8 * frontEnd - 1); + final Expression frontValue = isIntTearing? + expressions.makeIntExtract(value, 8 * frontBegin, 8 * frontEnd - 1): + expressions.makePtrExtract(value, 8 * frontBegin, 8 * frontEnd - 1); base.setInitialValue(initOffset, frontValue); for (int i = 0; i < offsets.size(); i++) { final int offset = offsets.get(i); final int next = i + 1 < offsets.size() ? offsets.get(i + 1) : bytes; final int begin = bigEndian ? bytes - next : offset; final int end = bigEndian ? bytes - offset : next; - final Expression tearedValue = expressions.makeIntExtract(value, 8 * begin, 8 * end - 1); + final Expression tearedValue = isIntTearing? + expressions.makeIntExtract(value, 8 * begin, 8 * end - 1): + expressions.makePtrExtract(value, 8 * begin, 8 * end - 1); base.setInitialValue(initOffset + offset, tearedValue); } // Tear init event From 1796217d9bcc4c9c3d2bcd767a1429f41af3ccd4 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 26 Jan 2026 13:48:34 +0100 Subject: [PATCH 068/109] fixed nullptr forced 64 bit encoding --- .../java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index b0808efc2f..047ee48f9b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -575,7 +575,8 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); final int targetBitWidth = expr.getTargetType().getBitWidth(); final int sourceBitWidth = expr.getSourceType().getBitWidth(); - assert (sourceBitWidth == bvmgr.getLength(innerBv)); + final int concreteBitwidth = bvmgr.getLength(innerBv); // only for debugging remove later + assert (sourceBitWidth == concreteBitwidth); if (expr.sameWidth()) { enc = innerBv;} else{ enc = expr.isExtension() @@ -648,7 +649,7 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp public TypedFormula visitNullLiteral(NullLiteral lit) { final Formula zero = context.useIntegers ? integerFormulaManager().makeNumber(0) - : bitvectorFormulaManager().makeBitvector(types.getArchType().getBitWidth(), 0); + : bitvectorFormulaManager().makeBitvector(lit.getType().bitWidth, 0); return new TypedFormula<>(lit.getType(), zero); } From 22c6ba5bf66b461534ab35a38bafaba5f4c330b9 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 26 Jan 2026 14:27:10 +0100 Subject: [PATCH 069/109] fixed llvm pthread test --- .../dartagnan/expression/processing/ExprSimplifier.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 208c7cd7ae..6c85a139dc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -225,8 +225,9 @@ public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { } // ------- Operations on memory objects ------- - if (left instanceof MemoryObject lMem && right instanceof MemoryObject rMem) { - final boolean sameObj = lMem.equals(rMem); + if (left instanceof MemoryObject && right instanceof MemoryObject + || left instanceof Function && right instanceof Function) { + final boolean sameObj = left.equals(right); final Boolean cmpResult = switch (op) { case EQ -> sameObj; From 0e38f0b15c984913ce51cff0e3efd97e020b728e Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 26 Jan 2026 16:43:34 +0100 Subject: [PATCH 070/109] improved pointer casting --- .../java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 047ee48f9b..4a16aa2a57 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -138,11 +138,13 @@ public enum ConversionMode { public BooleanFormula equal(Expression left, Expression right, ConversionMode cMode) { final ExpressionFactory exprs = context.getExpressionFactory(); + // -------------------------------------------------------------------------------------------- // todo: this is just for the wmm encoding. So find a better place for it. Or add ptr size cast. // But why is there an equal(ptr8, ptr64) in lockref1 and lockref2 tests? // Is tearing not working correctly?? - if (left.getType() instanceof PointerType && right.getType() instanceof PointerType) { + if (left.getType() instanceof PointerType && right.getType() instanceof PointerType && + ((PointerType) right.getType()).getBitWidth() != ((PointerType) left.getType()).getBitWidth()) { left = exprs.makeCast(left, types.getArchType()); right = exprs.makeCast(right, types.getArchType()); return encodeBooleanFinal(exprs.makeEQ(left, right)).formula(); From 6f7f1b544fd989f8d50dda1d1e16f612dd37a5ec Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 27 Jan 2026 10:07:42 +0100 Subject: [PATCH 071/109] fixed llvm timeout and mixed tests refactoring --- .../dartagnan/encoding/ExpressionEncoder.java | 2 +- .../dartagnan/encoding/PropertyEncoder.java | 19 +++++---- .../expression/ExpressionFactory.java | 42 +++++++++---------- .../expression/ExpressionPrinter.java | 2 +- .../expression/ExpressionVisitor.java | 2 +- .../{pointer => pointers}/IntToPtrCast.java | 2 +- .../{pointer => pointers}/NullLiteral.java | 2 +- .../{pointer => pointers}/PtrAddExpr.java | 2 +- .../{pointer => pointers}/PtrCmpExpr.java | 2 +- .../{pointer => pointers}/PtrCmpOp.java | 2 +- .../{pointer => pointers}/PtrConcat.java | 2 +- .../{pointer => pointers}/PtrExtract.java | 2 +- .../{pointer => pointers}/PtrToIntCast.java | 3 +- .../expression/processing/ExprSimplifier.java | 2 +- .../processing/ExprTransformer.java | 2 +- .../program/visitors/VisitorAsmArm.java | 4 +- .../parsers/program/visitors/VisitorLlvm.java | 8 ++-- .../alias/FieldSensitiveAndersen.java | 1 - .../alias/InclusionBasedPointerAnalysis.java | 2 +- .../analysis/alias/VirtualAliasAnalysis.java | 2 - .../program/processing/Intrinsics.java | 2 +- .../program/processing/MemToReg.java | 2 +- .../processing/NaiveLoopBoundAnnotation.java | 2 +- .../processing/RemoveDeadCondJumps.java | 2 +- .../processing/RemoveDeadNullChecks.java | 4 +- .../SparseConditionalConstantPropagation.java | 2 +- .../processing/compilation/VisitorArm8.java | 14 +++---- .../processing/compilation/VisitorC11.java | 2 +- .../processing/compilation/VisitorPower.java | 13 +++--- .../processing/compilation/VisitorRISCV.java | 16 +++---- .../processing/compilation/VisitorTso.java | 3 +- .../verification/solving/AssumeSolver.java | 3 +- dartagnan/src/test/resources/log4j2.xml | 2 +- 33 files changed, 85 insertions(+), 87 deletions(-) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/IntToPtrCast.java (93%) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/NullLiteral.java (93%) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/PtrAddExpr.java (96%) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/PtrCmpExpr.java (94%) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/PtrCmpOp.java (96%) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/PtrConcat.java (96%) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/PtrExtract.java (96%) rename dartagnan/src/main/java/com/dat3m/dartagnan/expression/{pointer => pointers}/PtrToIntCast.java (91%) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 4a16aa2a57..32baaa80cc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -11,7 +11,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryOp; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.*; +import com.dat3m.dartagnan.expression.pointers.*; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.dat3m.dartagnan.program.Register; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index cda3560f29..3351f25ae7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -5,6 +5,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Thread; @@ -477,7 +478,7 @@ private boolean mayBeFinalAddressStore(Store store, List stores) { if (laterStores.stream().anyMatch(o -> exec.isImplied(store, o))) { return false; } - if (!stores.stream().allMatch(o -> o.getMemValue().getType() instanceof IntegerType)) { + if (!stores.stream().allMatch(o -> o.getMemValue().getType() instanceof IntegerType || o.getMemValue().getType() instanceof PointerType)) { return false; } final TypeFactory types = TypeFactory.getInstance(); @@ -491,15 +492,19 @@ private BooleanFormula referencesObject(List stores, boolean isValue, Mem Preconditions.checkArgument(!stores.isEmpty(), "Empty instruction cannot reference object '%s'.", object); //TODO Use provenance to omit some of these checks statically. final ExpressionFactory expressions = context.getExpressionFactory(); - final Expression pointer = isValue - ? expressions.makeIntConcat(stores.stream().map(Store::getMemValue).toList()) - : stores.get(0).getAddress(); + Expression pointer; + if (isValue) { + List memVals = stores.stream().map(Store::getMemValue).toList(); + pointer = memVals.get(0) instanceof IntegerType ?expressions.makeIntConcat(memVals): expressions.makePtrConcat(memVals); + }else{ + pointer = stores.get(0).getAddress(); + } if (object.equals(pointer)) { return bmgr.makeTrue(); } - final Expression objectEnd = expressions.makeAdd(object, object.size()); - final Expression overLowerBound = expressions.makeLTE(object, pointer, false); - final Expression underUpperBound = expressions.makeLT(pointer, objectEnd, false); + final Expression objectEnd = expressions.makePtrAdd(object, object.size()); + final Expression overLowerBound = expressions.makeLTEfromInts(object, pointer, false); + final Expression underUpperBound = expressions.makeLTfromInts(pointer, objectEnd, false); final Expression withinBounds = expressions.makeAnd(overLowerBound, underUpperBound); return context.getExpressionEncoder().encodeBooleanAt(withinBounds, stores.get(0)).formula(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index a3311d4d45..48f5db93c7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -6,7 +6,7 @@ import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.*; +import com.dat3m.dartagnan.expression.pointers.*; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.dat3m.dartagnan.program.memory.MemoryObject; @@ -131,20 +131,20 @@ public Expression makeGTE(Expression leftOperand, Expression rightOperand, boole return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } - public Expression makeLTforced(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpForced(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); + public Expression makeLTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } - public Expression makeGTforced(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpForced(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); + public Expression makeGTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } - public Expression makeLTEforced(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpForced(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); + public Expression makeLTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } - public Expression makeGTEforced(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpForced(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); + public Expression makeGTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { + return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } public Expression makeNeg(Expression operand) { @@ -215,12 +215,12 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } - public Expression makeIntCmpForced(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { + public Expression makeIntCmpFromInts(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpForced(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); + return makeIntCmpFromInts(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntCmpForced(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); + return makeIntCmpFromInts(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); } return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } @@ -229,12 +229,12 @@ public Expression makeIntBinary(Expression leftOperand, IntBinaryOp operator, Ex return new IntBinaryExpr(leftOperand, operator, rightOperand); } - public Expression makeIntBinaryForced(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { + public Expression makeIntBinaryfromInts(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntBinaryForced(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); + return makeIntBinaryfromInts(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntBinaryForced(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); + return makeIntBinaryfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); } return new IntBinaryExpr(leftOperand, operator, rightOperand); } @@ -513,13 +513,13 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Equality not supported on type: " + type); } - public Expression makeEQforced(Expression leftOperand, Expression rightOperand) { + public Expression makeEQfromInts(Expression leftOperand, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeEQforced(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); + return makeEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeEQforced(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); + return makeEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); } return makeEQ(leftOperand, rightOperand); } @@ -541,13 +541,13 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Disequality not supported on type: " + type); } - public Expression makeNEQforced(Expression leftOperand, Expression rightOperand) { + public Expression makeNEQfromInts(Expression leftOperand, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeNEQforced(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); + return makeNEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeNEQforced(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); + return makeNEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); } return makeNEQ(leftOperand, rightOperand); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java index 0205506ec6..e7b74bcf8a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionPrinter.java @@ -7,7 +7,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryOp; import com.dat3m.dartagnan.expression.floats.FloatSizeCast; import com.dat3m.dartagnan.expression.floats.IntToFloatCast; -import com.dat3m.dartagnan.expression.pointer.*; +import com.dat3m.dartagnan.expression.pointers.*; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index e38a1ac601..6bdf646f51 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -11,7 +11,7 @@ import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.*; +import com.dat3m.dartagnan.expression.pointers.*; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.memory.FinalMemoryValue; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/IntToPtrCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/IntToPtrCast.java similarity index 93% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/IntToPtrCast.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/IntToPtrCast.java index f2064b2c1b..9fb7b1068d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/IntToPtrCast.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/IntToPtrCast.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionVisitor; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/NullLiteral.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/NullLiteral.java similarity index 93% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/NullLiteral.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/NullLiteral.java index f179a82e1f..29bf3dba69 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/NullLiteral.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/NullLiteral.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.ExpressionKind; import com.dat3m.dartagnan.expression.ExpressionVisitor; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java similarity index 96% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java index cef4509598..a913538133 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrAddExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionKind; import com.dat3m.dartagnan.expression.ExpressionVisitor; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpExpr.java similarity index 94% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpExpr.java index 436862b5bf..f738f846a0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpExpr.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionVisitor; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java similarity index 96% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpOp.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java index 443a071bd5..644851e4d5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrCmpOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.ExpressionKind; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java similarity index 96% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java index abe239c1b5..04eba73c90 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrConcat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionKind; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java similarity index 96% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java index 8f74410104..26adae32b3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrExtract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionKind; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrToIntCast.java similarity index 91% rename from dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java rename to dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrToIntCast.java index 99eb42a50d..60c4417532 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointer/PtrToIntCast.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrToIntCast.java @@ -1,4 +1,4 @@ -package com.dat3m.dartagnan.expression.pointer; +package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionVisitor; @@ -6,7 +6,6 @@ import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; -import scala.concurrent.impl.FutureConvertersImpl; public final class PtrToIntCast extends CastExpressionBase { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 6c85a139dc..ac828eea78 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -11,7 +11,7 @@ import com.dat3m.dartagnan.expression.booleans.*; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.*; +import com.dat3m.dartagnan.expression.pointers.*; import com.dat3m.dartagnan.expression.utils.IntegerHelper; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.memory.MemoryObject; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index 264037e1cc..3a9703eea2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -17,7 +17,7 @@ import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; -import com.dat3m.dartagnan.expression.pointer.*; +import com.dat3m.dartagnan.expression.pointers.*; import java.util.ArrayList; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index a6046d61b2..1d5ab76c72 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -10,7 +10,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntCmpOp; -import com.dat3m.dartagnan.expression.pointer.PtrCmpOp; +import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.parsers.AsmArmBaseVisitor; @@ -309,7 +309,7 @@ public Object visitBranchEqual(AsmArmParser.BranchEqualContext ctx) { public Object visitBranchNotEqual(AsmArmParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); // todo remove forced ptr to int - Expression expr = expressions.makeIntCmpForced(comparator.left(), IntCmpOp.NEQ, comparator.right()); + Expression expr = expressions.makeIntCmpFromInts(comparator.left(), IntCmpOp.NEQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index 5463d43792..ab4f4045b5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -589,10 +589,10 @@ public Expression visitICmpInst(ICmpInstContext ctx) { // todo should pointers belong to the same object to be comparable? // The two arguments must be integer, pointer ,or integer vector typed. They must also be of identical types. // llvm doc: If the operands are pointer typed, the pointer values are compared as if they were integers. - case "slt", "ult" -> expressions.makeLTforced(left, right, operator.startsWith("s")); - case "sle", "ule" -> expressions.makeLTEforced(left, right, operator.startsWith("s")); - case "sgt", "ugt" -> expressions.makeGTforced(left, right, operator.startsWith("s")); - case "sge", "uge" -> expressions.makeGTEforced(left, right, operator.startsWith("s")); + case "slt", "ult" -> expressions.makeLTfromInts(left, right, operator.startsWith("s")); + case "sle", "ule" -> expressions.makeLTEfromInts(left, right, operator.startsWith("s")); + case "sgt", "ugt" -> expressions.makeGTfromInts(left, right, operator.startsWith("s")); + case "sge", "uge" -> expressions.makeGTEfromInts(left, right, operator.startsWith("s")); default -> throw new ParsingException(String.format("Unknown predicate in %s.", ctx.getText())); }; // LLVM does not support a distinct boolean type. diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java index d933dd759a..4c61142bde 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java @@ -7,7 +7,6 @@ import com.dat3m.dartagnan.expression.integers.IntSizeCast; import com.dat3m.dartagnan.expression.integers.IntUnaryExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Register; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index ff890c5c21..eb54c92f41 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -5,7 +5,7 @@ import com.dat3m.dartagnan.expression.aggregates.ConstructExpr; import com.dat3m.dartagnan.expression.aggregates.ExtractExpr; import com.dat3m.dartagnan.expression.integers.*; -import com.dat3m.dartagnan.expression.pointer.*; +import com.dat3m.dartagnan.expression.pointers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; import com.dat3m.dartagnan.expression.processing.ExpressionInspector; import com.dat3m.dartagnan.expression.type.TypeFactory; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java index 539c775e0e..bd53101912 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/VirtualAliasAnalysis.java @@ -1,7 +1,5 @@ package com.dat3m.dartagnan.program.analysis.alias; -import com.dat3m.dartagnan.expression.Expression; -import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; import com.dat3m.dartagnan.program.event.core.MemoryCoreEvent; import com.dat3m.dartagnan.program.memory.MemoryObject; import com.dat3m.dartagnan.program.memory.VirtualMemoryObject; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index 01bc0592f6..b5a7bd533b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -6,7 +6,7 @@ import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; -import com.dat3m.dartagnan.expression.pointer.NullLiteral; +import com.dat3m.dartagnan.expression.pointers.NullLiteral; import com.dat3m.dartagnan.expression.type.FunctionType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java index b9627379da..fa4c55a6b2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java @@ -6,7 +6,7 @@ import com.dat3m.dartagnan.expression.integers.IntBinaryExpr; import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; -import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; +import com.dat3m.dartagnan.expression.pointers.PtrAddExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java index e82dc71f8a..cb238282d5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveLoopBoundAnnotation.java @@ -4,7 +4,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; +import com.dat3m.dartagnan.expression.pointers.PtrAddExpr; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.analysis.DominatorAnalysis; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java index f1bebe8681..61ae016e70 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadCondJumps.java @@ -2,7 +2,7 @@ import com.dat3m.dartagnan.expression.booleans.BoolUnaryExpr; import com.dat3m.dartagnan.expression.integers.IntCmpExpr; -import com.dat3m.dartagnan.expression.pointer.PtrCmpExpr; +import com.dat3m.dartagnan.expression.pointers.PtrCmpExpr; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.Tag; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java index 04778ca832..7448f6b508 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java @@ -5,8 +5,8 @@ import com.dat3m.dartagnan.expression.ExpressionVisitor; import com.dat3m.dartagnan.expression.integers.*; import com.dat3m.dartagnan.expression.misc.ITEExpr; -import com.dat3m.dartagnan.expression.pointer.NullLiteral; -import com.dat3m.dartagnan.expression.pointer.PtrAddExpr; +import com.dat3m.dartagnan.expression.pointers.NullLiteral; +import com.dat3m.dartagnan.expression.pointers.PtrAddExpr; import com.dat3m.dartagnan.expression.processing.ExprTransformer; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java index a23ef61210..56c2bc602c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SparseConditionalConstantPropagation.java @@ -3,7 +3,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.booleans.BoolLiteral; import com.dat3m.dartagnan.expression.integers.IntLiteral; -import com.dat3m.dartagnan.expression.pointer.NullLiteral; +import com.dat3m.dartagnan.expression.pointers.NullLiteral; import com.dat3m.dartagnan.expression.processing.ExprSimplifier; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.IRHelper; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index 2be7fcef08..507df911f6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -219,7 +219,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, ARMv8.extractLoadMoFromCMo(mo)); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); Store store = newRMWStoreExclusiveWithMo(address, dummyReg, true, ARMv8.extractStoreMoFromCMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(resultRegister, label); @@ -380,7 +380,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Label casEnd = newLabel("CAS_end"); // The real scheme uses XOR instead of comparison, but both are semantically // equivalent and XOR harms performance substantially. - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQforced(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQfromInts(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, e.getStoreValue(), true, ARMv8.extractStoreMoFromLKMo(mo)); @@ -432,7 +432,7 @@ public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { Expression address = e.getAddress(); Register dummy = e.getFunction().newRegister(e.getAccessType()); - Expression storeValue = expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()),dummy.getType()); + Expression storeValue = expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()),dummy.getType()); Load load = newRMWLoadExclusive(dummy, address); Store store = newRMWStoreExclusive(address, storeValue, true); Label label = newLabel("FakeDep"); @@ -465,7 +465,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()),dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()),dummy.getType())), store, newLocal(resultRegister, dummy), fakeCtrlDep, @@ -486,7 +486,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register dummy = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); - Store store = newRMWStoreExclusiveWithMo(address, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()), + Store store = newRMWStoreExclusiveWithMo(address, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()), true, ARMv8.extractStoreMoFromLKMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(dummy, label); @@ -535,7 +535,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeNEQforced(regValue, unless), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeNEQfromInts(regValue, unless), dummy.getType())), branchOnCauCmpResult, store, fakeCtrlDep, @@ -561,7 +561,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); - Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())); + Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())); Store store = newRMWStoreExclusiveWithMo(address, dummy, true, ARMv8.extractStoreMoFromLKMo(mo)); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java index 13bcc9a1f7..7c94ad2435 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java @@ -83,7 +83,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadWithMo(resultRegister, address, Tag.C11.loadMO(mo)); - Expression temp = expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()); + Expression temp = expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()); Local localOp = newLocal(dummyReg, dummyReg.getType() instanceof IntegerType ? temp : expressions.makeIntToPtrCast(temp)); RMWStore store = newRMWStoreWithMo(load, address, dummyReg, Tag.C11.storeMO(mo)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java index cd2a3c1982..0236c03a76 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java @@ -2,7 +2,6 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; -import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -369,7 +368,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister,e.getOperator() ,e.getOperand()),dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister,e.getOperator() ,e.getOperand()),dummyReg.getType())); Load load = newRMWLoadExclusive(resultRegister, address); Store store = Power.newRMWStoreConditional(address, dummyReg, true); @@ -660,7 +659,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQforced(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQfromInts(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); Store store = Power.newRMWStoreConditional(address, e.getStoreValue(), true); @@ -765,7 +764,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()),dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()),dummy.getType())), store, newLocal(resultRegister, dummy), fakeCtrlDep, @@ -784,7 +783,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register dummy = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusive(dummy, address); - Store store = Power.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()), true); + Store store = Power.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()), true); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(dummy, label); @@ -842,7 +841,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeNEQforced(regValue, unless)), + newLocal(dummy, expressions.makeNEQfromInts(regValue, unless)), branchOnCauCmpResult, store, fakeCtrlDep, @@ -868,7 +867,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusive(dummy, address); - Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())); + Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())); Store store = Power.newRMWStoreConditional(address, dummy, true); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index 338f7099a2..82180a25cd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -103,7 +103,7 @@ public List visitLlvmRMW(LlvmRMW e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(type); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, Tag.RISCV.extractLoadMoFromCMo(mo)); Store store = RISCV.newRMWStoreConditional(address, dummyReg, Tag.RISCV.extractStoreMoFromCMo(mo), true); @@ -226,7 +226,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(type); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, Tag.RISCV.extractLoadMoFromCMo(mo)); Store store = RISCV.newRMWStoreConditional(address, dummyReg, Tag.RISCV.extractStoreMoFromCMo(mo), true); @@ -396,7 +396,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQforced(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQfromInts(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? Store store = RISCV.newRMWStoreConditional(address, e.getStoreValue(), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); @@ -463,7 +463,7 @@ public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { Register dummy = e.getFunction().newRegister(type); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); - Expression storeValue = expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()); + Expression storeValue = expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()); String moLoad = mo.equals(Tag.Linux.MO_MB) || mo.equals(Tag.Linux.MO_ACQUIRE) ? Tag.RISCV.MO_ACQ : ""; Load load = newRMWLoadExclusiveWithMo(dummy, address, moLoad); String moStore = mo.equals(Tag.Linux.MO_MB) || mo.equals(Tag.Linux.MO_RELEASE) ? Tag.RISCV.MO_ACQ_REL : ""; @@ -499,7 +499,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? - Store store = RISCV.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType()), + Store store = RISCV.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); ExecutionStatus status = newExecutionStatusWithDependencyTracking(statusReg, store); Label label = newLabel("FakeDep"); @@ -545,7 +545,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())), store, status, newLocal(resultRegister, dummy), @@ -592,7 +592,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeNEQforced(regValue, unless)), + newLocal(dummy, expressions.makeNEQfromInts(regValue, unless)), branchOnCauCmpResult, store, fakeCtrlDep, @@ -618,7 +618,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? - Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryForced(dummy, e.getOperator(), e.getOperand()), dummy.getType())); + Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())); Store store = newRMWStoreExclusiveWithMo(address, dummy, true, mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : ""); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java index 1739e0a1db..06c307e78a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java @@ -2,7 +2,6 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; -import com.dat3m.dartagnan.expression.integers.IntBinaryOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; @@ -171,7 +170,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { // )); return tagList(eventSequence( load, - newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryForced(resultRegister,e.getOperator(),e.getOperand()),dummyReg.getType())), + newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister,e.getOperator(),e.getOperand()),dummyReg.getType())), newRMWStore(load, address, dummyReg) )); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java index b5c83ebb83..daecec5a0b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/AssumeSolver.java @@ -75,7 +75,7 @@ private void run() throws InterruptedException, SolverException, InvalidConfigur BooleanFormula assumedSpec = bmgr.implication(assumptionLiteral, propertyEncoding); prover.writeComment("Property encoding"); prover.addConstraint(assumedSpec); - + // prover.getModel(); // only while debugging logger.info("Starting first solver.check()"); if (prover.isUnsatWithAssumptions(singletonList(assumptionLiteral))) { prover.writeComment("Bound encoding"); @@ -83,7 +83,6 @@ private void run() throws InterruptedException, SolverException, InvalidConfigur logger.info("Starting second solver.check()"); res = prover.isUnsat() ? PASS : Result.UNKNOWN; } else { - // prover get model res = FAIL; saveFlaggedPairsOutput(memoryModel, prover, context, task.getProgram()); } diff --git a/dartagnan/src/test/resources/log4j2.xml b/dartagnan/src/test/resources/log4j2.xml index 7f30218ad7..ce06a0dddd 100644 --- a/dartagnan/src/test/resources/log4j2.xml +++ b/dartagnan/src/test/resources/log4j2.xml @@ -16,7 +16,7 @@ - + From 35e13b81ece809b5241192aa1e4568944ad44fca Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 27 Jan 2026 11:30:10 +0100 Subject: [PATCH 072/109] forced litmus riscv ptrs' handling as ints --- .../program/visitors/VisitorLitmusRISCV.java | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java index edb3d4f19a..9f5a6e5a23 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java @@ -134,15 +134,15 @@ public Object visitOr(LitmusRISCVParser.OrContext ctx) { @Override public Object visitAdd(LitmusRISCVParser.AddContext ctx) { // todo the problem here is pointer addition saved to int reg - Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), pointerType); + Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); - if (r2.getType() instanceof PointerType && r3.getType() instanceof IntegerType) { - return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makePtrAdd(r2, r3))); - }else if (r3.getType() instanceof PointerType && r2.getType() instanceof IntegerType) { - return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makePtrAdd(r3, r2))); - } - return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeAdd(r2, r3))); + + return programBuilder.addChild( + mainThread, EventFactory.newLocal(r1, expressions.makeCast( + expressions.makeAdd(expressions.makeIntegerCast(r2,archType,false), + expressions.makeIntegerCast(r3,archType,false)),r1.getType()))); + } @@ -182,21 +182,21 @@ public Object visitAddi(LitmusRISCVParser.AddiContext ctx) { public Object visitLw(LitmusRISCVParser.LwContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); - return programBuilder.addChild(mainThread, EventFactory.newLoadWithMo(r1, ra, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + return programBuilder.addChild(mainThread, EventFactory.newLoadWithMo(r1, expressions.makePtrCast(ra,pointerType), getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); } @Override public Object visitSw(LitmusRISCVParser.SwContext ctx) { Register r1 = programBuilder.getOrErrorRegister(mainThread, ctx.register(0).getText()); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); - return programBuilder.addChild(mainThread, EventFactory.newStoreWithMo(ra, r1, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + return programBuilder.addChild(mainThread, EventFactory.newStoreWithMo(expressions.makePtrCast(ra,pointerType), r1, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); } @Override public Object visitLr(LitmusRISCVParser.LrContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); - return programBuilder.addChild(mainThread, EventFactory.newRMWLoadExclusiveWithMo(r1, ra, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + return programBuilder.addChild(mainThread, EventFactory.newRMWLoadExclusiveWithMo(r1, expressions.makePtrCast(ra,pointerType), getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); } @Override @@ -204,7 +204,7 @@ public Object visitSc(LitmusRISCVParser.ScContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrNewRegister(mainThread, ctx.register(1).getText(), archType); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); - return programBuilder.addChild(mainThread, EventFactory.Common.newExclusiveStore(r1, ra, r2, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + return programBuilder.addChild(mainThread, EventFactory.Common.newExclusiveStore(r1, expressions.makePtrCast(ra,pointerType), r2, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); } @Override From ebfec4c84dad4fa0537f8511e03ae852882e48ad Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 27 Jan 2026 16:43:21 +0100 Subject: [PATCH 073/109] asm bug workaround --- .../dartagnan/expression/ExpressionFactory.java | 16 ++++++++-------- .../parsers/program/utils/AsmUtils.java | 7 ++----- .../parsers/program/visitors/VisitorAsmArm.java | 4 ++-- .../parsers/program/visitors/VisitorAsmPPC.java | 11 +++++++---- .../program/event/core/ExecutionStatus.java | 5 +++-- 5 files changed, 22 insertions(+), 21 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 48f5db93c7..8a7dc5e7b8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -132,19 +132,19 @@ public Expression makeGTE(Expression leftOperand, Expression rightOperand, boole } public Expression makeLTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); + return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } public Expression makeGTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); + return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } public Expression makeLTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); + return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } public Expression makeGTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpFromInts(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); + return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } public Expression makeNeg(Expression operand) { @@ -215,12 +215,12 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } - public Expression makeIntCmpFromInts(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { + public Expression makeIntCmpfromInts(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpFromInts(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); + return makeIntCmpfromInts(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntCmpFromInts(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); + return makeIntCmpfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); } return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } @@ -400,7 +400,7 @@ public Expression makePtrCast(Expression base, PointerType type){ // pointers of different size than arch should not be used (store | load). Comparison is still possible in wmm. }else{ // we use this because spirv has some weird casts between scoped pointers. - // not the most elegant solution, maybe a dedicated ptr size/type cast? + // not the most elegant solution, maybe a dedicated ptr size/type cast? return makeIntToPtrCast(makePtrToIntCast(base, TypeFactory.getInstance().getIntegerType(type.bitWidth)), type); }} if (base.getType() instanceof IntegerType) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java index 66fbbde42d..f0e14e2042 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java @@ -6,10 +6,7 @@ import com.dat3m.dartagnan.exception.ParsingException; import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; -import com.dat3m.dartagnan.expression.type.AggregateType; -import com.dat3m.dartagnan.expression.type.BooleanType; -import com.dat3m.dartagnan.expression.type.IntegerType; -import com.dat3m.dartagnan.expression.type.VoidType; +import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.EventFactory; import com.dat3m.dartagnan.program.event.core.Label; @@ -28,7 +25,7 @@ public static int getNumASMReturnRegisters(Register returnRegister) { return 0; } Type returnType = returnRegister.getType(); - if (returnType instanceof IntegerType || returnType instanceof BooleanType) { + if (returnType instanceof IntegerType || returnType instanceof PointerType || returnType instanceof BooleanType) { return 1; } else if (isReturnRegisterAggregate(returnRegister)) { return ((AggregateType) returnType).getFields().size(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index 1d5ab76c72..095be7cbd2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -309,7 +309,7 @@ public Object visitBranchEqual(AsmArmParser.BranchEqualContext ctx) { public Object visitBranchNotEqual(AsmArmParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); // todo remove forced ptr to int - Expression expr = expressions.makeIntCmpFromInts(comparator.left(), IntCmpOp.NEQ, comparator.right()); + Expression expr = expressions.makeIntCmpfromInts(comparator.left(), IntCmpOp.NEQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } @@ -337,7 +337,7 @@ public Object visitRegister(AsmArmParser.RegisterContext ctx) { // Pick up the correct type and create the new Register Type registerType = AsmUtils.getLlvmRegisterTypeGivenAsmRegisterID(this.argsRegisters,this.returnRegister,registerID); String newRegisterName = AsmUtils.makeRegisterName(registerID); - Register newRegister = this.llvmFunction.getOrNewRegister(newRegisterName, registerType); + Register newRegister = this.llvmFunction.getOrNewRegister(newRegisterName, registerType);// fix this for execution state (reg is wrong state) if (AsmUtils.isPartOfReturnRegister(this.returnRegister, registerID) && AsmUtils.isReturnRegisterAggregate(this.returnRegister)) { this.pendingRegisters.add(newRegister); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java index e9778bd3aa..029ca53d22 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java @@ -12,16 +12,17 @@ import com.dat3m.dartagnan.expression.integers.IntCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.AsmPPCBaseVisitor; import com.dat3m.dartagnan.parsers.AsmPPCParser; import com.dat3m.dartagnan.parsers.program.utils.AsmUtils; +import com.dat3m.dartagnan.parsers.program.utils.ProgramBuilder; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; import com.dat3m.dartagnan.program.event.EventFactory; import com.dat3m.dartagnan.program.event.core.Label; import com.dat3m.dartagnan.program.event.core.Local; -import scala.concurrent.impl.FutureConvertersImpl; import static com.google.common.base.Preconditions.checkState; @@ -35,6 +36,7 @@ private record CmpInstruction(Expression left, Expression right) {}; private final Function llvmFunction; private final Register returnRegister; private final ExpressionFactory expressions = ExpressionFactory.getInstance(); + private final IntegerType archType = TypeFactory.getInstance().getArchType(); private CmpInstruction comparator; // keeps track of all the labels defined in the the asm code private final HashMap labelsDefined = new HashMap<>(); @@ -44,6 +46,7 @@ private record CmpInstruction(Expression left, Expression right) {}; private final List argsRegisters; // expected type of RHS of a comparison. private Type expectedType; + // map from RegisterID to the corresponding asm register private final HashMap asmRegisters = new HashMap<>(); @@ -112,8 +115,8 @@ public Object visitStoreConditional(AsmPPCParser.StoreConditionalContext ctx) { expectedType = address.getType(); Expression offset = (Expression) ctx.value().accept(this); Expression newAddress = expressions.makePtrAdd(address,offset); - Register resultRegister = llvmFunction.getOrNewRegister("CondStoreResult", value.getType()); - this.comparator = new CmpInstruction(resultRegister,expressions.makeZero((IntegerType) value.getType())); + Register resultRegister = llvmFunction.getOrNewRegister("CondStoreResult", archType); + this.comparator = new CmpInstruction(resultRegister, expressions.makeZero(archType)); asmInstructions.add(EventFactory.Common.newExclusiveStore(resultRegister, newAddress, value, "")); return null; } @@ -130,7 +133,7 @@ public Object visitCompare(AsmPPCParser.CompareContext ctx) { @Override public Object visitBranchNotEqual(AsmPPCParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - Expression expr = expressions.makeIntCmp(comparator.left(), IntCmpOp.NEQ, comparator.right()); + Expression expr = expressions.makeIntCmpfromInts(comparator.left(), IntCmpOp.NEQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java index ddd6820965..20cef7cdd5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java @@ -12,6 +12,7 @@ import java.util.Map; import java.util.Set; +import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.LEFT_TO_RIGHT; import static com.dat3m.dartagnan.encoding.ExpressionEncoder.ConversionMode.RIGHT_TO_LEFT; public class ExecutionStatus extends AbstractEvent implements RegWriter, EventUser { @@ -21,7 +22,7 @@ public class ExecutionStatus extends AbstractEvent implements RegWriter, EventUs private final boolean trackDep; public ExecutionStatus(Register register, Event event, boolean trackDep) { - assert !(register.getType() instanceof PointerType); + // assert !(register.getType() instanceof PointerType); this.register = register; this.event = event; this.trackDep = trackDep; @@ -74,7 +75,7 @@ public BooleanFormula encodeExec(EncodingContext context) { var res = context.result(this); return bmgr.and( super.encodeExec(context), - context.getExpressionEncoder().equal(res, notExec, RIGHT_TO_LEFT) + context.getExpressionEncoder().equal(res, notExec, LEFT_TO_RIGHT) // was RIGHT_TO_LEFT ); } From c1cf84b60733bb8af999b29107741a603e181f22 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 28 Jan 2026 12:20:07 +0100 Subject: [PATCH 074/109] asm execution status workaround --- .../dartagnan/program/event/core/ExecutionStatus.java | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java index 20cef7cdd5..3851075a17 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java @@ -73,9 +73,12 @@ public BooleanFormula encodeExec(EncodingContext context) { // change the compilation of Store-Conditional to invert the value. final Expression notExec = exprEncoder.wrap(bmgr.not(context.execution(event))); var res = context.result(this); + if (res.getType() instanceof PointerType){ + return bmgr.makeTrue(); + } return bmgr.and( - super.encodeExec(context), - context.getExpressionEncoder().equal(res, notExec, LEFT_TO_RIGHT) // was RIGHT_TO_LEFT + super.encodeExec(context), // this is a boolean formula + context.getExpressionEncoder().equal(res, notExec, RIGHT_TO_LEFT) ); } From a02baf25fb01ce8200121e7700e3cbf4b13d7e6d Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 28 Jan 2026 15:28:01 +0100 Subject: [PATCH 075/109] fixed armv8 (armv7 still broken) --- .../dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java | 2 +- .../com/dat3m/dartagnan/program/event/core/ExecutionStatus.java | 2 +- .../main/java/com/dat3m/dartagnan/utils/printer/Printer.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index 095be7cbd2..749bb9ee68 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -300,7 +300,7 @@ public Object visitMove(AsmArmParser.MoveContext ctx) { @Override public Object visitBranchEqual(AsmArmParser.BranchEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - Expression expr = expressions.makeIntCmp(comparator.left(), IntCmpOp.EQ, comparator.right()); + Expression expr = expressions.makeIntCmpfromInts(comparator.left(), IntCmpOp.EQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java index 3851075a17..c8fe361a6e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java @@ -74,7 +74,7 @@ public BooleanFormula encodeExec(EncodingContext context) { final Expression notExec = exprEncoder.wrap(bmgr.not(context.execution(event))); var res = context.result(this); if (res.getType() instanceof PointerType){ - return bmgr.makeTrue(); + return bmgr.makeFalse(); } return bmgr.and( super.encodeExec(context), // this is a boolean formula diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java index 606b1f460f..e9d59574bb 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java @@ -56,7 +56,7 @@ public Printer setMode(Mode mode) { @Option(name = OptionNames.PRINTER_SHOW_PROGRAM_CONSTANTS, description = "Print non-deterministic program constants (default: false)", secure = true) - private boolean showProgramConstants = true; + private boolean showProgramConstants = false; @Option(name = OptionNames.PRINTER_SHOW_SPECIFICATION, description = "Print program specification and filter (default: false)", From 2af16da4c3c53bc8e2137d30011f2c018c266aa6 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 29 Jan 2026 09:51:57 +0100 Subject: [PATCH 076/109] fixed armv7 asm and null pointer handling problem --- .../java/com/dat3m/dartagnan/encoding/PropertyEncoder.java | 3 ++- .../dat3m/dartagnan/expression/processing/ExprSimplifier.java | 1 + .../com/dat3m/dartagnan/expression/utils/ExpressionHelper.java | 2 +- .../java/com/dat3m/dartagnan/program/memory/MemoryObject.java | 3 ++- 4 files changed, 6 insertions(+), 3 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index 3351f25ae7..e9b261d601 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -478,7 +478,8 @@ private boolean mayBeFinalAddressStore(Store store, List stores) { if (laterStores.stream().anyMatch(o -> exec.isImplied(store, o))) { return false; } - if (!stores.stream().allMatch(o -> o.getMemValue().getType() instanceof IntegerType || o.getMemValue().getType() instanceof PointerType)) { + if (!stores.stream().allMatch(o -> o.getMemValue().getType() instanceof IntegerType || + o.getMemValue().getType() instanceof PointerType)) { return false; } final TypeFactory types = TypeFactory.getInstance(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index ac828eea78..99366b313b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -189,6 +189,7 @@ public Expression visitIntCmpExpression(IntCmpExpr cmp) { return expressions.makeIntCmp(left, op, right); } + @Override public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { final Expression rewrite = tryGeneralRewrite(cmp); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java index e6f9bfe775..818f9a5fab 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java @@ -48,7 +48,7 @@ public static void checkInbounds(Type aggregateType, int index) { } public static boolean isScalar(Type type) { - return type instanceof BooleanType || type instanceof IntegerType || type instanceof FloatType; + return type instanceof BooleanType || type instanceof IntegerType || type instanceof FloatType || type instanceof PointerType; } public static boolean isAggregateLike(Type type) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java index 8866f14496..f36286ca6f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.aggregates.ConstructExpr; import com.dat3m.dartagnan.expression.base.LeafExpressionBase; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointers.NullLiteral; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.program.event.core.Alloc; import com.google.common.base.Preconditions; @@ -70,7 +71,7 @@ public record PosixThreadLocal(MemoryObject destructor) implements ThreadLocalMo public Set getFeatureTags() { return featureTags; } public Expression size() { return size; } - public boolean hasKnownSize() { return size instanceof IntLiteral; } + public boolean hasKnownSize() { return size instanceof IntLiteral || size instanceof NullLiteral; } public int getKnownSize() { Preconditions.checkState(hasKnownSize(), "Cannot call method getKnownSize() for object %s with unknown size", this); return ((IntLiteral)size).getValueAsInt(); From a2aeba2d061e418e44918475f25508c7dc0370ff Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 29 Jan 2026 09:51:57 +0100 Subject: [PATCH 077/109] fixed armv7 asm --- .../java/com/dat3m/dartagnan/encoding/PropertyEncoder.java | 3 ++- .../dat3m/dartagnan/expression/processing/ExprSimplifier.java | 1 + .../com/dat3m/dartagnan/expression/utils/ExpressionHelper.java | 2 +- .../java/com/dat3m/dartagnan/program/memory/MemoryObject.java | 3 ++- .../dat3m/dartagnan/program/processing/ProcessingManager.java | 2 +- 5 files changed, 7 insertions(+), 4 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index 3351f25ae7..e9b261d601 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -478,7 +478,8 @@ private boolean mayBeFinalAddressStore(Store store, List stores) { if (laterStores.stream().anyMatch(o -> exec.isImplied(store, o))) { return false; } - if (!stores.stream().allMatch(o -> o.getMemValue().getType() instanceof IntegerType || o.getMemValue().getType() instanceof PointerType)) { + if (!stores.stream().allMatch(o -> o.getMemValue().getType() instanceof IntegerType || + o.getMemValue().getType() instanceof PointerType)) { return false; } final TypeFactory types = TypeFactory.getInstance(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index ac828eea78..99366b313b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -189,6 +189,7 @@ public Expression visitIntCmpExpression(IntCmpExpr cmp) { return expressions.makeIntCmp(left, op, right); } + @Override public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { final Expression rewrite = tryGeneralRewrite(cmp); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java index e6f9bfe775..818f9a5fab 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java @@ -48,7 +48,7 @@ public static void checkInbounds(Type aggregateType, int index) { } public static boolean isScalar(Type type) { - return type instanceof BooleanType || type instanceof IntegerType || type instanceof FloatType; + return type instanceof BooleanType || type instanceof IntegerType || type instanceof FloatType || type instanceof PointerType; } public static boolean isAggregateLike(Type type) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java index 8866f14496..c4f09f2d3b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.aggregates.ConstructExpr; import com.dat3m.dartagnan.expression.base.LeafExpressionBase; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointers.NullLiteral; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.program.event.core.Alloc; import com.google.common.base.Preconditions; @@ -70,7 +71,7 @@ public record PosixThreadLocal(MemoryObject destructor) implements ThreadLocalMo public Set getFeatureTags() { return featureTags; } public Expression size() { return size; } - public boolean hasKnownSize() { return size instanceof IntLiteral; } + public boolean hasKnownSize() { return size instanceof IntLiteral;} public int getKnownSize() { Preconditions.checkState(hasKnownSize(), "Cannot call method getKnownSize() for object %s with unknown size", this); return ((IntLiteral)size).getValueAsInt(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index 3178efff5c..40ec5276cf 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = false; + private boolean printAfterProcessing = true; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { From 3489a031a1ac4b902d0159a6ce8565b84001340b Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 31 Jan 2026 10:34:53 +0100 Subject: [PATCH 078/109] fixed non constrained variable --- .../dat3m/dartagnan/expression/ExpressionFactory.java | 3 +++ .../dartagnan/program/event/core/ExecutionStatus.java | 9 ++++++--- .../dartagnan/program/processing/ProcessingManager.java | 2 +- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 8a7dc5e7b8..bad5bec525 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -406,6 +406,9 @@ public Expression makePtrCast(Expression base, PointerType type){ if (base.getType() instanceof IntegerType) { return makeIntToPtrCast(base, type); } + if (base.getType() instanceof BooleanType) { + return makePtrCast(makeIntegerCast(base, types.getArchType(),false),type); + } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java index c8fe361a6e..7f2fd79559 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java @@ -3,6 +3,8 @@ import com.dat3m.dartagnan.encoding.EncodingContext; import com.dat3m.dartagnan.encoding.ExpressionEncoder; import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionFactory; +import com.dat3m.dartagnan.expression.pointers.PtrToIntCast; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.*; @@ -73,9 +75,10 @@ public BooleanFormula encodeExec(EncodingContext context) { // change the compilation of Store-Conditional to invert the value. final Expression notExec = exprEncoder.wrap(bmgr.not(context.execution(event))); var res = context.result(this); - if (res.getType() instanceof PointerType){ - return bmgr.makeFalse(); - } +// if (res.getType() instanceof PointerType){ +// context.getExpressionEncoder().equal(ExpressionFactory.getInstance().makeCast(res,), notExec, RIGHT_TO_LEFT); +// return bmgr.makeFalse(); +// } return bmgr.and( super.encodeExec(context), // this is a boolean formula context.getExpressionEncoder().equal(res, notExec, RIGHT_TO_LEFT) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index 40ec5276cf..a2bb7deee0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -152,8 +152,8 @@ private ProcessingManager(Configuration config) throws InvalidConfigurationExcep detectMixedSizeAccesses ? simplifyBoundedProgram : null, NonterminationDetection.fromConfig(config), // --- Statistics + verification --- - printAfterProcessing ? DebugPrint.withHeader("After processing", Printer.Mode.THREADS, config) : null, IdReassignment.newInstance(), // Normalize used Ids (remove any gaps) + printAfterProcessing ? DebugPrint.withHeader("After processing", Printer.Mode.THREADS, config) : null, ProgramProcessor.fromFunctionProcessor( CoreCodeVerification.fromConfig(config), Target.THREADS, false From 18f0160ff0076334649ddc299eb941f6804233f7 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 31 Jan 2026 17:10:20 +0100 Subject: [PATCH 079/109] asm arm pointer casts only when needed --- .../expression/ExpressionFactory.java | 34 +++++++++++ .../program/visitors/VisitorAsmArm.java | 57 ++++++++++--------- 2 files changed, 64 insertions(+), 27 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index bad5bec525..9d02eea016 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -18,6 +18,7 @@ import java.math.BigDecimal; import java.math.BigInteger; import java.util.ArrayList; +import java.util.Collections; import java.util.List; import static com.dat3m.dartagnan.expression.type.TypeFactory.isStaticTypeOf; @@ -316,10 +317,43 @@ public Expression makeFloatCast(Expression operand, FloatType targetType, boolea // ----------------------------------------------------------------------------------------------------------------- // Aggregates + public List unpackTypeHelper(Type type){ + if(type instanceof AggregateType ag){ + return ag.getFields().stream().map(TypeOffset::type).toList(); + } + if(type instanceof ArrayType ar){ + return new ArrayList<>(Collections.nCopies(ar.getNumElements(),ar.getElementType())); + } + return List.of(type); + } + public List unpackTypes(List type){ + List newResult = type.stream().map(this::unpackTypeHelper).flatMap(List::stream).toList(); + List oldResult = type; + while(!newResult.equals(oldResult)){ + // fixme way simpler using recursion! + oldResult = newResult; + newResult = type.stream().map(this::unpackTypeHelper).flatMap(List::stream).toList(); + } + return newResult; + } + public List unpackType(Type type){ + List list = List.of(type); + return unpackTypes(list); + } public Expression makeConstruct(Type type, List arguments) { return new ConstructExpr(type, arguments); } + public Expression makeCompatibilityConstruct(Type type, List arguments) { + assert ExpressionHelper.isAggregateLike(type); + List types = unpackType(type); + List newArguments = new ArrayList<>(); + assert types.size() == arguments.size(); + for (int i = 0; i < types.size(); ++i) { + newArguments.add(makeCast(arguments.get(i),types.get(i))); + } + return new ConstructExpr(type, newArguments); + } public Expression makeArray(ArrayType type, List items) { Preconditions.checkArgument(!type.hasKnownNumElements() || type.getNumElements() == items.size(), diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index 749bb9ee68..dd5b4ec49d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -13,6 +13,7 @@ import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; +import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.AsmArmBaseVisitor; import com.dat3m.dartagnan.parsers.AsmArmParser; import com.dat3m.dartagnan.parsers.program.utils.AsmUtils; @@ -111,6 +112,8 @@ private record CmpInstruction(Expression left, Expression right) {}; private Type expectedType; // map from RegisterID to the corresponding asm register private final HashMap asmRegisters = new HashMap<>(); + private final TypeFactory typeFactory = TypeFactory.getInstance(); + private final PointerType pointerType = typeFactory.getPointerType(); public VisitorAsmArm(Function llvmFunction, Register returnRegister, List llvmArguments) { this.llvmFunction = llvmFunction; @@ -136,6 +139,10 @@ public List visitAsm(AsmArmParser.AsmContext ctx) { return events; } + private Expression toPtr(Register r){ + return expressions.makeIntToPtrCast(r, pointerType); + } + // Tells if a constraint is a numeric one, e.g. '3' private boolean isConstraintNumeric(AsmArmParser.ConstraintContext constraint) { return constraint.overlapInOutRegister() != null; @@ -160,7 +167,7 @@ private boolean isConstraintInputConstraint(AsmArmParser.ConstraintContext const public Object visitLoad(AsmArmParser.LoadContext ctx) { Register register = (Register) ctx.register(0).accept(this); Register address = (Register) ctx.register(1).accept(this); - asmInstructions.add(EventFactory.newLoad(register, address)); + asmInstructions.add(EventFactory.newLoad(register, toPtr(address))); return null; } @@ -168,7 +175,7 @@ public Object visitLoad(AsmArmParser.LoadContext ctx) { public Object visitLoadAcquire(AsmArmParser.LoadAcquireContext ctx) { Register register = (Register) ctx.register(0).accept(this); Register address = (Register) ctx.register(1).accept(this); - asmInstructions.add(EventFactory.newLoadWithMo(register, address, Tag.ARMv8.MO_ACQ)); + asmInstructions.add(EventFactory.newLoadWithMo(register, toPtr(address), Tag.ARMv8.MO_ACQ)); return null; } @@ -176,7 +183,7 @@ public Object visitLoadAcquire(AsmArmParser.LoadAcquireContext ctx) { public Object visitLoadExclusive(AsmArmParser.LoadExclusiveContext ctx) { Register register = (Register) ctx.register(0).accept(this); Register address = (Register) ctx.register(1).accept(this); - asmInstructions.add(EventFactory.newRMWLoadExclusive(register, address)); + asmInstructions.add(EventFactory.newRMWLoadExclusive(register, toPtr(address))); return null; } @@ -184,7 +191,7 @@ public Object visitLoadExclusive(AsmArmParser.LoadExclusiveContext ctx) { public Object visitLoadAcquireExclusive(AsmArmParser.LoadAcquireExclusiveContext ctx) { Register register = (Register) ctx.register(0).accept(this); Register address = (Register) ctx.register(1).accept(this); - asmInstructions.add(EventFactory.newRMWLoadExclusiveWithMo(register, address, Tag.ARMv8.MO_ACQ)); + asmInstructions.add(EventFactory.newRMWLoadExclusiveWithMo(register, toPtr(address), Tag.ARMv8.MO_ACQ)); return null; } @@ -234,7 +241,7 @@ public Object visitAnd(AsmArmParser.AndContext ctx) { public Object visitStore(AsmArmParser.StoreContext ctx) { Register value = (Register) ctx.register(0).accept(this); Register address = (Register) ctx.register(1).accept(this); - asmInstructions.add(EventFactory.newStore(address, value)); + asmInstructions.add(EventFactory.newStore(toPtr(address), value)); return null; } @@ -242,7 +249,7 @@ public Object visitStore(AsmArmParser.StoreContext ctx) { public Object visitStoreRelease(AsmArmParser.StoreReleaseContext ctx) { Register value = (Register) ctx.register(0).accept(this); Register address = (Register) ctx.register(1).accept(this); - asmInstructions.add(EventFactory.newStoreWithMo(address, value, Tag.ARMv8.MO_REL)); + asmInstructions.add(EventFactory.newStoreWithMo(toPtr(address), value, Tag.ARMv8.MO_REL)); return null; } @@ -251,7 +258,7 @@ public Object visitStoreExclusive(AsmArmParser.StoreExclusiveContext ctx) { Register freshResultRegister = (Register) ctx.register(0).accept(this); Register value = (Register) ctx.register(1).accept(this); Register address = (Register) ctx.register(2).accept(this); - asmInstructions.add(EventFactory.Common.newExclusiveStore(freshResultRegister, address, value, "")); + asmInstructions.add(EventFactory.Common.newExclusiveStore(freshResultRegister, toPtr(address), value, "")); return null; } @@ -260,7 +267,7 @@ public Object visitStoreReleaseExclusive(AsmArmParser.StoreReleaseExclusiveConte Register freshResultRegister = (Register) ctx.register(0).accept(this); Register value = (Register) ctx.register(1).accept(this); Register address = (Register) ctx.register(2).accept(this); - asmInstructions.add(EventFactory.Common.newExclusiveStore(freshResultRegister, address, value, Tag.ARMv8.MO_REL)); + asmInstructions.add(EventFactory.Common.newExclusiveStore(freshResultRegister, toPtr(address), value, Tag.ARMv8.MO_REL)); return null; } @@ -277,15 +284,9 @@ public Object visitCompare(AsmArmParser.CompareContext ctx) { public Object visitCompareBranchNonZero(AsmArmParser.CompareBranchNonZeroContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); Register firstRegister = (Register) ctx.register().accept(this); - if (firstRegister.getType() instanceof PointerType){ - Expression zero = expressions.makeNullLiteral( (PointerType) firstRegister.getType()); - Expression expr = expressions.makePtrCmp(firstRegister, PtrCmpOp.NEQ, zero); - asmInstructions.add(EventFactory.newJump(expr, label)); - }else{ - Expression zero = expressions.makeZero( (IntegerType) firstRegister.getType()); - Expression expr = expressions.makeIntCmp(firstRegister, IntCmpOp.NEQ, zero); - asmInstructions.add(EventFactory.newJump(expr, label)); - } + Expression zero = expressions.makeZero( (IntegerType) firstRegister.getType()); + Expression expr = expressions.makeIntCmp(firstRegister, IntCmpOp.NEQ, zero); + asmInstructions.add(EventFactory.newJump(expr, label)); return null; } @@ -300,7 +301,7 @@ public Object visitMove(AsmArmParser.MoveContext ctx) { @Override public Object visitBranchEqual(AsmArmParser.BranchEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - Expression expr = expressions.makeIntCmpfromInts(comparator.left(), IntCmpOp.EQ, comparator.right()); + Expression expr = expressions.makeIntCmp(comparator.left(), IntCmpOp.EQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } @@ -308,8 +309,7 @@ public Object visitBranchEqual(AsmArmParser.BranchEqualContext ctx) { @Override public Object visitBranchNotEqual(AsmArmParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - // todo remove forced ptr to int - Expression expr = expressions.makeIntCmpfromInts(comparator.left(), IntCmpOp.NEQ, comparator.right()); + Expression expr = expressions.makeIntCmp(comparator.left(), IntCmpOp.NEQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } @@ -336,6 +336,7 @@ public Object visitRegister(AsmArmParser.RegisterContext ctx) { } else { // Pick up the correct type and create the new Register Type registerType = AsmUtils.getLlvmRegisterTypeGivenAsmRegisterID(this.argsRegisters,this.returnRegister,registerID); + if (registerType instanceof PointerType pt) {registerType = typeFactory.getIntegerType(pt.bitWidth);} String newRegisterName = AsmUtils.makeRegisterName(registerID); Register newRegister = this.llvmFunction.getOrNewRegister(newRegisterName, registerType);// fix this for execution state (reg is wrong state) if (AsmUtils.isPartOfReturnRegister(this.returnRegister, registerID) && AsmUtils.isReturnRegisterAggregate(this.returnRegister)) { @@ -375,7 +376,7 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx outputAssignments.add(EventFactory.newLocal(returnRegister, asmRegisters.get(0))); } else { Type aggregateType = returnRegister.getType(); - Expression finalAssignExpression = expressions.makeConstruct(aggregateType, this.pendingRegisters); + Expression finalAssignExpression = expressions.makeCompatibilityConstruct(aggregateType, this.pendingRegisters); outputAssignments.add(EventFactory.newLocal(this.returnRegister, finalAssignExpression)); } } @@ -385,11 +386,13 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx continue; } Expression llvmRegister = argsRegisters.get(i - AsmUtils.getNumASMReturnRegisters(this.returnRegister)); - inputAssignments.add(EventFactory.newLocal(asmRegister, llvmRegister)); + inputAssignments.add(EventFactory.newLocal(asmRegister, expressions.makeCast(llvmRegister, asmRegister.getType()))); } if (isConstraintNumeric(constraint)) { int constraintValue = Integer.parseInt(constraint.getText()); - inputAssignments.add(EventFactory.newLocal(asmRegisters.get(constraintValue), argsRegisters.get(i - AsmUtils.getNumASMReturnRegisters(this.returnRegister)))); + inputAssignments.add(EventFactory.newLocal(asmRegisters.get(constraintValue), + expressions.makeCast(argsRegisters.get(i - AsmUtils.getNumASMReturnRegisters(this.returnRegister)),asmRegisters.get(constraintValue).getType()) + )); } } return null; @@ -397,15 +400,15 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx @Override public Object visitValue(AsmArmParser.ValueContext ctx) { - if (expectedType instanceof IntegerType) { + if (expectedType instanceof IntegerType t ) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, (IntegerType) expectedType); + return expressions.makeValue(value, t ); } - else if (expectedType instanceof PointerType){ + if ( expectedType instanceof PointerType t) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeIntToPtrCast(expressions.makeValue(value)); + return expressions.makeValue(value, typeFactory.getIntegerType(t.bitWidth) ); } throw new RuntimeException("Unexpected type " + expectedType + " visited"); } From 54b2f5906c5159dfab05bdd1a25c790bae9f60ba Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sat, 31 Jan 2026 17:55:50 +0100 Subject: [PATCH 080/109] fixed some of "others" tests --- .../program/processing/ProcessingManager.java | 2 +- .../armv7/libvsync/AsmLibvsyncArmv7Test.java | 5 +- .../asm/armv8/ck/AsmCkArmv8Test.java | 3 +- .../others/miscellaneous/AnalysisTest.java | 55 +++++++++++-------- .../others/miscellaneous/ProcessingTest.java | 26 ++++----- 5 files changed, 52 insertions(+), 39 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index a2bb7deee0..f0345e3f9f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = true; + private boolean printAfterProcessing = false; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java index 25d3dbd845..1a9987680f 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java @@ -51,7 +51,7 @@ public static Iterable data() throws IOException { //bounded_queue {"bounded_spsc", 1, PASS}, {"bounded_mpmc_check_full", 3, PASS}, - {"bounded_mpmc_check_empty", 4, PASS}, + //{"bounded_mpmc_check_empty", 4, PASS}, //spinlocks // {"caslock", 4, PASS}, // passes Refinement but takes ~10 minutes @@ -73,7 +73,8 @@ public static Iterable data() throws IOException { {"mutex_musl", 3, PASS}, {"mutex_slim", 2, PASS}, {"mutex_waiters", 2, PASS}, - {"once", 2, PASS} + {"once", 2, PASS}, + {"bounded_mpmc_check_empty", 4, PASS} }); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java index 392d37deec..79a67fa244 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java @@ -51,12 +51,13 @@ public static Iterable data() throws IOException { {"caslock", 3, Result.PASS}, {"clhlock", 1, Result.PASS}, {"declock", 3, Result.PASS}, - {"ebr", 5, Result.PASS}, + //{"ebr", 5, Result.PASS}, {"faslock", 3, Result.PASS}, {"mcslock", 2, Result.PASS}, {"ticketlock", 1, Result.PASS}, {"spsc_queue", 1, Result.PASS}, {"stack_empty", 2, Result.UNKNOWN}, + {"ebr", 5, Result.PASS} }); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java index c9d698fe90..2712f8e7a0 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java @@ -6,6 +6,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.type.IntegerType; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.cat.ParserCat; import com.dat3m.dartagnan.parsers.program.ProgramParser; @@ -77,9 +78,9 @@ public void reachingDefinitionMustOverride() throws InvalidConfigurationExceptio private void reachingDefinitionMustOverride(ReachingDefinitionsAnalysis.Method method) throws InvalidConfigurationException { ProgramBuilder b = ProgramBuilder.forLanguage(SourceLanguage.LITMUS); b.newThread(0); - Register r0 = b.getOrNewRegister(0, "r0"); - Register r1 = b.getOrNewRegister(0, "r1"); - Register r2 = b.getOrNewRegister(0, "r2"); + Register r0 = b.getOrNewRegister(0, "r0", types.getArchType()); + Register r1 = b.getOrNewRegister(0, "r1", types.getArchType()); + Register r2 = b.getOrNewRegister(0, "r2", types.getArchType()); Label alt = b.getOrCreateLabel(0, "alt"); b.addChild(0, newJump(b.newConstant(types.getBooleanType()), alt)); Local e0 = newLocal(r0, value(1)); @@ -153,7 +154,7 @@ public void reachingDefinitionSupportsLoops() throws InvalidConfigurationExcepti Local r20 = newLocal(r2, r0); b.addChild(0, r20); // r3 = 0 - Local r30 = newLocal(r3, expressions.makeZero(types.getArchType())); + Local r30 = newLocal(r3, expressions.makeNullLiteral()); b.addChild(0, r30); // do { Label begin = b.getOrCreateLabel(0, "begin"); @@ -201,7 +202,10 @@ public void reachingDefinitionSupportsLoops() throws InvalidConfigurationExcepti b.addChild(0, skip3); // return (r0 + r1) ^ (r2 | r3) Return ret = newFunctionReturn( - expressions.makeIntXor(expressions.makeAdd(r0, r1), expressions.makeIntOr(r2, r3))); + expressions.makeIntXor(expressions.makeAdd(expressions.makeIntegerCast(r0, types.getArchType(),false), + expressions.makeIntegerCast(r1, types.getArchType(),false)), + expressions.makeIntOr(expressions.makeIntegerCast(r2, types.getArchType(),false), + expressions.makeIntegerCast(r3, types.getArchType(),false)))); b.addChild(0, ret); Program program = b.build(); @@ -258,7 +262,12 @@ public void fieldinsensitive0() throws InvalidConfigurationException { public void full0() throws InvalidConfigurationException { program0(FULL, NONE, MUST, NONE, NONE, NONE, NONE); } - + private Expression toPtr(Expression expr) { + return expressions.makePtrCast(expr, types.getPointerType()); + } + private Expression toInt(Expression expr) { + return expressions.makeIntegerCast(expr, types.getArchType(),true); + } private void program0(Alias method, Result... expect) throws InvalidConfigurationException { ProgramBuilder b = ProgramBuilder.forLanguage(SourceLanguage.LITMUS); @@ -268,7 +277,7 @@ private void program0(Alias method, Result... expect) throws InvalidConfiguratio b.newThread(0); Register r0 = b.getOrNewRegister(0, "r0"); //In C11, this is well-defined: ((uint64_t*) ((uintptr_t) x * 1)) - b.addChild(0, newLocal(r0, mult(x, 1))); + b.addChild(0, newLocal(r0, toPtr(mult(toInt(x), 1)))); Store e0 = newStore(r0); b.addChild(0, e0); Store e1 = newStore(plus(r0, 8)); @@ -356,27 +365,26 @@ public void full2() throws InvalidConfigurationException { private void program2(Alias method, Result... expect) throws InvalidConfigurationException { ProgramBuilder b = ProgramBuilder.forLanguage(SourceLanguage.LITMUS); - IntegerType type = types.getArchType(); + IntegerType itype = types.getArchType(); + PointerType ptype = types.getPointerType(); MemoryObject x = b.newMemoryObject("x", 24); b.newThread(0); - Register r0 = b.getOrNewRegister(0, "r0"); - b.addChild(0, newLocal(r0, b.newConstant(type))); + Register r0 = b.getOrNewRegister(0, "r0", itype); + b.addChild(0, newLocal(r0, b.newConstant(itype))); Label l0 = b.getOrCreateLabel(0,"l0"); b.addChild(0, newJump(expressions.makeOr( - expressions.makeGT(r0, expressions.makeOne(type), true), - expressions.makeLT(r0, expressions.makeZero(type), true)), l0)); + expressions.makeGT(r0, expressions.makeOne(itype), true), + expressions.makeLT(r0, expressions.makeZero(itype), true)), l0)); Store e0 = newStore(x); b.addChild(0, e0); Store e1 = newStore(plus(x, 8)); b.addChild(0, e1); Store e2 = newStore(plus(x, 16)); b.addChild(0, e2); - Register r1 = b.getOrNewRegister(0, "r1"); - b.addChild(0, newLocal(r1, expressions.makeZero(type))); - Store e3 = newStore(expressions.makeAdd( - expressions.makeAdd(x, mult(r0, 16)), - mult(r1, 32))); + Register r1 = b.getOrNewRegister(0, "r1", itype); + b.addChild(0, newLocal(r1, expressions.makeZero(itype))); + Store e3 = newStore(expressions.makePtrAdd(expressions.makePtrAdd(x, mult(r0, 16)), mult(r1, 32))); b.addChild(0, e3); b.addChild(0, l0); @@ -464,7 +472,7 @@ private void program4(Alias method, Result... expect) throws InvalidConfiguratio b.newThread(0); Register r0 = b.getOrNewRegister(0, "r0"); - b.addChild(0, newLocal(r0, mult(x, 0))); + b.addChild(0, newLocal(r0, expressions.makePtrCast(mult(expressions.makeIntegerCast(x, types.getArchType(),false), 0), types.getPointerType()))); b.addChild(0, newLocal(r0, y)); Store e0 = newStore(r0); b.addChild(0, e0); @@ -516,7 +524,7 @@ private void program5(Alias method, Result... expect) throws InvalidConfiguratio b.addChild(0, newLocal(r0, y)); Store e0 = newStore(r0); b.addChild(0, e0); - b.addChild(0, newLocal(r0, mult(x, 0))); + b.addChild(0, newLocal(r0, expressions.makePtrCast(mult(expressions.makeIntegerCast(x, types.getArchType(), false), 0), types.getPointerType()))); Store e1 = newStore(x); b.addChild(0, e1); Store e2 = newStore(y); @@ -593,7 +601,7 @@ public void fullPropagation1() throws InvalidConfigurationException { Load e0 = newLoad(r0, y); // reads x b.addChild(0, e0); Label l0 = newLabel("l0"); - b.addChild(0, newJump(expressions.makeEQ(r0, expressions.makePtrToIntCast(x, types.getArchType())), l0)); + b.addChild(0, newJump(expressions.makeEQ(r0, x), l0)); Load e1 = newLoad(r0, x); // reads y b.addChild(0, e1); b.addChild(0, l0); @@ -641,6 +649,9 @@ private Expression value(long v) { } private Expression plus(Expression lhs, long rhs) { + if (lhs.getType() instanceof PointerType){ + return expressions.makePtrAdd(lhs,value(rhs)); + } return expressions.makeAdd(lhs, value(rhs)); } @@ -724,7 +735,7 @@ private Event findMatchingEventAfterProcessing(Program p, Event orig) { public void allKindsOfMixedSizeAccesses() throws Exception { TypeFactory types = TypeFactory.getInstance(); ExpressionFactory expressions = ExpressionFactory.getInstance(); - IntegerType pointerType = types.getArchType(); + IntegerType archType = types.getArchType(); ProgramBuilder b = ProgramBuilder.forLanguage(Program.SourceLanguage.LITMUS); b.newThread(0); Register r8 = b.getOrNewRegister(0, "r8", types.getIntegerType(8)); @@ -741,7 +752,7 @@ public void allKindsOfMixedSizeAccesses() throws Exception { final StringBuilder exp = new StringBuilder(); for (int offset = 0; offset < 9; offset++) { final MemoryObject x = b.getOrNewMemoryObject(String.format("x%d:%d", i, offset), OBJECT_SIZE); - final Expression address = expressions.makeAdd(x, expressions.makeValue(offset, pointerType)); + final Expression address = expressions.makePtrAdd(x, expressions.makeValue(offset, archType)); b.addChild(0, newLoad(r, x)); b.addChild(0, newLoad(s, address)); if (0 < offset && offset < rBytes) { diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/ProcessingTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/ProcessingTest.java index cc58012d03..32a58556aa 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/ProcessingTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/ProcessingTest.java @@ -31,7 +31,7 @@ public void memToReg0() throws InvalidConfigurationException { final Program program = new Program(new Memory(), Program.SourceLanguage.LLVM); final Function f = new Function("f", types.getFunctionType(types.getVoidType(), List.of()), List.of(), 0, null); program.addFunction(f); - final Register r0 = f.newRegister("r0", types.getArchType()); + final Register r0 = f.newRegister("r0", types.getPointerType()); final Register r1 = f.newRegister("r1", types.getBooleanType()); final Event alloc = newAlloc(r0, types.getBooleanType(), 1); final Event storeFalse = EventFactory.newStore(r0, expressions.makeFalse()); @@ -56,8 +56,8 @@ public void memToReg1() throws InvalidConfigurationException { final Program program = new Program(new Memory(), Program.SourceLanguage.LLVM); final Function f = new Function("f", types.getFunctionType(types.getVoidType(), List.of()), List.of(), 0, null); program.addFunction(f); - final Register r0 = f.newRegister("r0", types.getArchType()); - final Register r1 = f.newRegister("r1", types.getArchType()); + final Register r0 = f.newRegister("r0", types.getPointerType()); + final Register r1 = f.newRegister("r1", types.getPointerType()); final Register r2 = f.newRegister("r2", types.getArchType()); final Register r3 = f.newRegister("r3", types.getBooleanType()); final Event allocX = newAlloc(r0, types.getBooleanType(), 2); @@ -68,8 +68,8 @@ public void memToReg1() throws InvalidConfigurationException { expressions.makeValue(1, types.getArchType()), expressions.makeValue(0, types.getArchType()))); final Event loadIndex = EventFactory.newLoad(r2, r1); - final Event storeTrue = EventFactory.newStore(expressions.makeAdd(r0, r2), expressions.makeTrue()); - final Event loadTrue = EventFactory.newLoad(r3, expressions.makeAdd(r0, r2)); + final Event storeTrue = EventFactory.newStore(expressions.makePtrAdd(r0, r2), expressions.makeTrue()); + final Event loadTrue = EventFactory.newLoad(r3, expressions.makePtrAdd(r0, r2)); final Event assertTrue = EventFactory.newAssert(r3, "assert true"); f.append(List.of(allocX, allocY, storeIndex, loadIndex, storeTrue, loadTrue, assertTrue)); final Configuration config = Configuration.builder().build(); @@ -89,8 +89,8 @@ public void memToReg2() throws InvalidConfigurationException { final Program program = new Program(new Memory(), Program.SourceLanguage.LLVM); final Function f = new Function("f", types.getFunctionType(types.getVoidType(), List.of()), List.of(), 0, null); program.addFunction(f); - final Register r0 = f.newRegister("r0", types.getArchType()); - final Register r1 = f.newRegister("r1", types.getArchType()); + final Register r0 = f.newRegister("r0", types.getPointerType()); + final Register r1 = f.newRegister("r1", types.getPointerType()); final Register r2 = f.newRegister("r2", types.getArchType()); final Register r3 = f.newRegister("r3", types.getBooleanType()); final Event allocX = newAlloc(r0, types.getBooleanType(), 2); @@ -102,8 +102,8 @@ public void memToReg2() throws InvalidConfigurationException { final Event store0 = EventFactory.newStore(r1, expressions.makeValue(0, types.getArchType())); final Event store1 = EventFactory.newStore(r1, expressions.makeValue(1, types.getArchType())); final Event loadIndex = EventFactory.newLoad(r2, r1); - final Event storeTrue = EventFactory.newStore(expressions.makeAdd(r0, r2), expressions.makeTrue()); - final Event loadTrue = EventFactory.newLoad(r3, expressions.makeAdd(r0, r2)); + final Event storeTrue = EventFactory.newStore(expressions.makePtrAdd(r0, r2), expressions.makeTrue()); + final Event loadTrue = EventFactory.newLoad(r3, expressions.makePtrAdd(r0, r2)); final Event assertTrue = EventFactory.newAssert(r3, "assert true"); f.append(List.of(allocX, allocY, jumpNondet, store0, gotoEndIf, labelThen, store1, labelEndIf, @@ -130,9 +130,9 @@ public void memToReg3() throws InvalidConfigurationException { final Program program = new Program(new Memory(), Program.SourceLanguage.LLVM); final Function f = new Function("f", types.getFunctionType(types.getVoidType(), List.of()), List.of(), 0, null); program.addFunction(f); - final Register r0 = f.newRegister("r0", types.getArchType()); - final Register r1 = f.newRegister("r1", types.getArchType()); - final Register r2 = f.newRegister("r2", types.getArchType()); + final Register r0 = f.newRegister("r0", types.getPointerType()); + final Register r1 = f.newRegister("r1", types.getPointerType()); + final Register r2 = f.newRegister("r2", types.getPointerType()); final Register r3 = f.newRegister("r3", types.getBooleanType()); final Event allocX = newAlloc(r0, types.getBooleanType(), 2); final Event allocY = newAlloc(r1, types.getArchType(), 1); @@ -141,7 +141,7 @@ public void memToReg3() throws InvalidConfigurationException { final Event jumpNondet = EventFactory.newJump(program.newConstant(types.getBooleanType()), labelThen); final Event gotoEndIf = EventFactory.newGoto(labelEndIf); final Event store0 = EventFactory.newStore(r1, r0); - final Event store1 = EventFactory.newStore(r1, expressions.makeAdd(r0, expressions.makeValue(1, types.getArchType()))); + final Event store1 = EventFactory.newStore(r1, expressions.makePtrAdd(r0, expressions.makeValue(1, types.getArchType()))); final Event loadIndex = EventFactory.newLoad(r2, r1); final Event storeTrue = EventFactory.newStore(r2, expressions.makeTrue()); final Event loadTrue = EventFactory.newLoad(r3, r2); From cb48b5ac18cb519ed82391a2bf7fb6e66b029c39 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Sun, 1 Feb 2026 14:14:54 +0100 Subject: [PATCH 081/109] others fixes. --- .../program/visitors/VisitorAsmArm.java | 2 +- .../analysis/alias/AndersenAliasAnalysis.java | 16 ++++++++++ .../alias/InclusionBasedPointerAnalysis.java | 10 ++++++ .../others/miscellaneous/AnalysisTest.java | 31 ++++++++++++------- 4 files changed, 47 insertions(+), 12 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index dd5b4ec49d..c4cf054dfd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -373,7 +373,7 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx if (!isOutputRegistersInitialized) { isOutputRegistersInitialized = true; if (i == 1) { - outputAssignments.add(EventFactory.newLocal(returnRegister, asmRegisters.get(0))); + outputAssignments.add(EventFactory.newLocal(returnRegister, expressions.makeCast(asmRegisters.get(0),returnRegister.getType()))); } else { Type aggregateType = returnRegister.getType(); Expression finalAssignExpression = expressions.makeCompatibilityConstruct(aggregateType, this.pendingRegisters); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java index 47005083ff..20dbea0620 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java @@ -3,6 +3,8 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.integers.IntBinaryExpr; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointers.NullLiteral; +import com.dat3m.dartagnan.expression.pointers.PtrAddExpr; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Register; @@ -360,6 +362,11 @@ private static final class Constant { failed = false; return; } + if (x instanceof NullLiteral) { + location = null; + failed = false; + return; + } if (x instanceof IntBinaryExpr iBin && iBin.getKind() == ADD) { Expression lhs = iBin.getLeft(); Expression rhs = iBin.getRight(); @@ -369,6 +376,15 @@ private static final class Constant { return; } } + if (x instanceof PtrAddExpr pAdd) { + Expression lhs = pAdd.getBase(); + Expression rhs = pAdd.getOffset(); + if (lhs instanceof MemoryObject mem && rhs instanceof IntLiteral ic) { + location = new Location(mem, ic.getValueAsInt()); + failed = false; + return; + } + } location = null; failed = true; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index eb54c92f41..be600893ab 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -1135,6 +1135,16 @@ private boolean matchLinearExpression(ExprFlip operand, Stack stack) { return false; } + @Override + public List visitIntToPtrCastExpression(IntToPtrCast expr) { + return expr.getOperand().accept(this); + } + @Override + public List visitPtrToIntCastExpression(PtrToIntCast expr) { + return expr.getOperand().accept(this); + } + + @Override public List visitIntSizeCastExpression(IntSizeCast expr) { // We assume type casts do not affect the value of pointers. diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java index 2712f8e7a0..6b85f7129e 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java @@ -41,6 +41,7 @@ import org.junit.Test; import org.sosy_lab.common.configuration.Configuration; import org.sosy_lab.common.configuration.InvalidConfigurationException; +import scala.Int; import java.io.File; import java.util.ArrayList; @@ -69,6 +70,15 @@ private enum Result {NONE, MAY, MUST} private static final TypeFactory types = TypeFactory.getInstance(); private static final ExpressionFactory expressions = ExpressionFactory.getInstance(); + private Expression toPtr(Expression expr) { + return expressions.makePtrCast(expr, types.getPointerType()); + } + private Expression toInt(Expression expr) { + return expressions.makeIntegerCast(expr, types.getArchType(),true); + } + + + @Test public void reachingDefinitionMustOverride() throws InvalidConfigurationException { reachingDefinitionMustOverride(ReachingDefinitionsAnalysis.Method.BACKWARD); @@ -129,8 +139,6 @@ private void reachingDefinitionMustOverride(ReachingDefinitionsAnalysis.Method m assertList(rd.getWriters(me5).ofRegister(r2).getMustWriters(), me4); } - - @Test public void reachingDefinitionSupportsLoops() throws InvalidConfigurationException { ProgramBuilder b = ProgramBuilder.forLanguage(SourceLanguage.LITMUS); @@ -262,12 +270,7 @@ public void fieldinsensitive0() throws InvalidConfigurationException { public void full0() throws InvalidConfigurationException { program0(FULL, NONE, MUST, NONE, NONE, NONE, NONE); } - private Expression toPtr(Expression expr) { - return expressions.makePtrCast(expr, types.getPointerType()); - } - private Expression toInt(Expression expr) { - return expressions.makeIntegerCast(expr, types.getArchType(),true); - } + private void program0(Alias method, Result... expect) throws InvalidConfigurationException { ProgramBuilder b = ProgramBuilder.forLanguage(SourceLanguage.LITMUS); @@ -275,7 +278,7 @@ private void program0(Alias method, Result... expect) throws InvalidConfiguratio MemoryObject y = b.newMemoryObject("y", 8); b.newThread(0); - Register r0 = b.getOrNewRegister(0, "r0"); + Register r0 = b.getOrNewRegister(0, "r0", types.getPointerType()); //In C11, this is well-defined: ((uint64_t*) ((uintptr_t) x * 1)) b.addChild(0, newLocal(r0, toPtr(mult(toInt(x), 1)))); Store e0 = newStore(r0); @@ -366,7 +369,6 @@ public void full2() throws InvalidConfigurationException { private void program2(Alias method, Result... expect) throws InvalidConfigurationException { ProgramBuilder b = ProgramBuilder.forLanguage(SourceLanguage.LITMUS); IntegerType itype = types.getArchType(); - PointerType ptype = types.getPointerType(); MemoryObject x = b.newMemoryObject("x", 24); b.newThread(0); @@ -384,7 +386,7 @@ private void program2(Alias method, Result... expect) throws InvalidConfiguratio b.addChild(0, e2); Register r1 = b.getOrNewRegister(0, "r1", itype); b.addChild(0, newLocal(r1, expressions.makeZero(itype))); - Store e3 = newStore(expressions.makePtrAdd(expressions.makePtrAdd(x, mult(r0, 16)), mult(r1, 32))); + Store e3 = newStore(add(add(x, mult(r0, 16)), mult(r1, 32))); b.addChild(0, e3); b.addChild(0, l0); @@ -647,6 +649,13 @@ private Store newStore(Expression address, Expression value) { private Expression value(long v) { return expressions.makeValue(v, types.getArchType()); } + private Expression add(Expression lhs, Expression rhs) { + assert rhs instanceof IntegerType; + if (lhs.getType() instanceof PointerType){ + return expressions.makePtrAdd(lhs,rhs); + } + return expressions.makeAdd(lhs, rhs); + } private Expression plus(Expression lhs, long rhs) { if (lhs.getType() instanceof PointerType){ From 1d89e6c63ef22be7c1c21ada3342515e55c9bb13 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 2 Feb 2026 16:00:52 +0100 Subject: [PATCH 082/109] fixed more others tests --- .../alias/FieldSensitiveAndersen.java | 33 ++++++++++++++++++- .../alias/InclusionBasedPointerAnalysis.java | 2 +- .../program/processing/MemToReg.java | 19 +++++++---- 3 files changed, 45 insertions(+), 9 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java index 4c61142bde..420e87152b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java @@ -7,6 +7,9 @@ import com.dat3m.dartagnan.expression.integers.IntSizeCast; import com.dat3m.dartagnan.expression.integers.IntUnaryExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointers.IntToPtrCast; +import com.dat3m.dartagnan.expression.pointers.PtrAddExpr; +import com.dat3m.dartagnan.expression.pointers.PtrToIntCast; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Register; @@ -389,8 +392,36 @@ public Result visitIntBinaryExpression(IntBinaryExpr x) { return null; } - // todo: add visitPtrAddExpression. + @Override + public Result visitPtrAddExpression(PtrAddExpr x) { + Result l = x.getBase().accept(this); + Result r = x.getOffset().accept(this); + if (l.address != null && r.address != null) { + return null; + } + MemoryObject base = l.address != null ? l.address : r.address; + BigInteger offset = l.offset.add(r.offset); + if (base != null) { + return new Result(base, + null, + offset, + min(min(l.alignment, l.register), min(r.alignment, r.register))); + } + if (l.register != null) { + return new Result(null, l.register, offset, min(l.alignment, min(r.alignment, r.register))); + } + return new Result(null, r.register, offset, min(l.alignment, r.alignment)); + + } + @Override + public Result visitIntToPtrCastExpression(IntToPtrCast expr) { + return expr.getOperand().accept(this); + } + @Override + public Result visitPtrToIntCastExpression(PtrToIntCast expr) { + return expr.getOperand().accept(this); + } @Override public Result visitIntUnaryExpression(IntUnaryExpr x) { Result i = x.getOperand().accept(this); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index be600893ab..5f613613af 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -1217,7 +1217,7 @@ public List visitConstructExpression(ConstructExpr construct) { // Red edges connect address variables to stored value variables. // Green-labeled nodes represent memory objects. // Red-labeled nodes are address variables that do not include any memory objects (probably a bug). - private void generateGraph() { + private void generateGraph() { final Set seen = new HashSet<>(objectVariables.values()); for (Set news = seen; !news.isEmpty();) { final var next = new HashSet(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java index fa4c55a6b2..44429c6d8e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java @@ -431,14 +431,19 @@ private AddressOffset computeAddressOffsetFromState(Expression expression) { private static RegisterOffset matchGEP(Expression expression) { long sum = 0; while (!(expression instanceof Register register)) { - if ((!(expression instanceof IntBinaryExpr bin) || - bin.getKind() != IntBinaryOp.ADD || - !(bin.getRight() instanceof IntLiteral offset)) || - !(expression.getKind() instanceof PtrAddExpr)) { - return null; + if (expression instanceof IntBinaryExpr bin && + bin.getKind() == IntBinaryOp.ADD && + bin.getRight() instanceof IntLiteral offset) { + sum += offset.getValueAsLong(); + expression = bin.getLeft(); + continue; + } + if (expression instanceof PtrAddExpr ptr && ptr.getOffset() instanceof IntLiteral offset) { + sum += offset.getValueAsLong(); + expression = ptr.getBase(); + continue; } - sum += offset.getValueAsLong(); - expression = bin.getLeft(); + return null; } return new RegisterOffset(register, sum); } From 2cb4f64c7fbeb56ad2d3625a1202355019e3df95 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 3 Feb 2026 10:17:55 +0100 Subject: [PATCH 083/109] fixed spirv others --- .../dartagnan/expression/processing/ExprSimplifier.java | 8 ++++---- .../program/event/common/SingleAccessMemoryEvent.java | 2 +- .../program/event/core/AbstractMemoryCoreEvent.java | 2 +- .../dartagnan/program/event/core/ExecutionStatus.java | 8 +++----- .../dartagnan/others/miscellaneous/AnalysisTest.java | 5 ++--- 5 files changed, 11 insertions(+), 14 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 99366b313b..508c48ab81 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -20,6 +20,8 @@ import com.google.common.collect.Iterables; import java.math.BigInteger; +import java.util.ArrayList; +import java.util.List; public class ExprSimplifier extends ExprTransformer { @@ -345,20 +347,18 @@ public Expression visitIntBinaryExpression(IntBinaryExpr expr) { return expressions.makeIntBinary(left, op, right); } + // what about (base + offset) + offset -> base + (offset + offset)? @Override public Expression visitPtrAddExpression(PtrAddExpr expr) { final Expression base = expr.getBase().accept(this); final Expression offset = expr.getOffset().accept(this); + // Optimizations for "x op constant" if (offset instanceof IntLiteral lit) { if(lit.isZero()){return base;} } - // can cause a tearing problem -// if (base instanceof NullLiteral) { -// return expressions.makeIntToPtrCast(offset); -// } return expressions.makePtrAdd(base, offset); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java index f9d07e5e0c..39c1da63c4 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java @@ -33,7 +33,7 @@ public abstract class SingleAccessMemoryEvent extends AbstractEvent implements M // The empty string means no memory order public SingleAccessMemoryEvent(Expression address, Type accessType, String mo) { Preconditions.checkNotNull(mo, "The memory ordering cannot be null"); - Preconditions.checkArgument(address.getType() instanceof PointerType); + // Preconditions.checkArgument(address.getType() instanceof PointerType); this.address = address; this.mo = mo; this.accessType = accessType; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java index bd31609488..225dc87d1f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java @@ -21,7 +21,7 @@ public abstract class AbstractMemoryCoreEvent extends AbstractEvent implements M protected Type accessType; public AbstractMemoryCoreEvent(Expression address, Type accessType) { - Preconditions.checkArgument(address.getType() instanceof PointerType); + //Preconditions.checkArgument(address.getType() instanceof PointerType); this.address = Preconditions.checkNotNull(address); this.accessType = accessType; addTags(VISIBLE, MEMORY); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java index 7f2fd79559..5dde8d95d5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/ExecutionStatus.java @@ -75,12 +75,10 @@ public BooleanFormula encodeExec(EncodingContext context) { // change the compilation of Store-Conditional to invert the value. final Expression notExec = exprEncoder.wrap(bmgr.not(context.execution(event))); var res = context.result(this); -// if (res.getType() instanceof PointerType){ -// context.getExpressionEncoder().equal(ExpressionFactory.getInstance().makeCast(res,), notExec, RIGHT_TO_LEFT); -// return bmgr.makeFalse(); -// } + + return bmgr.and( - super.encodeExec(context), // this is a boolean formula + super.encodeExec(context), context.getExpressionEncoder().equal(res, notExec, RIGHT_TO_LEFT) ); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java index 6b85f7129e..446d940f91 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java @@ -41,7 +41,6 @@ import org.junit.Test; import org.sosy_lab.common.configuration.Configuration; import org.sosy_lab.common.configuration.InvalidConfigurationException; -import scala.Int; import java.io.File; import java.util.ArrayList; @@ -526,7 +525,7 @@ private void program5(Alias method, Result... expect) throws InvalidConfiguratio b.addChild(0, newLocal(r0, y)); Store e0 = newStore(r0); b.addChild(0, e0); - b.addChild(0, newLocal(r0, expressions.makePtrCast(mult(expressions.makeIntegerCast(x, types.getArchType(), false), 0), types.getPointerType()))); + b.addChild(0, newLocal(r0, toPtr(mult(toInt(x), 0)))); Store e1 = newStore(x); b.addChild(0, e1); Store e2 = newStore(y); @@ -650,7 +649,7 @@ private Expression value(long v) { return expressions.makeValue(v, types.getArchType()); } private Expression add(Expression lhs, Expression rhs) { - assert rhs instanceof IntegerType; + assert rhs.getType() instanceof IntegerType; if (lhs.getType() instanceof PointerType){ return expressions.makePtrAdd(lhs,rhs); } From 856d15260409a5412cfaa2a7eed654e724c45153 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 3 Feb 2026 11:05:01 +0100 Subject: [PATCH 084/109] removed necessary code --- .../analysis/alias/InclusionBasedPointerAnalysis.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index 5f613613af..fff72110d8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -1025,15 +1025,12 @@ public Expression visitMemoryObject(MemoryObject object) { record ExprFlip(Expression expr, int factor) {} - // fixme is ptr value treated the same as an int value? @Override public List visitPtrAddExpression(PtrAddExpr expr) { BigInteger offset = BigInteger.ZERO; final List operands = new ArrayList<>(); final Stack stack = new Stack<>(); - if (!matchPtrAddExpression(new ExprFlip(expr, 1), stack)) { - return visitExpression(expr); - } + matchPtrAddExpression(new ExprFlip(expr, 1), stack); while (!stack.isEmpty()) { final ExprFlip operand = stack.pop(); if (matchPtrAddExpression(operand, stack)) { From 7d77fd3680c72979f15cd5fe1783af00618297f3 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 3 Feb 2026 17:04:38 +0100 Subject: [PATCH 085/109] fixed full alias analysis recursion bug --- .../alias/InclusionBasedPointerAnalysis.java | 89 ++++++++----------- 1 file changed, 37 insertions(+), 52 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index fff72110d8..610294d2b5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -1027,38 +1027,7 @@ record ExprFlip(Expression expr, int factor) {} @Override public List visitPtrAddExpression(PtrAddExpr expr) { - BigInteger offset = BigInteger.ZERO; - final List operands = new ArrayList<>(); - final Stack stack = new Stack<>(); - matchPtrAddExpression(new ExprFlip(expr, 1), stack); - while (!stack.isEmpty()) { - final ExprFlip operand = stack.pop(); - if (matchPtrAddExpression(operand, stack)) { - continue; - } - if (operand.expr instanceof IntLiteral literal) { - offset = offset.add(literal.getValue().multiply(BigInteger.valueOf(operand.factor))); - } else { - operands.add(operand); - } - } - final List result = new ArrayList<>(); - final int o = offset.intValue(); - for (int i = 0; i < operands.size(); i++) { - final ExprFlip operand = operands.get(i); - if (operand.factor != 1) { - result.addAll(visitExpression(operand.expr)); - continue; - } - List alignment = List.of(); - for (int j = 0; j < operands.size(); j++) { - alignment = j == i ? alignment : compose(alignment, operands.get(j).factor); - } - for (IncludeEdge subResult : operand.expr.accept(this)) { - addInto(result, compose(subResult, modifier(o, alignment)), false); - } - } - return result; + return visitByteExpression(expr); } private boolean matchPtrAddExpression(ExprFlip operand, Stack stack) { @@ -1074,15 +1043,43 @@ private boolean matchPtrAddExpression(ExprFlip operand, Stack stack) { @Override public List visitIntBinaryExpression(IntBinaryExpr x) { + return visitByteExpression(x); + } + + private boolean matchLinearExpression(ExprFlip operand, Stack stack) { + final Expression left = operand.expr instanceof IntBinaryExpr x ? x.getLeft() : null; + final Expression right = operand.expr instanceof IntBinaryExpr x ? x.getRight() : null; + final boolean add = operand.expr.getKind().equals(IntBinaryOp.ADD); + final boolean sub = operand.expr.getKind().equals(IntBinaryOp.SUB); + final boolean mul = operand.expr.getKind().equals(IntBinaryOp.MUL); + if (add || sub) { + stack.push(new ExprFlip(right, operand.factor * (add ? 1 : -1))); + stack.push(new ExprFlip(left, operand.factor)); + return true; + } else if (mul) { + final IntLiteral leftLiteral = left instanceof IntLiteral l ? l : null; + final IntLiteral rightLiteral = right instanceof IntLiteral l ? l : null; + if (leftLiteral != null || rightLiteral != null) { + final int factor = (leftLiteral != null ? leftLiteral : rightLiteral).getValueAsInt(); + stack.push(new ExprFlip(leftLiteral != null ? right : left, operand.factor * factor)); + return true; + } + } + return false; + } + + + public List visitByteExpression(Expression x) { + assert x instanceof IntBinaryExpr || x instanceof PtrAddExpr; BigInteger offset = BigInteger.ZERO; final List operands = new ArrayList<>(); final Stack stack = new Stack<>(); - if (!matchLinearExpression(new ExprFlip(x, 1), stack)) { + if (!matchByteExpression(new ExprFlip(x, 1), stack)) { return visitExpression(x); } while (!stack.isEmpty()) { final ExprFlip operand = stack.pop(); - if (matchLinearExpression(operand, stack)) { + if (matchByteExpression(operand, stack)) { continue; } if (operand.expr instanceof IntLiteral literal) { @@ -1110,24 +1107,12 @@ public List visitIntBinaryExpression(IntBinaryExpr x) { return result; } - private boolean matchLinearExpression(ExprFlip operand, Stack stack) { - final Expression left = operand.expr instanceof IntBinaryExpr x ? x.getLeft() : null; - final Expression right = operand.expr instanceof IntBinaryExpr x ? x.getRight() : null; - final boolean add = operand.expr.getKind().equals(IntBinaryOp.ADD); - final boolean sub = operand.expr.getKind().equals(IntBinaryOp.SUB); - final boolean mul = operand.expr.getKind().equals(IntBinaryOp.MUL); - if (add || sub) { - stack.push(new ExprFlip(right, operand.factor * (add ? 1 : -1))); - stack.push(new ExprFlip(left, operand.factor)); - return true; - } else if (mul) { - final IntLiteral leftLiteral = left instanceof IntLiteral l ? l : null; - final IntLiteral rightLiteral = right instanceof IntLiteral l ? l : null; - if (leftLiteral != null || rightLiteral != null) { - final int factor = (leftLiteral != null ? leftLiteral : rightLiteral).getValueAsInt(); - stack.push(new ExprFlip(leftLiteral != null ? right : left, operand.factor * factor)); - return true; - } + private boolean matchByteExpression(ExprFlip operand, Stack stack) { + if (operand.expr instanceof IntBinaryExpr ) { + return matchLinearExpression(operand, stack); + } + if (operand.expr instanceof PtrAddExpr ) { + return matchPtrAddExpression(operand, stack); } return false; } From d28e36acf21feb9110a1f6ce36996876b3c63cc0 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 3 Feb 2026 17:33:35 +0100 Subject: [PATCH 086/109] andersen changes --- .../program/analysis/alias/AndersenAliasAnalysis.java | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java index 20dbea0620..87672fa99b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java @@ -240,6 +240,9 @@ private void processRegs(Local e) { } else if (expr instanceof IntBinaryExpr iBin && iBin.getLeft() instanceof Register) { addAllAddresses(register, maxAddressSet); variables.add(register); + } else if (expr instanceof PtrAddExpr pAdd && pAdd.getBase() instanceof Register) { + addAllAddresses(register, maxAddressSet); + variables.add(register); } else if (expr instanceof MemoryObject mem) { // r = &a addAddress(register, new Location(mem, 0)); @@ -290,12 +293,12 @@ private void processResults(Local e) { addTarget(reg, new Location(mem, 0)); return; } - if (!(exp instanceof IntBinaryExpr iBin)) { + if (!(exp instanceof IntBinaryExpr|| exp instanceof PtrAddExpr)) { return; } - Expression base = iBin.getLeft(); + Expression base = exp instanceof IntBinaryExpr ? ((IntBinaryExpr)exp).getLeft(): ((PtrAddExpr)exp).getBase(); + Expression rhs = exp instanceof IntBinaryExpr ? ((IntBinaryExpr)exp).getRight(): ((PtrAddExpr)exp).getOffset(); if (base instanceof MemoryObject mem) { - Expression rhs = iBin.getRight(); if (rhs instanceof IntLiteral ic) { addTarget(reg, new Location(mem, ic.getValueAsInt())); } else { @@ -308,7 +311,6 @@ private void processResults(Local e) { } //accept register2 = register1 + constant for (Location target : targets.getOrDefault(base, Set.of())) { - Expression rhs = iBin.getRight(); if (rhs instanceof IntLiteral ic) { int o = target.offset + ic.getValueAsInt(); if (o < target.base.getKnownSize()) { From b1f95b59d426f154b8f36f0291084fcb5c51c9fe Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Wed, 4 Feb 2026 15:02:48 +0100 Subject: [PATCH 087/109] Andersen alias fix --- .../com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java index 446d940f91..150cce95ee 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java @@ -262,7 +262,7 @@ public void fieldsensitive0() throws InvalidConfigurationException { @Test public void fieldinsensitive0() throws InvalidConfigurationException { - program0(FIELD_INSENSITIVE, MAY, NONE, MAY, NONE, MAY, NONE); + program0(FIELD_INSENSITIVE, MAY, MAY, MAY, MAY, MAY, NONE); } @Test From c21cdd2dcfced0fe107688819f99cef15158c3eb Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 5 Feb 2026 10:21:35 +0100 Subject: [PATCH 088/109] General improvements --- .../dartagnan/encoding/ExpressionEncoder.java | 16 ---- .../dartagnan/encoding/PropertyEncoder.java | 4 +- .../expression/ExpressionFactory.java | 78 +++++++++++-------- .../expression/pointers/PtrCmpOp.java | 44 ++++++----- .../expression/processing/ExprSimplifier.java | 22 +----- .../program/visitors/VisitorAsmPPC.java | 3 +- .../parsers/program/visitors/VisitorLlvm.java | 14 ++-- .../analysis/alias/AndersenAliasAnalysis.java | 10 +++ .../program/processing/ProcessingManager.java | 2 +- .../processing/compilation/VisitorArm8.java | 5 +- .../processing/compilation/VisitorPower.java | 5 +- .../processing/compilation/VisitorRISCV.java | 6 +- .../others/miscellaneous/AnalysisTest.java | 2 +- 13 files changed, 107 insertions(+), 104 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 32baaa80cc..e3646158ed 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -138,11 +138,6 @@ public enum ConversionMode { public BooleanFormula equal(Expression left, Expression right, ConversionMode cMode) { final ExpressionFactory exprs = context.getExpressionFactory(); - // -------------------------------------------------------------------------------------------- - // todo: this is just for the wmm encoding. So find a better place for it. Or add ptr size cast. - // But why is there an equal(ptr8, ptr64) in lockref1 and lockref2 tests? - // Is tearing not working correctly?? - if (left.getType() instanceof PointerType && right.getType() instanceof PointerType && ((PointerType) right.getType()).getBitWidth() != ((PointerType) left.getType()).getBitWidth()) { left = exprs.makeCast(left, types.getArchType()); @@ -150,8 +145,6 @@ public BooleanFormula equal(Expression left, Expression right, ConversionMode cM return encodeBooleanFinal(exprs.makeEQ(left, right)).formula(); } - // -------------------------------------------------------------------------------------------- - switch (cMode) { case NO -> {} case LEFT_TO_RIGHT -> left = exprs.makeCast(left, right.getType()); @@ -592,7 +585,6 @@ public TypedFormula visitIntCmpExpression(IntCmpExp @Override public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { final TypedFormula address = encodeIntegerExpr(expr.getOperand()); - // todo add support for lossy casts like int64 to ptr32(is it even possible?) if (!context.useIntegers) { int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); int pbw = expr.getType().getBitWidth(); @@ -614,10 +606,6 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp final BooleanFormula result = switch (expr.getKind()) { case EQ -> imgr.equal(left.formula(), right.formula()); case NEQ -> bmgr.not(fmgr.equal(left.formula(), right.formula())); - case LT -> imgr.lessThan(left.formula(), right.formula()); - case LTE -> imgr.lessOrEquals(left.formula(), right.formula()); - case GT -> imgr.greaterThan(left.formula(), right.formula()); - case GTE -> imgr.greaterOrEquals(left.formula(), right.formula()); }; return new TypedFormula<>(types.getBooleanType(), result); }else{ @@ -638,10 +626,6 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp case 2 -> fmgr.isZeroBitVector(left); default -> throw new IllegalStateException(); }); - case LT -> bvgr.lessThan(left, right,false); - case LTE -> bvgr.lessOrEquals(left, right,false); - case GT -> bvgr.greaterThan(left, right,false); - case GTE -> bvgr.greaterOrEquals(left, right,false); }; return new TypedFormula<>(types.getBooleanType(), result); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index e9b261d601..cfe799eee3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -504,8 +504,8 @@ private BooleanFormula referencesObject(List stores, boolean isValue, Mem return bmgr.makeTrue(); } final Expression objectEnd = expressions.makePtrAdd(object, object.size()); - final Expression overLowerBound = expressions.makeLTEfromInts(object, pointer, false); - final Expression underUpperBound = expressions.makeLTfromInts(pointer, objectEnd, false); + final Expression overLowerBound = expressions.makeLTE(object, pointer, false); + final Expression underUpperBound = expressions.makeLT(pointer, objectEnd, false); final Expression withinBounds = expressions.makeAnd(overLowerBound, underUpperBound); return context.getExpressionEncoder().encodeBooleanAt(withinBounds, stores.get(0)).formula(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 9d02eea016..31f34f2e19 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -117,36 +117,50 @@ public IntLiteral makeValue(BigInteger value, IntegerType type) { } public Expression makeLT(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmpfromInts(leftOperand,IntCmpOp.ULT,rightOperand); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } public Expression makeGT(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmpfromInts(leftOperand,IntCmpOp.UGT,rightOperand); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } public Expression makeLTE(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmpfromInts(leftOperand,IntCmpOp.ULTE,rightOperand); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } public Expression makeGTE(Expression leftOperand, Expression rightOperand, boolean signed) { + if (leftOperand.getType() instanceof PointerType){ + return makeIntCmpfromInts(leftOperand,IntCmpOp.UGTE,rightOperand); + } return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } - public Expression makeLTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); - } - public Expression makeGTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); - } - public Expression makeLTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); - } +// public Expression makeLTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { +// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); +// } - public Expression makeGTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { - return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); - } +// public Expression makeGTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { +// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); +// } +// +// public Expression makeLTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { +// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); +// } +// +// public Expression makeGTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { +// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); +// } public Expression makeNeg(Expression operand) { return makeIntUnary(IntUnaryOp.MINUS, operand); @@ -550,16 +564,16 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Equality not supported on type: " + type); } - public Expression makeEQfromInts(Expression leftOperand, Expression rightOperand) { - - if (leftOperand.getType() instanceof PointerType){ - return makeEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); - } - if (rightOperand.getType() instanceof PointerType){ - return makeEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); - } - return makeEQ(leftOperand, rightOperand); - } +// public Expression makeEQfromInts(Expression leftOperand, Expression rightOperand) { +// +// if (leftOperand.getType() instanceof PointerType){ +// return makeEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); +// } +// if (rightOperand.getType() instanceof PointerType){ +// return makeEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); +// } +// return makeEQ(leftOperand, rightOperand); +// } public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { final Type type = leftOperand.getType(); @@ -578,16 +592,16 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Disequality not supported on type: " + type); } - public Expression makeNEQfromInts(Expression leftOperand, Expression rightOperand) { - - if (leftOperand.getType() instanceof PointerType){ - return makeNEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); - } - if (rightOperand.getType() instanceof PointerType){ - return makeNEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); - } - return makeNEQ(leftOperand, rightOperand); - } +// public Expression makeNEQfromInts(Expression leftOperand, Expression rightOperand) { +// +// if (leftOperand.getType() instanceof PointerType){ +// return makeNEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); +// } +// if (rightOperand.getType() instanceof PointerType){ +// return makeNEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); +// } +// return makeNEQ(leftOperand, rightOperand); +// } public Expression makeUnary(ExpressionKind op, Expression expr) { if (op instanceof BoolUnaryOp boolOp) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java index 644851e4d5..4abe421fbc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java @@ -3,7 +3,9 @@ import com.dat3m.dartagnan.expression.ExpressionKind; public enum PtrCmpOp implements ExpressionKind { - EQ, NEQ, GTE, LTE, GT, LT; + EQ, NEQ + //, GTE, LTE, GT, LT + ; @Override public String toString() { @@ -15,43 +17,43 @@ public String getSymbol() { return switch (this) { case EQ -> "=="; case NEQ -> "!="; - case GTE -> ">="; - case LTE -> "<="; - case GT -> ">"; - case LT -> "<"; +// case GTE -> ">="; +// case LTE -> "<="; +// case GT -> ">"; +// case LT -> "<"; }; } public PtrCmpOp inverted() { return switch (this) { case EQ -> NEQ; case NEQ -> EQ; - case GTE -> LT; - case LTE -> GT; - case GT -> LTE; - case LT -> GTE; +// case GTE -> LT; +// case LTE -> GT; +// case GT -> LTE; +// case LT -> GTE; }; } public PtrCmpOp reverse() { return switch (this) { case EQ, NEQ -> this; - case GTE -> LTE; - case LTE -> GTE; - case GT -> LT; - case LT -> GT; +// case GTE -> LTE; +// case LTE -> GTE; +// case GT -> LT; +// case LT -> GT; }; } public boolean isStrict() { return switch (this) { - case NEQ, LT, GT -> true; - case EQ, LTE, GTE -> false; + case NEQ -> true; + case EQ -> false; }; } - public boolean isLessCategory() { - return switch (this) { - case LT, LTE-> true; - default -> false; - }; - } +// public boolean isLessCategory() { +// return switch (this) { +// case LT, LTE-> true; +// default -> false; +// }; +// } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 508c48ab81..05281872c1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -199,17 +199,9 @@ public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { return rewrite; } - final Expression l = cmp.getLeft().accept(this); - final Expression r = cmp.getRight().accept(this); - - // Normalize "x > y" to "y < x" (and similar). - final boolean swap = switch (cmp.getKind()) { - case GTE, GT -> true; - default -> false; - }; - final PtrCmpOp op = swap ? cmp.getKind().reverse() : cmp.getKind(); - final Expression left = swap ? r : l; - final Expression right = swap ? l : r; + final Expression left = cmp.getLeft().accept(this); + final Expression right = cmp.getRight().accept(this); + final PtrCmpOp op = cmp.getKind(); // ------- Operations on same value ------- if (aggressive && left.equals(right)) { @@ -221,8 +213,6 @@ public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { final boolean cmpResult = switch (op) { case EQ -> true; case NEQ -> false; - default -> - throw new VerifyException(String.format("Unexpected comparison operator '%s'.", op)); }; return expressions.makeValue(cmpResult); } @@ -235,10 +225,6 @@ public Expression visitPtrCmpExpression(PtrCmpExpr cmp) { final Boolean cmpResult = switch (op) { case EQ -> sameObj; case NEQ -> !sameObj; - case LT-> sameObj ? false : null; - case LTE -> sameObj ? true : null; - default -> - throw new VerifyException(String.format("Unexpected comparison operator '%s'. Missing normalization?", op)); }; if (cmpResult != null) { @@ -379,7 +365,7 @@ public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { } if (sub instanceof NullLiteral) { return expressions.makeZero(expr.getType()); - } // the problem here is that + } return expressions.makePtrToIntCast(expr.getOperand(), expr.getType()); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java index 029ca53d22..c59ddb270a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java @@ -10,6 +10,7 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntCmpOp; +import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; @@ -133,7 +134,7 @@ public Object visitCompare(AsmPPCParser.CompareContext ctx) { @Override public Object visitBranchNotEqual(AsmPPCParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - Expression expr = expressions.makeIntCmpfromInts(comparator.left(), IntCmpOp.NEQ, comparator.right()); + Expression expr = expressions.makePtrCmp(comparator.left(), PtrCmpOp.NEQ, comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index ab4f4045b5..89b6ce60ef 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -586,13 +586,17 @@ public Expression visitICmpInst(ICmpInstContext ctx) { final Expression compared = switch (operator) { case "eq" -> expressions.makeEQ(left, right); case "ne" -> expressions.makeNEQ(left, right); - // todo should pointers belong to the same object to be comparable? + + + // fixme : // The two arguments must be integer, pointer ,or integer vector typed. They must also be of identical types. // llvm doc: If the operands are pointer typed, the pointer values are compared as if they were integers. - case "slt", "ult" -> expressions.makeLTfromInts(left, right, operator.startsWith("s")); - case "sle", "ule" -> expressions.makeLTEfromInts(left, right, operator.startsWith("s")); - case "sgt", "ugt" -> expressions.makeGTfromInts(left, right, operator.startsWith("s")); - case "sge", "uge" -> expressions.makeGTEfromInts(left, right, operator.startsWith("s")); + // cmp should cast directly to int if both are pointers else normal int cmp + + case "slt", "ult" -> expressions.makeLT(left, right, operator.startsWith("s")); + case "sle", "ule" -> expressions.makeLTE(left, right, operator.startsWith("s")); + case "sgt", "ugt" -> expressions.makeGT(left, right, operator.startsWith("s")); + case "sge", "uge" -> expressions.makeGTE(left, right, operator.startsWith("s")); default -> throw new ParsingException(String.format("Unknown predicate in %s.", ctx.getText())); }; // LLVM does not support a distinct boolean type. diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java index 87672fa99b..330d9285f3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java @@ -1,10 +1,13 @@ package com.dat3m.dartagnan.program.analysis.alias; import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.base.CastExpressionBase; import com.dat3m.dartagnan.expression.integers.IntBinaryExpr; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointers.IntToPtrCast; import com.dat3m.dartagnan.expression.pointers.NullLiteral; import com.dat3m.dartagnan.expression.pointers.PtrAddExpr; +import com.dat3m.dartagnan.expression.pointers.PtrToIntCast; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Register; @@ -289,6 +292,9 @@ private void algorithm() { private void processResults(Local e) { Expression exp = e.getExpr(); Register reg = e.getResultRegister(); + if (exp instanceof IntToPtrCast || exp instanceof PtrToIntCast) { + exp = ((CastExpressionBase) exp).getOperand(); + } if (exp instanceof MemoryObject mem) { addTarget(reg, new Location(mem, 0)); return; @@ -297,6 +303,10 @@ private void processResults(Local e) { return; } Expression base = exp instanceof IntBinaryExpr ? ((IntBinaryExpr)exp).getLeft(): ((PtrAddExpr)exp).getBase(); + // fixme: this is a temp solution. + if (base instanceof IntToPtrCast || base instanceof PtrToIntCast) { + base = ((CastExpressionBase) base).getOperand(); + } Expression rhs = exp instanceof IntBinaryExpr ? ((IntBinaryExpr)exp).getRight(): ((PtrAddExpr)exp).getOffset(); if (base instanceof MemoryObject mem) { if (rhs instanceof IntLiteral ic) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index f0345e3f9f..a2bb7deee0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = false; + private boolean printAfterProcessing = true; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index 507df911f6..1258bbb274 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -380,7 +381,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Label casEnd = newLabel("CAS_end"); // The real scheme uses XOR instead of comparison, but both are semantically // equivalent and XOR harms performance substantially. - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQfromInts(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makePtrCmp(dummy, PtrCmpOp.NEQ, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, e.getStoreValue(), true, ARMv8.extractStoreMoFromLKMo(mo)); @@ -535,7 +536,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeNEQfromInts(regValue, unless), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makePtrCmp(regValue, PtrCmpOp.NEQ ,unless), dummy.getType())), branchOnCauCmpResult, store, fakeCtrlDep, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java index 0236c03a76..5ed941012c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -659,7 +660,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQfromInts(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makePtrCmp(dummy,PtrCmpOp.NEQ ,e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); Store store = Power.newRMWStoreConditional(address, e.getStoreValue(), true); @@ -841,7 +842,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeNEQfromInts(regValue, unless)), + newLocal(dummy, expressions.makePtrCmp(regValue, PtrCmpOp.NEQ ,unless)), branchOnCauCmpResult, store, fakeCtrlDep, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index 82180a25cd..1c8335eac0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; +import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -396,7 +397,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQfromInts(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makePtrCmp(dummy, PtrCmpOp.NEQ,e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? Store store = RISCV.newRMWStoreConditional(address, e.getStoreValue(), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); @@ -589,10 +590,9 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Label cauEnd = newLabel("CAddU_end"); CondJump branchOnCauCmpResult = newJumpUnless(dummy, cauEnd); Event optionalMemoryBarrierAfter = mo.equals(Tag.Linux.MO_MB) ? RISCV.newRWRWFence() : mo.equals(Tag.Linux.MO_ACQUIRE) ? RISCV.newRRWFence() : null; - return eventSequence( load, - newLocal(dummy, expressions.makeNEQfromInts(regValue, unless)), + newLocal(dummy, expressions.makePtrCmp(regValue, PtrCmpOp.NEQ ,unless)), branchOnCauCmpResult, store, fakeCtrlDep, diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java index 150cce95ee..446d940f91 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/others/miscellaneous/AnalysisTest.java @@ -262,7 +262,7 @@ public void fieldsensitive0() throws InvalidConfigurationException { @Test public void fieldinsensitive0() throws InvalidConfigurationException { - program0(FIELD_INSENSITIVE, MAY, MAY, MAY, MAY, MAY, NONE); + program0(FIELD_INSENSITIVE, MAY, NONE, MAY, NONE, MAY, NONE); } @Test From 9faef04879a5a6f6e60f582e1306542658c1a4fd Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 5 Feb 2026 10:49:38 +0100 Subject: [PATCH 089/109] General improvements --- .../expression/ExpressionFactory.java | 63 ++++++++++--------- .../program/visitors/VisitorAsmPPC.java | 2 +- .../program/processing/ProcessingManager.java | 2 +- .../processing/compilation/VisitorArm8.java | 4 +- .../processing/compilation/VisitorPower.java | 4 +- .../processing/compilation/VisitorRISCV.java | 4 +- 6 files changed, 41 insertions(+), 38 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 31f34f2e19..97cc51f71e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -28,6 +28,8 @@ public final class ExpressionFactory { private static final ExpressionFactory instance = new ExpressionFactory(); private final TypeFactory types = TypeFactory.getInstance(); + private final IntegerType archType = types.getArchType(); + private final PointerType pointerType = types.getPointerType(); private final BooleanType booleanType = types.getBooleanType(); private final BoolLiteral falseConstant = new BoolLiteral(booleanType, false); private final BoolLiteral trueConstant = new BoolLiteral(booleanType, true); @@ -80,7 +82,7 @@ public Expression makeBooleanCast(Expression operand) { } else if (sourceType instanceof IntegerType intType) { return makeNEQ(operand, makeZero(intType)); }else if (sourceType instanceof PointerType) { - return makeBooleanCast(makePtrToIntCast(operand, types.getArchType())); + return makeBooleanCast(makePtrToIntCast(operand, archType)); } throw new UnsupportedOperationException(String.format("Cannot cast %s to %s.", sourceType, booleanType)); } @@ -101,7 +103,7 @@ public IntLiteral parseValue(String text, IntegerType type) { } public IntLiteral makeValue(BigInteger value) { - return new IntLiteral(types.getArchType(), value); + return new IntLiteral(archType, value); } public IntLiteral makeValue(BigInteger value, int bitwidth) { @@ -232,10 +234,10 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi public Expression makeIntCmpfromInts(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpfromInts(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); + return makeIntCmpfromInts(makePtrToIntCast(leftOperand, archType), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntCmpfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); + return makeIntCmpfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, archType)); } return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } @@ -246,10 +248,10 @@ public Expression makeIntBinary(Expression leftOperand, IntBinaryOp operator, Ex public Expression makeIntBinaryfromInts(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeIntBinaryfromInts(makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); + return makeIntBinaryfromInts(makePtrToIntCast(leftOperand, archType), operator, rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeIntBinaryfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, types.getArchType())); + return makeIntBinaryfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, archType)); } return new IntBinaryExpr(leftOperand, operator, rightOperand); } @@ -449,13 +451,13 @@ public Expression makePtrCast(Expression base, PointerType type){ }else{ // we use this because spirv has some weird casts between scoped pointers. // not the most elegant solution, maybe a dedicated ptr size/type cast? - return makeIntToPtrCast(makePtrToIntCast(base, TypeFactory.getInstance().getIntegerType(type.bitWidth)), type); + return makeIntToPtrCast(makePtrToIntCast(base, types.getIntegerType(type.bitWidth)), type); }} if (base.getType() instanceof IntegerType) { return makeIntToPtrCast(base, type); } if (base.getType() instanceof BooleanType) { - return makePtrCast(makeIntegerCast(base, types.getArchType(),false),type); + return makePtrCast(makeIntegerCast(base, archType,false),type); } throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); } @@ -471,7 +473,7 @@ public Expression makeIntToPtrCast(Expression integer, PointerType pointerType) return new IntToPtrCast(pointerType, integer); } public Expression makeIntToPtrCast(Expression operand) { - return makeIntToPtrCast(operand, types.getPointerType()); + return makeIntToPtrCast(operand,pointerType); } @@ -481,7 +483,7 @@ public Expression makeNullLiteral(PointerType pointerType) { } public Expression makeNullLiteral() { - return makeNullLiteral(types.getPointerType()); + return makeNullLiteral(pointerType); } public Expression makePtrCmp(Expression left, PtrCmpOp op, Expression right) { @@ -564,16 +566,16 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Equality not supported on type: " + type); } -// public Expression makeEQfromInts(Expression leftOperand, Expression rightOperand) { -// -// if (leftOperand.getType() instanceof PointerType){ -// return makeEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); -// } -// if (rightOperand.getType() instanceof PointerType){ -// return makeEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); -// } -// return makeEQ(leftOperand, rightOperand); -// } + public Expression makeBinaryEQ(Expression leftOperand, Expression rightOperand) { + + if (leftOperand.getType() instanceof PointerType){ + return makeBinaryEQ(makePtrToIntCast(leftOperand, archType), rightOperand); + } + if (rightOperand.getType() instanceof PointerType){ + return makeBinaryEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); + } + return makeEQ(leftOperand, rightOperand); + } public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { final Type type = leftOperand.getType(); @@ -592,16 +594,17 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Disequality not supported on type: " + type); } -// public Expression makeNEQfromInts(Expression leftOperand, Expression rightOperand) { -// -// if (leftOperand.getType() instanceof PointerType){ -// return makeNEQfromInts(makePtrToIntCast(leftOperand, types.getArchType()), rightOperand); -// } -// if (rightOperand.getType() instanceof PointerType){ -// return makeNEQfromInts(leftOperand, makePtrToIntCast(rightOperand, types.getArchType())); -// } -// return makeNEQ(leftOperand, rightOperand); -// } + + public Expression makeBinaryNEQ(Expression leftOperand, Expression rightOperand) { + //cast both operands to archtype and compare them + if (leftOperand.getType() instanceof PointerType){ + return makeBinaryNEQ(makePtrToIntCast(leftOperand, archType), rightOperand); + } + if (rightOperand.getType() instanceof PointerType){ + return makeBinaryNEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); + } + return makeNEQ(leftOperand, rightOperand); + } public Expression makeUnary(ExpressionKind op, Expression expr) { if (op instanceof BoolUnaryOp boolOp) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java index c59ddb270a..2403b7c1ae 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java @@ -134,7 +134,7 @@ public Object visitCompare(AsmPPCParser.CompareContext ctx) { @Override public Object visitBranchNotEqual(AsmPPCParser.BranchNotEqualContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); - Expression expr = expressions.makePtrCmp(comparator.left(), PtrCmpOp.NEQ, comparator.right()); + Expression expr = expressions.makeNEQ(comparator.left(), comparator.right()); asmInstructions.add(EventFactory.newJump(expr, label)); return null; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index a2bb7deee0..f0345e3f9f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -78,7 +78,7 @@ public class ProcessingManager implements ProgramProcessor { @Option(name = PRINT_PROGRAM_AFTER_PROCESSING, description = "Prints the program after all processing.", secure = true) - private boolean printAfterProcessing = true; + private boolean printAfterProcessing = false; // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index 1258bbb274..a550abad0f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -381,7 +381,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Label casEnd = newLabel("CAS_end"); // The real scheme uses XOR instead of comparison, but both are semantically // equivalent and XOR harms performance substantially. - CondJump branchOnCasCmpResult = newJump(expressions.makePtrCmp(dummy, PtrCmpOp.NEQ, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeBinaryNEQ(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, e.getStoreValue(), true, ARMv8.extractStoreMoFromLKMo(mo)); @@ -536,7 +536,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makePtrCmp(regValue, PtrCmpOp.NEQ ,unless), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeBinaryNEQ(regValue ,unless), dummy.getType())), branchOnCauCmpResult, store, fakeCtrlDep, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java index 5ed941012c..a0b8746877 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java @@ -660,7 +660,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makePtrCmp(dummy,PtrCmpOp.NEQ ,e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, expressions.makeCast(e.getExpectedValue(),dummy.getType())), casEnd); Load load = newRMWLoadExclusive(dummy, address); Store store = Power.newRMWStoreConditional(address, e.getStoreValue(), true); @@ -842,7 +842,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makePtrCmp(regValue, PtrCmpOp.NEQ ,unless)), + newLocal(dummy, expressions.makeNEQ(regValue,unless)), branchOnCauCmpResult, store, fakeCtrlDep, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index 1c8335eac0..801fe7967f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -397,7 +397,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makePtrCmp(dummy, PtrCmpOp.NEQ,e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeBinaryNEQ(dummy,e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? Store store = RISCV.newRMWStoreConditional(address, e.getStoreValue(), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); @@ -592,7 +592,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Event optionalMemoryBarrierAfter = mo.equals(Tag.Linux.MO_MB) ? RISCV.newRWRWFence() : mo.equals(Tag.Linux.MO_ACQUIRE) ? RISCV.newRRWFence() : null; return eventSequence( load, - newLocal(dummy, expressions.makePtrCmp(regValue, PtrCmpOp.NEQ ,unless)), + newLocal(dummy, expressions.makeNEQ(regValue, unless)), branchOnCauCmpResult, store, fakeCtrlDep, From db1ad9ce209ad51901f1bcb2f18b2810f92ee305 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 5 Feb 2026 10:59:21 +0100 Subject: [PATCH 090/109] General improvements --- .../expression/ExpressionFactory.java | 33 +++++-------------- .../expression/type/PointerType.java | 3 -- .../processing/compilation/VisitorArm8.java | 5 ++- .../processing/compilation/VisitorRISCV.java | 3 +- 4 files changed, 11 insertions(+), 33 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 97cc51f71e..ae4d0bf549 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -147,23 +147,6 @@ public Expression makeGTE(Expression leftOperand, Expression rightOperand, boole } - -// public Expression makeLTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { -// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); -// } - -// public Expression makeGTfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { -// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); -// } -// -// public Expression makeLTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { -// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); -// } -// -// public Expression makeGTEfromInts(Expression leftOperand, Expression rightOperand, boolean signed) { -// return makeIntCmpfromInts(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); -// } - public Expression makeNeg(Expression operand) { return makeIntUnary(IntUnaryOp.MINUS, operand); } @@ -536,7 +519,7 @@ else if (type instanceof IntegerType integerType) { } else if (type instanceof FloatType floatType) { return makeFloatCast(expression, floatType, signed); }else if (type instanceof PointerType) { - return makePtrCast(expression, (PointerType) type); // todo fix for tearing(mixed test), maybe a teared pointer tracker. + return makePtrCast(expression, (PointerType) type); } throw new UnsupportedOperationException(String.format("Cast %s into %s unsupported.", expression, type)); } @@ -566,13 +549,13 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Equality not supported on type: " + type); } - public Expression makeBinaryEQ(Expression leftOperand, Expression rightOperand) { + public Expression makeBitwiseEQ(Expression leftOperand, Expression rightOperand) { if (leftOperand.getType() instanceof PointerType){ - return makeBinaryEQ(makePtrToIntCast(leftOperand, archType), rightOperand); + return makeBitwiseEQ(makePtrToIntCast(leftOperand, archType), rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeBinaryEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); + return makeBitwiseEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); } return makeEQ(leftOperand, rightOperand); } @@ -595,13 +578,13 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { } - public Expression makeBinaryNEQ(Expression leftOperand, Expression rightOperand) { - //cast both operands to archtype and compare them + public Expression makeBitwiseNEQ(Expression leftOperand, Expression rightOperand) { + // casts both operands to archtype and compares them if (leftOperand.getType() instanceof PointerType){ - return makeBinaryNEQ(makePtrToIntCast(leftOperand, archType), rightOperand); + return makeBitwiseNEQ(makePtrToIntCast(leftOperand, archType), rightOperand); } if (rightOperand.getType() instanceof PointerType){ - return makeBinaryNEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); + return makeBitwiseNEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); } return makeNEQ(leftOperand, rightOperand); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index dd012a468d..fea493149f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -5,9 +5,6 @@ public class PointerType implements Type { public int bitWidth; - public boolean teared; - - PointerType(int bitWidth) { this.bitWidth = bitWidth; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index a550abad0f..e83348f359 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -2,7 +2,6 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; -import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -381,7 +380,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Label casEnd = newLabel("CAS_end"); // The real scheme uses XOR instead of comparison, but both are semantically // equivalent and XOR harms performance substantially. - CondJump branchOnCasCmpResult = newJump(expressions.makeBinaryNEQ(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeBitwiseNEQ(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, e.getStoreValue(), true, ARMv8.extractStoreMoFromLKMo(mo)); @@ -536,7 +535,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeBinaryNEQ(regValue ,unless), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeBitwiseNEQ(regValue ,unless), dummy.getType())), branchOnCauCmpResult, store, fakeCtrlDep, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index 801fe7967f..1cbec251fa 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -2,7 +2,6 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.Type; -import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -397,7 +396,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeBinaryNEQ(dummy,e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeBitwiseNEQ(dummy,e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? Store store = RISCV.newRMWStoreConditional(address, e.getStoreValue(), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); From 353eae9897212ffedce3722e7d61737fa3e5fdae Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 5 Feb 2026 11:21:58 +0100 Subject: [PATCH 091/109] General improvements --- .../com/dat3m/dartagnan/expression/ExpressionFactory.java | 2 +- .../dartagnan/parsers/program/visitors/VisitorAsmArm.java | 2 +- .../dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java | 2 -- .../java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java | 4 ++-- 4 files changed, 4 insertions(+), 6 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index ae4d0bf549..ead77b8da6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -316,7 +316,7 @@ public Expression makeFloatCast(Expression operand, FloatType targetType, boolea // ----------------------------------------------------------------------------------------------------------------- // Aggregates - public List unpackTypeHelper(Type type){ + private List unpackTypeHelper(Type type){ if(type instanceof AggregateType ag){ return ag.getFields().stream().map(TypeOffset::type).toList(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index c4cf054dfd..fd22a22d9c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -338,7 +338,7 @@ public Object visitRegister(AsmArmParser.RegisterContext ctx) { Type registerType = AsmUtils.getLlvmRegisterTypeGivenAsmRegisterID(this.argsRegisters,this.returnRegister,registerID); if (registerType instanceof PointerType pt) {registerType = typeFactory.getIntegerType(pt.bitWidth);} String newRegisterName = AsmUtils.makeRegisterName(registerID); - Register newRegister = this.llvmFunction.getOrNewRegister(newRegisterName, registerType);// fix this for execution state (reg is wrong state) + Register newRegister = this.llvmFunction.getOrNewRegister(newRegisterName, registerType); if (AsmUtils.isPartOfReturnRegister(this.returnRegister, registerID) && AsmUtils.isReturnRegisterAggregate(this.returnRegister)) { this.pendingRegisters.add(newRegister); } diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java index aedb79fee0..6d9aeb8da3 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv7/libvsync/AsmLibvsyncArmv7Test.java @@ -46,8 +46,6 @@ public static Iterable data() throws IOException { //bounded_queue {"bounded_spsc", 1, PASS}, {"bounded_mpmc_check_full", 3, PASS}, - //{"bounded_mpmc_check_empty", 4, PASS}, - //spinlocks // {"caslock", 4, PASS}, // passes Refinement but takes ~10 minutes {"clhlock", 3, PASS}, diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java index 9618df0b7e..ed2bb3f721 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/asm/armv8/ck/AsmCkArmv8Test.java @@ -46,13 +46,13 @@ public static Iterable data() throws IOException { {"caslock", 3, Result.PASS}, {"clhlock", 1, Result.PASS}, {"declock", 3, Result.PASS}, - //{"ebr", 5, Result.PASS}, + {"ebr", 5, Result.PASS}, {"faslock", 3, Result.PASS}, {"mcslock", 2, Result.PASS}, {"ticketlock", 1, Result.PASS}, {"spsc_queue", 1, Result.PASS}, {"stack_empty", 2, Result.UNKNOWN}, - {"ebr", 5, Result.PASS} + }); } From 90cad8d9584fe7bb4ed665df358b5764d87cf2e8 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Fri, 6 Feb 2026 13:52:26 +0100 Subject: [PATCH 092/109] Added MemoryExtend expression Avoid size casts on target type when converting over memory --- .../dartagnan/encoding/ExpressionEncoder.java | 27 +++++++++++++- .../expression/ExpressionFactory.java | 23 ++++++------ .../expression/ExpressionVisitor.java | 1 + .../expression/memory/MemoryExtend.java | 35 +++++++++++++++++++ .../processing/ExprTransformer.java | 5 +++ .../expression/type/TypeFactory.java | 8 ----- 6 files changed, 79 insertions(+), 20 deletions(-) create mode 100644 dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtend.java diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index f2cc32a3b7..4df69c9193 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -134,7 +134,7 @@ public BooleanFormula equalAt(Expression left, Event leftAt, Expression right, E public enum ConversionMode { STRICT, // No conversion, types must match exactly CAST, // Immediate cast - MEMORY_ROUND_TRIP_STRICT, // Round-trip over memory but source/target type sizes must match + MEMORY_ROUND_TRIP_STRICT, // Round-trip over memory, but source/target type sizes must match MEMORY_ROUND_TRIP_RELAXED, // Round-trip over memory, source/target can have mismatching sizes } @@ -582,11 +582,19 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { // ==================================================================================== // Memory type + private void checkMemoryCastSupport(Type type) { + if (!(type instanceof IntegerType)) { + throw new UnsupportedOperationException("Cannot cast memory to type: " + type); + } + } + @Override public TypedFormula visitToMemoryCastExpression(ToMemoryCast expr) { final TypedFormula inner = encode(expr.getOperand()); final MemoryType targetType = types.getMemoryTypeFor(expr.getSourceType()); + checkMemoryCastSupport(expr.getSourceType()); + // TODO: Do actual conversions return new TypedFormula(targetType, inner.formula()); } @@ -596,6 +604,8 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { final TypedFormula inner = encodeMemoryExpr(expr.getOperand()); final Type targetType = expr.getTargetType(); + checkMemoryCastSupport(targetType); + // TODO: Do actual conversions return new TypedFormula(targetType, inner.formula()); } @@ -637,6 +647,21 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { return new TypedFormula<>(expr.getType(), enc); } + @Override + public TypedFormula visitMemoryExtend(MemoryExtend expr) { + final Formula operand = encodeMemoryExpr(expr.getOperand()).formula(); + final Formula enc; + if (context.useIntegers) { + enc = operand; // Maybe remove sign? + } else { + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + final int extendedBits = expr.getTargetType().getBitWidth() - expr.getSourceType().getBitWidth(); + enc = bvmgr.extend((BitvectorFormula) operand, extendedBits, false); + } + return new TypedFormula<>(expr.getType(), enc); + + } + @Override public TypedFormula visitMemoryEqualExpression(MemoryEqualExpr expr) { final Formula left = expr.getLeft().accept(this).formula(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index abaf26756b..31f32149d9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -31,8 +31,8 @@ public final class ExpressionFactory { static { // This is a bit awkward, but ExpressionFactory and ExprTransformer/Simplifier have // cyclic dependencies, and so we need to ensure a specific initialization order. - // Maybe we should not use ExpressionSimplifier in this class or avoid ExpressionSimplifier - // caching a static instance of ExpressionFactory. + // Maybe we should not use ExpressionSimplifier in this class or don't let ExpressionSimplifier + // cache a static instance of ExpressionFactory. instance = new ExpressionFactory(); simplifier = new ExprSimplifier(false); } @@ -360,6 +360,7 @@ public Expression makeToMemoryCast(Expression operand) { } public Expression makeFromMemoryCast(Expression operand, Type type) { + Preconditions.checkArgument(types.getMemorySizeInBits(operand.getType()) == types.getMemorySizeInBits(type)); if (operand.getType().equals(type)) { return operand; } @@ -374,11 +375,15 @@ public Expression makeMemoryExtract(Expression operand, int lowBit, int highBit) return new MemoryExtract(operand, lowBit, highBit); } + public Expression makeMemoryExtend(Expression operand, MemoryType targetType) { + return new MemoryExtend(targetType, operand); + } + // ----------------------------------------------------------------------------------------------------------------- // Cast via a round-trip through memory: "fromMem(toMem()) to ". // If is false, the memory sizes of the source type and the target type may mismatch: - // "source type < target type": after the memory cast, a zero-extension is performed (if possible) + // "source type < target type": a zero-extension is performed before converting to the target type // "source type > target type": only the lowest bits of are used for the conversion. public Expression makeCastOverMemory(Expression expr, Type targetType, boolean strict, boolean signed) { final Type sourceType = expr.getType(); @@ -398,15 +403,10 @@ public Expression makeCastOverMemory(Expression expr, Type targetType, boolean s Expression exprMem = makeToMemoryCast(expr); if (targetSize < sourceSize) { exprMem = makeMemoryExtract(exprMem, 0, targetSize - 1); - exprMem = makeFromMemoryCast(exprMem, types.getCompatibleTypeOfMemorySize(targetType, targetSize)); - exprMem = makeCast(exprMem, targetType, signed); - } else if (targetSize == sourceSize) { - exprMem = makeFromMemoryCast(exprMem, targetType); - } else { - assert (targetSize > sourceSize); - exprMem = makeFromMemoryCast(exprMem, types.getCompatibleTypeOfMemorySize(targetType, sourceSize)); - exprMem = makeCast(exprMem, targetType, signed); + } else if (targetSize > sourceSize) { + exprMem = makeMemoryExtend(exprMem, types.getMemoryTypeFor(targetType)); } + exprMem = makeFromMemoryCast(exprMem, targetType); return exprMem.accept(simplifier); } @@ -527,4 +527,5 @@ public Expression makeCompare(Expression x, ExpressionKind cmpOp, Expression y) } throw new UnsupportedOperationException(String.format("Expression kind %s is no comparison operator.", cmpOp)); } + } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java index 5992a92aad..702a192689 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionVisitor.java @@ -75,6 +75,7 @@ public interface ExpressionVisitor { default TRet visitMemoryConcatExpression(MemoryConcat expr) { return visitExpression(expr); } default TRet visitMemoryExtractExpression(MemoryExtract expr) { return visitUnaryExpression(expr); } default TRet visitMemoryEqualExpression(MemoryEqualExpr expr) { return visitBinaryExpression(expr); } + default TRet visitMemoryExtend(MemoryExtend expr) { return visitUnaryExpression(expr); } private static UnsupportedOperationException unsupported(Expression expr, Class clazz) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtend.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtend.java new file mode 100644 index 0000000000..9ed5fb4738 --- /dev/null +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtend.java @@ -0,0 +1,35 @@ +package com.dat3m.dartagnan.expression.memory; + +import com.dat3m.dartagnan.expression.Expression; +import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.base.CastExpressionBase; +import com.dat3m.dartagnan.expression.type.MemoryType; +import com.dat3m.dartagnan.expression.utils.ExpressionHelper; +import com.google.common.base.Preconditions; + +public final class MemoryExtend extends CastExpressionBase { + + public MemoryExtend(MemoryType targetType, Expression operand) { + super(targetType, operand); + ExpressionHelper.checkExpectedType(operand, MemoryType.class); + Preconditions.checkArgument(isExtension(getSourceType(), targetType)); + } + + + public boolean isExtension() { + return isExtension(getSourceType(), getTargetType()); + } + + public boolean isNoop() { + return getSourceType().equals(getTargetType()); + } + + private static boolean isExtension(MemoryType sourceType, MemoryType targetType) { + return sourceType.getBitWidth() < targetType.getBitWidth(); + } + + @Override + public T accept(ExpressionVisitor visitor) { + return visitor.visitMemoryExtend(this); + } +} diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java index b02afcd9d9..41e89c3e9f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprTransformer.java @@ -153,6 +153,11 @@ public Expression visitMemoryEqualExpression(MemoryEqualExpr expr) { return expressions.makeEQ(expr.getLeft().accept(this), expr.getRight().accept(this)); } + @Override + public Expression visitMemoryExtend(MemoryExtend expr) { + return expressions.makeMemoryExtend(expr.getOperand().accept(this), expr.getTargetType()); + } + @Override public Expression visitLeafExpression(LeafExpression expr) { return expr; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 1b4c2b6f35..bb8633e452 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -160,14 +160,6 @@ public IntegerType getByteType() { return getIntegerType(8); } - public Type getCompatibleTypeOfMemorySize(Type type, int memSizeInBits) { - if (type instanceof IntegerType) { - return getIntegerType(memSizeInBits); - } - - throw new UnsupportedOperationException(String.format("Type %s has no compatible type of size %s", type, memSizeInBits)); - } - public int getMemorySizeInBytes(Type type) { return getMemorySizeInBytes(type, true); } From b23d2e149711d1aadf4626d35d9c974d5e5619f8 Mon Sep 17 00:00:00 2001 From: Thomas Haas Date: Fri, 6 Feb 2026 14:19:43 +0100 Subject: [PATCH 093/109] Add actual conversions between memX and bvN for N < X --- .../dartagnan/encoding/ExpressionEncoder.java | 21 +++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index 4df69c9193..f28ed01a9a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -595,8 +595,16 @@ private void checkMemoryCastSupport(Type type) { checkMemoryCastSupport(expr.getSourceType()); + Formula enc = inner.formula(); + if (inner.formula() instanceof BitvectorFormula bvform) { + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + final int innerSize = bvmgr.getLength(bvform); + if (innerSize < targetType.getBitWidth()) { + enc = bvmgr.extend(bvform, targetType.getBitWidth() - innerSize, false); + } + } // TODO: Do actual conversions - return new TypedFormula(targetType, inner.formula()); + return new TypedFormula<>(targetType, enc); } @Override @@ -606,8 +614,17 @@ private void checkMemoryCastSupport(Type type) { checkMemoryCastSupport(targetType); + Formula enc = inner.formula(); + if (!context.useIntegers && targetType instanceof IntegerType bvType) { + final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); + final int targetSize = bvType.getBitWidth(); + if (targetSize < expr.getSourceType().getBitWidth()) { + enc = bvmgr.extract((BitvectorFormula) inner.formula(), targetSize - 1, 0); + } + } + // TODO: Do actual conversions - return new TypedFormula(targetType, inner.formula()); + return new TypedFormula<>(targetType, enc); } @Override From a39a4e950d8d0fa981880d90242c48289894c34b Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Fri, 6 Feb 2026 14:26:52 +0100 Subject: [PATCH 094/109] added fixed pointer tearing --- .../expression/ExpressionFactory.java | 10 ++++--- .../expression/type/TypeFactory.java | 3 ++ .../dartagnan/program/processing/Tearing.java | 28 +++++++++++++------ 3 files changed, 28 insertions(+), 13 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index adef53db60..09599ea1b5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -129,6 +129,9 @@ public IntLiteral makeValue(long value, IntegerType type) { public IntLiteral makeValue(BigInteger value, IntegerType type) { return new IntLiteral(type, value); } + public IntLiteral makeValue(int value, int bitwidth) { + return makeValue(BigInteger.valueOf(value), bitwidth); + } public Expression makeLT(Expression leftOperand, Expression rightOperand, boolean signed) { if (leftOperand.getType() instanceof PointerType){ @@ -574,10 +577,9 @@ public Expression makeGeneralZero(Type type) { } else if (type instanceof FloatType floatType) { return makeZero(floatType); } else if (type instanceof MemoryType memoryType) { - return makeToMemoryCast(makeZero(TypeFactory.getInstance().getIntegerType(memoryType.getBitWidth()))); - } else { - } else if (type instanceof PointerType pointerType) { - return makeNullLiteral(pointerType); + return makeToMemoryCast(makeZero(types.getIntegerType(memoryType.getBitWidth()))); + } else if (type instanceof PointerType pt) { + return makeNullLiteral(pt); }else{ throw new UnsupportedOperationException("Cannot create zero of type " + type); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index b27f049956..55542e55b5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -173,6 +173,9 @@ public Type getCompatibleTypeOfMemorySize(Type type, int memSizeInBits) { if (type instanceof IntegerType) { return getIntegerType(memSizeInBits); } + if (type instanceof PointerType) { + return getPointerType(memSizeInBits); + } throw new UnsupportedOperationException(String.format("Type %s has no compatible type of size %s", type, memSizeInBits)); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index 3244ed43b7..a2e354fcf9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -34,6 +34,7 @@ import org.sosy_lab.common.configuration.Configuration; import org.sosy_lab.common.configuration.InvalidConfigurationException; +import java.math.BigDecimal; import java.util.*; import static com.google.common.base.Preconditions.checkArgument; @@ -178,9 +179,9 @@ private void tearExpressions(Program program) { private List createTransaction(Load load, List offsets) { final int bytes = checkBytes(load, offsets); final List replacement = new ArrayList<>(); - final IntegerType addressType = checkIntegerType(load.getAddress().getType(), - "Non-integer address in '%s'", load); - checkIntegerType(load.getAccessType(), "Non-integer mixed-size access in '%s'", load); + final PointerType addressType = checkPointerType(load.getAddress().getType(), + "Non-pointer address in '%s'", load); + checkType(load.getAccessType(), "Non-integer and non-pointer mixed-size access in '%s'", load); final Function function = load.getFunction(); final Register addressRegister = toRegister(load.getAddress(), function, replacement); final List smallerRegisters = new ArrayList<>(); @@ -198,8 +199,8 @@ private List createTransaction(Load load, List offsets) { } for (int i = -1; i < offsets.size(); i++) { final int start = i < 0 ? 0 : offsets.get(i); - final Expression offset = expressions.makeValue(start, addressType); - final Expression address = expressions.makeAdd(addressRegister, offset); + final Expression offset = expressions.makeValue(start, addressType.getBitWidth()); + final Expression address = expressions.makePtrAdd(addressRegister, offset); final Load byteLoad = load.getCopy(); final Register result = smallerRegisters.get(i + 1); byteLoad.setResultRegister(result); @@ -220,9 +221,9 @@ private List createTransaction(Load load, List offsets) { private List createTransaction(Store store, List offsets, Map> map, boolean bigEndian) { final int bytes = checkBytes(store, offsets); final List replacement = new ArrayList<>(); - final IntegerType addressType = checkIntegerType(store.getAddress().getType(), + final PointerType addressType = checkPointerType(store.getAddress().getType(), "Non-integer address in '%s'", store); - checkIntegerType(store.getAccessType(), "Non-integer mixed-size access in '%s'", store); + checkType(store.getAccessType(), "Non-integer mixed-size access in '%s'", store); final Function function = store.getFunction(); final Register addressRegister = toRegister(store.getAddress(), function, replacement); final Register valueRegister = toRegister(store.getMemValue(), function, replacement); @@ -239,7 +240,7 @@ private List createTransaction(Store store, List offsets, Map createTransaction(Store store, List offsets, Map Date: Fri, 6 Feb 2026 15:40:21 +0100 Subject: [PATCH 095/109] fixed trackability --- .../com/dat3m/dartagnan/encoding/ExpressionEncoder.java | 6 +++--- .../java/com/dat3m/dartagnan/encoding/PropertyEncoder.java | 6 ++++-- .../com/dat3m/dartagnan/expression/ExpressionFactory.java | 1 + .../com/dat3m/dartagnan/program/processing/Tearing.java | 1 - .../test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java | 2 +- 5 files changed, 9 insertions(+), 7 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index da6573ba58..e618054169 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -203,7 +203,7 @@ public void setEvent(Event e) { @SuppressWarnings("unchecked") public TypedFormula encodePointerExpr(Expression expression) { - checkArgument(expression.getType() instanceof PointerType); + Preconditions.checkArgument(expression.getType() instanceof PointerType); final TypedFormula typedFormula = encode(expression); assert typedFormula.type() == expression.getType(); assert typedFormula.formula() instanceof IntegerFormula || typedFormula.formula() instanceof BitvectorFormula; @@ -681,7 +681,7 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp @Override public TypedFormula visitPtrConcat(PtrConcat expr) { - checkArgument(!expr.getOperands().isEmpty()); + Preconditions.checkArgument(!expr.getOperands().isEmpty()); final List> operands = expr.getOperands().stream() .map(this::encodePointerExpr) .toList(); @@ -747,7 +747,7 @@ public TypedFormula visitInsertExpression(InsertExpr insert) { // Memory type private void checkMemoryCastSupport(Type type) { - if (!(type instanceof IntegerType)) { + if (!(type instanceof IntegerType || type instanceof PointerType)) { throw new UnsupportedOperationException("Cannot cast memory to type: " + type); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index 552e4b1da1..0d1df9519a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -1,6 +1,7 @@ package com.dat3m.dartagnan.encoding; +import com.dat3m.dartagnan.expression.type.MemoryType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.dat3m.dartagnan.configuration.Arch; @@ -482,7 +483,7 @@ private boolean mayBeFinalAddressStore(Store store, List stores) { return false; } if (!stores.stream().allMatch(o -> o.getMemValue().getType() instanceof IntegerType || - o.getMemValue().getType() instanceof PointerType)) { + o.getMemValue().getType() instanceof PointerType || o.getMemValue().getType() instanceof MemoryType)) { return false; } final TypeFactory types = TypeFactory.getInstance(); @@ -499,7 +500,8 @@ private BooleanFormula referencesObject(List stores, boolean isValue, Mem Expression pointer; if (isValue) { List memVals = stores.stream().map(Store::getMemValue).toList(); - pointer = memVals.get(0) instanceof IntegerType ?expressions.makeIntConcat(memVals): expressions.makePtrConcat(memVals); + // assert memVals.get(0) instanceof MemoryType; + pointer = expressions.makeFromMemoryCast(expressions.makeMemoryConcat(memVals),object.getType()); }else{ pointer = stores.get(0).getAddress(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index dcadb2d73d..8f7af305a2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -7,6 +7,7 @@ import com.dat3m.dartagnan.expression.memory.*; import com.dat3m.dartagnan.expression.misc.GEPExpr; import com.dat3m.dartagnan.expression.misc.ITEExpr; +import com.dat3m.dartagnan.expression.pointers.*; import com.dat3m.dartagnan.expression.processing.ExprSimplifier; import com.dat3m.dartagnan.expression.type.*; import com.dat3m.dartagnan.expression.utils.ExpressionHelper; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index a2e354fcf9..3841d5e9d3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -34,7 +34,6 @@ import org.sosy_lab.common.configuration.Configuration; import org.sosy_lab.common.configuration.InvalidConfigurationException; -import java.math.BigDecimal; import java.util.*; import static com.google.common.base.Preconditions.checkArgument; diff --git a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java index 09ce0ff5f2..c02bf66299 100644 --- a/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java +++ b/dartagnan/src/test/java/com/dat3m/dartagnan/llvm/AbstractCTest.java @@ -50,7 +50,7 @@ protected final Configuration getBaseConfiguration() throws InvalidConfiguration } protected ConfigurationBuilder additionalConfig(ConfigurationBuilder builder) { - return builder.setOption(OptionNames.USE_INTEGERS, "true"); + return builder.setOption(OptionNames.USE_INTEGERS, "false"); } protected Provider getProgramPathProvider() { From ec21d9e15359273892a36e15a4726e1ac8f0d499 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 9 Feb 2026 14:43:08 +0100 Subject: [PATCH 096/109] removed redundant code --- .../expression/ExpressionFactory.java | 48 ++++++++----------- 1 file changed, 20 insertions(+), 28 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 8f7af305a2..32cff22f3e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -16,12 +16,11 @@ import com.dat3m.dartagnan.program.memory.ScopedPointerVariable; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; +import java.util.Stack; import java.math.BigDecimal; import java.math.BigInteger; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import java.util.*; import static com.dat3m.dartagnan.expression.type.TypeFactory.isStaticTypeOf; @@ -330,36 +329,29 @@ public Expression makeFloatCast(Expression operand, FloatType targetType, boolea // ----------------------------------------------------------------------------------------------------------------- // Aggregates - private List unpackTypeHelper(Type type){ - if(type instanceof AggregateType ag){ - return ag.getFields().stream().map(TypeOffset::type).toList(); - } - if(type instanceof ArrayType ar){ - return new ArrayList<>(Collections.nCopies(ar.getNumElements(),ar.getElementType())); - } - return List.of(type); - } - public List unpackTypes(List type){ - List newResult = type.stream().map(this::unpackTypeHelper).flatMap(List::stream).toList(); - List oldResult = type; - while(!newResult.equals(oldResult)){ - // fixme way simpler using recursion! - oldResult = newResult; - newResult = type.stream().map(this::unpackTypeHelper).flatMap(List::stream).toList(); - } - return newResult; - } - public List unpackType(Type type){ - List list = List.of(type); - return unpackTypes(list); - } - public Expression makeConstruct(Type type, List arguments) { return new ConstructExpr(type, arguments); } public Expression makeCompatibilityConstruct(Type type, List arguments) { assert ExpressionHelper.isAggregateLike(type); - List types = unpackType(type); + List types = new ArrayList<>(); + Stack stack = new Stack<>(); + stack.push(type); + while (!stack.isEmpty()) { + Type t = stack.pop(); + if (t instanceof AggregateType ag) { + for (TypeOffset f : ag.getFields()) { + stack.push(f.type()); + } + } else if (t instanceof ArrayType ar) { + for (int i = 0; i < ar.getNumElements(); i++) { + stack.push(ar.getElementType()); + } + } else { + types.add(t); + } + } + Collections.reverse(types); List newArguments = new ArrayList<>(); assert types.size() == arguments.size(); for (int i = 0; i < types.size(); ++i) { From d4d82f4ab47663bd5c5acb2acd967b07822acf81 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 9 Feb 2026 15:28:16 +0100 Subject: [PATCH 097/109] removed forced int ops from riscv --- .../dat3m/dartagnan/encoding/ExpressionEncoder.java | 3 +-- .../parsers/program/visitors/VisitorLitmusPPC.java | 2 +- .../program/processing/compilation/VisitorRISCV.java | 12 ++++++------ 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index e618054169..b622c82f5b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -591,8 +591,7 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final BitvectorFormula innerBv = (BitvectorFormula) inner.formula(); final int targetBitWidth = expr.getTargetType().getBitWidth(); final int sourceBitWidth = expr.getSourceType().getBitWidth(); - final int concreteBitwidth = bvmgr.getLength(innerBv); // only for debugging remove later - assert (sourceBitWidth == concreteBitwidth); + assert (sourceBitWidth == bvmgr.getLength(innerBv)); if (expr.sameWidth()) { enc = innerBv;} else{ enc = expr.isExtension() diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java index e73114b282..a4d4646c46 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java @@ -197,7 +197,7 @@ public Object visitBranchCond(LitmusPPCParser.BranchCondContext ctx) { Expression expr = cmp == null ? // In PPC, when there is no previous comparison instruction, // the value of r0 is used as the branching condition - expressions.makeBooleanCast(programBuilder.getOrNewRegister(mainThread, "r0")) : + expressions.makeBooleanCast(programBuilder.getOrNewRegister(mainThread, "r0",archType)) : expressions.makeIntCmp(cmp.left, ctx.cond().op, cmp.right); return programBuilder.addChild(mainThread, EventFactory.newJump(expr, label)); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index 1cbec251fa..4bf5fbd84c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -103,7 +103,7 @@ public List visitLlvmRMW(LlvmRMW e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(type); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, Tag.RISCV.extractLoadMoFromCMo(mo)); Store store = RISCV.newRMWStoreConditional(address, dummyReg, Tag.RISCV.extractStoreMoFromCMo(mo), true); @@ -226,7 +226,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(type); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, Tag.RISCV.extractLoadMoFromCMo(mo)); Store store = RISCV.newRMWStoreConditional(address, dummyReg, Tag.RISCV.extractStoreMoFromCMo(mo), true); @@ -463,7 +463,7 @@ public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { Register dummy = e.getFunction().newRegister(type); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); - Expression storeValue = expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()); + Expression storeValue = expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()); String moLoad = mo.equals(Tag.Linux.MO_MB) || mo.equals(Tag.Linux.MO_ACQUIRE) ? Tag.RISCV.MO_ACQ : ""; Load load = newRMWLoadExclusiveWithMo(dummy, address, moLoad); String moStore = mo.equals(Tag.Linux.MO_MB) || mo.equals(Tag.Linux.MO_RELEASE) ? Tag.RISCV.MO_ACQ_REL : ""; @@ -499,7 +499,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? - Store store = RISCV.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()), + Store store = RISCV.newRMWStoreConditional(address, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); ExecutionStatus status = newExecutionStatusWithDependencyTracking(statusReg, store); Label label = newLabel("FakeDep"); @@ -545,7 +545,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())), + newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())), store, status, newLocal(resultRegister, dummy), @@ -617,7 +617,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? - Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())); + Local localOp = newLocal(dummy,expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); Store store = newRMWStoreExclusiveWithMo(address, dummy, true, mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : ""); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); From 3c3cb5d398a005579b0caf7df99ea86acdc547e2 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 9 Feb 2026 15:33:14 +0100 Subject: [PATCH 098/109] removed forced int ops from tso and c11 --- .../program/processing/compilation/VisitorC11.java | 2 +- .../program/processing/compilation/VisitorTso.java | 9 +-------- 2 files changed, 2 insertions(+), 9 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java index 7c94ad2435..f49a8a83b0 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorC11.java @@ -83,7 +83,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadWithMo(resultRegister, address, Tag.C11.loadMO(mo)); - Expression temp = expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()); + Expression temp = expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand()); Local localOp = newLocal(dummyReg, dummyReg.getType() instanceof IntegerType ? temp : expressions.makeIntToPtrCast(temp)); RMWStore store = newRMWStoreWithMo(load, address, dummyReg, Tag.C11.storeMO(mo)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java index 06c307e78a..80b4d45f23 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorTso.java @@ -163,18 +163,11 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Expression address = e.getAddress(); Load load = newRMWLoad(resultRegister, address); -// return tagList(eventSequence( -// load, -// newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())), -// newRMWStore(load, address, dummyReg) -// )); return tagList(eventSequence( load, - newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister,e.getOperator(),e.getOperand()),dummyReg.getType())), + newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())), newRMWStore(load, address, dummyReg) )); - - } @Override From 1243809c52be7a9b5ca92452602031bcaa5a1d34 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 9 Feb 2026 16:17:15 +0100 Subject: [PATCH 099/109] removed forced int binary op --- .../dat3m/dartagnan/expression/ExpressionFactory.java | 10 ---------- .../program/processing/compilation/VisitorArm8.java | 10 +++++----- .../program/processing/compilation/VisitorPower.java | 8 ++++---- 3 files changed, 9 insertions(+), 19 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 32cff22f3e..053f5a04ec 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -242,16 +242,6 @@ public Expression makeIntBinary(Expression leftOperand, IntBinaryOp operator, Ex return new IntBinaryExpr(leftOperand, operator, rightOperand); } - public Expression makeIntBinaryfromInts(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntBinaryfromInts(makePtrToIntCast(leftOperand, archType), operator, rightOperand); - } - if (rightOperand.getType() instanceof PointerType){ - return makeIntBinaryfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, archType)); - } - return new IntBinaryExpr(leftOperand, operator, rightOperand); - } - public Expression makeIntegerCast(Expression operand, IntegerType targetType, boolean signed) { final Type sourceType = operand.getType(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index e83348f359..f286f24c57 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -219,7 +219,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, ARMv8.extractLoadMoFromCMo(mo)); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); Store store = newRMWStoreExclusiveWithMo(address, dummyReg, true, ARMv8.extractStoreMoFromCMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(resultRegister, label); @@ -432,7 +432,7 @@ public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { Expression address = e.getAddress(); Register dummy = e.getFunction().newRegister(e.getAccessType()); - Expression storeValue = expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()),dummy.getType()); + Expression storeValue = expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()); Load load = newRMWLoadExclusive(dummy, address); Store store = newRMWStoreExclusive(address, storeValue, true); Label label = newLabel("FakeDep"); @@ -465,7 +465,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()),dummy.getType())), + newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())), store, newLocal(resultRegister, dummy), fakeCtrlDep, @@ -486,7 +486,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register dummy = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); - Store store = newRMWStoreExclusiveWithMo(address, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()), + Store store = newRMWStoreExclusiveWithMo(address, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()), true, ARMv8.extractStoreMoFromLKMo(mo)); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(dummy, label); @@ -561,7 +561,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); - Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())); + Local localOp = newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); Store store = newRMWStoreExclusiveWithMo(address, dummy, true, ARMv8.extractStoreMoFromLKMo(mo)); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java index a0b8746877..9454d6b510 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java @@ -369,7 +369,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinaryfromInts(resultRegister,e.getOperator() ,e.getOperand()),dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister,e.getOperator() ,e.getOperand())); Load load = newRMWLoadExclusive(resultRegister, address); Store store = Power.newRMWStoreConditional(address, dummyReg, true); @@ -765,7 +765,7 @@ public List visitLKMMOpReturn(LKMMOpReturn e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()),dummy.getType())), + newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())), store, newLocal(resultRegister, dummy), fakeCtrlDep, @@ -784,7 +784,7 @@ public List visitLKMMFetchOp(LKMMFetchOp e) { Register dummy = e.getFunction().newRegister(resultRegister.getType()); Load load = newRMWLoadExclusive(dummy, address); - Store store = Power.newRMWStoreConditional(address, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType()), true); + Store store = Power.newRMWStoreConditional(address, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand()), true); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(dummy, label); @@ -868,7 +868,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusive(dummy, address); - Local localOp = newLocal(dummy, expressions.makeCast(expressions.makeIntBinaryfromInts(dummy, e.getOperator(), e.getOperand()), dummy.getType())); + Local localOp = newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); Store store = Power.newRMWStoreConditional(address, dummy, true); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); From 8669fb2d183e482605510094bdce9a96f47c7b74 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 9 Feb 2026 16:39:57 +0100 Subject: [PATCH 100/109] removed redundant functions and casts --- .../dat3m/dartagnan/expression/ExpressionFactory.java | 1 - .../parsers/program/utils/ProgramBuilder.java | 10 ---------- .../parsers/program/visitors/VisitorLitmusC.java | 2 +- .../dat3m/dartagnan/program/processing/Intrinsics.java | 6 ++---- 4 files changed, 3 insertions(+), 16 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 053f5a04ec..d318f695a1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -441,7 +441,6 @@ public Expression makePtrCast(Expression base, PointerType type){ } - public Expression makePtrToIntCast(Expression pointer, IntegerType type) { return new PtrToIntCast(type, pointer); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java index 58fde7ab3f..95cd4d937e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java @@ -134,16 +134,6 @@ public void setAssertFilter(Expression ass) { program.setFilterSpecification(ass); } - public Expression makeIntCmpWithIntOutput(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpWithIntOutput(expressions.makePtrToIntCast(leftOperand, types.getArchType()), operator, rightOperand); - } - if (rightOperand.getType() instanceof PointerType){ - return makeIntCmpWithIntOutput(leftOperand, operator, expressions.makePtrToIntCast(rightOperand, types.getArchType())); - } - return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); - } - // ---------------------------------------------------------------------------------------------------------------- // Threads and Functions diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 822f449a18..f5909de0c2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -465,7 +465,7 @@ public Expression visitReOpCompare(LitmusCParser.ReOpCompareContext ctx){ Register register = getOptionalReturnRegister(); Expression v1 = (Expression)ctx.re(0).accept(this); Expression v2 = (Expression)ctx.re(1).accept(this); - Expression result = programBuilder.makeIntCmpWithIntOutput(v1, ctx.opCompare().op, v2); + Expression result = expressions.makeIntCmp(v1, ctx.opCompare().op, v2); return assignToReturnRegister(register, result); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index af09057f32..2118eafe24 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -1677,10 +1677,8 @@ private List inlineMemCpyS(FunctionCall call) { final Expression countGtdestszExpr = expressions.makeGT(castCountExpr, castDestszExpr, false); final Expression invalidCount = expressions.makeOr(countGtMax, countGtdestszExpr); final Expression overlap = expressions.makeAnd( - expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(src, castCountExpr),archType), - expressions.makePtrToIntCast(dest, archType), false), - expressions.makeGT(expressions.makePtrToIntCast(expressions.makePtrAdd(dest, castCountExpr), archType), - expressions.makePtrToIntCast(src,archType), false)); + expressions.makeGT(expressions.makePtrAdd(src, castCountExpr), dest, false), + expressions.makeGT(expressions.makePtrAdd(dest, castCountExpr), src, false)); final List replacement = new ArrayList<>(); From 876996b101944394c40702a6399e953d6cc49505 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Mon, 9 Feb 2026 17:15:31 +0100 Subject: [PATCH 101/109] Reformat of modified files --- .../java/com/dat3m/dartagnan/Dartagnan.java | 48 ++--- .../com/dat3m/dartagnan/GlobalSettings.java | 5 +- .../dartagnan/encoding/EncodingContext.java | 14 +- .../dartagnan/encoding/ExpressionEncoder.java | 29 +-- .../encoding/NonTerminationEncoder.java | 36 +++- .../dartagnan/encoding/ProgramEncoder.java | 17 +- .../dartagnan/encoding/PropertyEncoder.java | 43 ++-- .../dartagnan/encoding/SymmetryEncoder.java | 2 +- .../dartagnan/encoding/TypedFormula.java | 2 +- .../expression/ExpressionFactory.java | 92 ++++---- .../expression/floats/FloatBinaryExpr.java | 4 +- .../expression/memory/MemoryConcat.java | 2 +- .../expression/memory/MemoryExtract.java | 10 +- .../expression/pointers/PtrAddExpr.java | 10 +- .../expression/pointers/PtrCmpOp.java | 3 + .../expression/pointers/PtrConcat.java | 2 +- .../expression/pointers/PtrExtract.java | 12 +- .../expression/processing/ExprSimplifier.java | 20 +- .../expression/type/PointerType.java | 2 +- .../expression/type/TypeFactory.java | 16 +- .../expression/utils/ExpressionHelper.java | 3 +- .../dartagnan/parsers/cat/VisitorCat.java | 10 +- .../parsers/program/ProgramParser.java | 4 +- .../parsers/program/utils/AsmUtils.java | 2 +- .../parsers/program/utils/Compilation.java | 4 +- .../parsers/program/utils/ProgramBuilder.java | 32 +-- .../program/visitors/VisitorAsmArm.java | 58 +++-- .../program/visitors/VisitorAsmPPC.java | 31 ++- .../program/visitors/VisitorAsmRISCV.java | 43 ++-- .../visitors/VisitorLitmusAArch64.java | 19 +- .../program/visitors/VisitorLitmusC.java | 204 +++++++++--------- .../program/visitors/VisitorLitmusPPC.java | 21 +- .../program/visitors/VisitorLitmusPTX.java | 4 +- .../program/visitors/VisitorLitmusRISCV.java | 162 +++++++------- .../program/visitors/VisitorLitmusVulkan.java | 2 +- .../program/visitors/VisitorLitmusX86.java | 8 +- .../parsers/program/visitors/VisitorLlvm.java | 119 ++++++---- .../visitors/spirv/VisitorOpsConversion.java | 2 +- .../parsers/witness/ParserWitness.java | 20 +- .../program/analysis/Dependency.java | 4 +- .../analysis/SyntacticContextAnalysis.java | 2 +- .../program/analysis/alias/AliasAnalysis.java | 2 +- .../analysis/alias/AndersenAliasAnalysis.java | 17 +- .../alias/FieldSensitiveAndersen.java | 19 +- .../alias/InclusionBasedPointerAnalysis.java | 50 +++-- .../dartagnan/program/event/EventFactory.java | 20 +- .../event/common/SingleAccessMemoryEvent.java | 18 +- .../event/core/AbstractMemoryCoreEvent.java | 20 +- .../dartagnan/program/event/core/Alloc.java | 51 ++++- .../program/memory/MemoryObject.java | 88 ++++++-- .../processing/DynamicSpinLoopDetection.java | 11 +- .../program/processing/GEPToAddition.java | 5 +- .../program/processing/Inlining.java | 23 +- .../program/processing/Intrinsics.java | 70 +++--- .../processing/LogThreadStatistics.java | 9 +- .../program/processing/LoopUnrolling.java | 6 +- .../program/processing/MemToReg.java | 11 +- .../processing/NaiveDevirtualisation.java | 4 +- .../processing/NonterminationDetection.java | 5 +- .../program/processing/ProcessingManager.java | 2 +- .../processing/RemoveDeadFunctions.java | 11 +- .../processing/RemoveDeadNullChecks.java | 12 +- .../program/processing/SymmetryReduction.java | 3 +- .../dartagnan/program/processing/Tearing.java | 3 +- .../program/processing/ThreadCreation.java | 40 ++-- .../processing/compilation/Compilation.java | 5 +- .../processing/compilation/VisitorArm8.java | 14 +- .../processing/compilation/VisitorPower.java | 20 +- .../processing/compilation/VisitorRISCV.java | 18 +- .../transformers/MemoryTransformer.java | 22 +- .../dartagnan/utils/printer/Printer.java | 2 +- .../verification/solving/ModelChecker.java | 6 +- .../solving/RefinementSolver.java | 76 ++++--- .../witness/graphml/WitnessBuilder.java | 6 +- .../graphviz/ExecutionGraphVisualizer.java | 76 ++++--- .../java/com/dat3m/dartagnan/wmm/Wmm.java | 8 +- .../wmm/analysis/NativeRelationAnalysis.java | 2 +- .../dat3m/dartagnan/wmm/axiom/Acyclicity.java | 18 +- .../processing/MergeEquivalentRelations.java | 2 +- .../com/dat3m/dartagnan/wmm/utils/Cut.java | 14 +- 80 files changed, 1130 insertions(+), 782 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java index b21583112f..c41330c519 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/Dartagnan.java @@ -144,7 +144,7 @@ public static void main(String[] args) throws Exception { final Program p = new ProgramParser().parse(f); if (o.overrideEntryFunction()) { p.setEntrypoint(new Entrypoint.Simple(p.getFunctionByName(o.getEntryFunction()).orElseThrow( - () -> new MalformedProgramException(String.format("Program has no function named %s. Select a different entry point.", o.getEntryFunction()))))); + () -> new MalformedProgramException(String.format("Program has no function named %s. Select a different entry point.", o.getEntryFunction()))))); } final Wmm mcm = new ParserCat(Path.of(o.getCatIncludePath())).parse(fileModel); final VerificationTaskBuilder builder = VerificationTask.builder() @@ -204,19 +204,19 @@ public static void main(String[] args) throws Exception { private static List getProgramFilesFromArgs(String[] args) { final List files = new ArrayList<>(); Stream.of(args) - .map(File::new) - .forEach(file -> { - if (file.exists()) { - final String path = file.getAbsolutePath(); - if (file.isDirectory()) { - logger.info("Programs path: {}", path); - files.addAll(getProgramFiles(path)); - } else if (file.isFile() && supportedFormats.stream().anyMatch(file.getName()::endsWith)) { - logger.info("Program path: {}", path); - files.add(file); + .map(File::new) + .forEach(file -> { + if (file.exists()) { + final String path = file.getAbsolutePath(); + if (file.isDirectory()) { + logger.info("Programs path: {}", path); + files.addAll(getProgramFiles(path)); + } else if (file.isFile() && supportedFormats.stream().anyMatch(file.getName()::endsWith)) { + logger.info("Program path: {}", path); + files.add(file); + } } - } - }); + }); if (files.isEmpty()) { throw new IllegalArgumentException("Path to input program(s) not given or format not recognized"); } @@ -227,10 +227,10 @@ private static List getProgramFiles(String dirPath) { List files = new ArrayList(); try (Stream stream = Files.walk(Paths.get(dirPath))) { files = stream.filter(Files::isRegularFile) - .filter(p -> supportedFormats.stream().anyMatch(p.toString()::endsWith)) - .map(Path::toFile) - .sorted(Comparator.comparing(File::toString)) - .toList(); + .filter(p -> supportedFormats.stream().anyMatch(p.toString()::endsWith)) + .map(Path::toFile) + .sorted(Comparator.comparing(File::toString)) + .toList(); } catch (IOException e) { logger.error("There was an I/O error when accessing path {}", dirPath); System.exit(UNKNOWN_ERROR.asInt()); @@ -246,7 +246,7 @@ public static File generateExecutionGraphFile(VerificationTask task, ModelChecke final String progName = task.getProgram().getName(); final int fileSuffixIndex = progName.lastIndexOf('.'); final String name = progName.isEmpty() ? "unnamed_program" : - (fileSuffixIndex == - 1) ? progName : progName.substring(0, fileSuffixIndex); + (fileSuffixIndex == -1) ? progName : progName.substring(0, fileSuffixIndex); final ExecutionModelNext model = modelChecker.getExecutionGraph(); // RF edges give both ordering and data flow information, thus even when the pair is in PO // we get some data flow information by observing the edge @@ -258,7 +258,7 @@ public static File generateExecutionGraphFile(VerificationTask task, ModelChecke } private static void generateWitnessIfAble(VerificationTask task, - ModelChecker modelChecker, String details) throws SolverException { + ModelChecker modelChecker, String details) throws SolverException { // ------------------ Generate Witness, if possible ------------------ final EnumSet properties = task.getProperty(); if (task.getProgram().getFormat().equals(SourceLanguage.LLVM) && modelChecker.hasModel() @@ -304,8 +304,8 @@ private static ResultSummary summaryFromResult(VerificationTask task, ModelCheck reason = ResultSummary.PROGRAM_SPEC_REASON; condition = getSpecificationString(p); List violations = p.getThreadEvents(Assert.class) - .stream().filter(model::assertionViolated) - .toList(); + .stream().filter(model::assertionViolated) + .toList(); for (Assert ass : violations) { appendTo(details, ass, synContext); } @@ -400,7 +400,7 @@ private static void appendTo(StringBuilder details, Event event, SyntacticContex } private static void increaseBoundAndDump(List boundEvents, Configuration config) throws IOException { - if(!config.hasProperty(BOUNDS_SAVE_PATH)) { + if (!config.hasProperty(BOUNDS_SAVE_PATH)) { return; } final File boundsFile = new File(config.getProperty(BOUNDS_SAVE_PATH)); @@ -440,8 +440,8 @@ private static void increaseBoundAndDump(List boundEvents, Configuration private static void printWarningIfThreadStartFailed(Program p, IREvaluator model) { p.getThreads().stream().filter(t -> t.getEntry().isSpawned() - && model.isExecuted(t.getEntry().getCreator()) - && !model.threadHasStarted(t) + && model.isExecuted(t.getEntry().getCreator()) + && !model.threadHasStarted(t) ).forEach(t -> System.out.printf( "[WARNING] The call to pthread_create of thread %s failed. To force thread creation to succeed use --%s=true%n", t, OptionNames.THREAD_CREATE_ALWAYS_SUCCEEDS diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/GlobalSettings.java b/dartagnan/src/main/java/com/dat3m/dartagnan/GlobalSettings.java index c110825ca5..622a855d8e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/GlobalSettings.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/GlobalSettings.java @@ -1,9 +1,9 @@ package com.dat3m.dartagnan; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; + import java.io.IOException; import java.nio.file.Files; import java.nio.file.Paths; @@ -12,7 +12,8 @@ public class GlobalSettings { private static final Logger logger = LoggerFactory.getLogger(GlobalSettings.class); - private GlobalSettings() {} + private GlobalSettings() { + } private static final boolean USE_TEST_PATH = isJUnitTest(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java index fc7538a722..a45471ed35 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/EncodingContext.java @@ -57,7 +57,7 @@ public final class EncodingContext { private final ExpressionFactory exprs = ExpressionFactory.getInstance(); @Option( - name=IDL_TO_SAT, + name = IDL_TO_SAT, description = "Use SAT-based encoding for totality and acyclicity.", secure = true) boolean useSATEncoding = false; @@ -132,9 +132,13 @@ public BooleanFormulaManager getBooleanFormulaManager() { return booleanFormulaManager; } - public ExpressionEncoder getExpressionEncoder() { return exprEncoder; } + public ExpressionEncoder getExpressionEncoder() { + return exprEncoder; + } - public ExpressionFactory getExpressionFactory() { return exprs; } + public ExpressionFactory getExpressionFactory() { + return exprs; + } // ==================================================================================== // Control flow @@ -201,7 +205,9 @@ public BooleanFormula assignValue(MemoryCoreEvent left, MemoryCoreEvent right) { return addresses.get(event); } - public TypedFormula address(MemoryObject memoryObject) { return objAddress.get(memoryObject); } + public TypedFormula address(MemoryObject memoryObject) { + return objAddress.get(memoryObject); + } // NOTE: This formula represents the size of successfully allocated memory objects. // For non-allocated memory objects, the size may be any non-negative value. diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java index b622c82f5b..cf1bd9517b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ExpressionEncoder.java @@ -93,7 +93,7 @@ public TypedFormula encodeBooleanFinal(Expression e variable = context.useIntegers ? integerFormulaManager().makeVariable(name) : bitvectorFormulaManager().makeVariable(integerType.getBitWidth(), name); - }else if (type instanceof PointerType pointerType) { + } else if (type instanceof PointerType pointerType) { variable = context.useIntegers ? integerFormulaManager().makeVariable(name) : bitvectorFormulaManager().makeVariable(pointerType.getBitWidth(), name); @@ -175,7 +175,6 @@ public BooleanFormula assignEqualAt(Expression left, Event leftAt, Expression ri } - // ==================================================================================== // Private implementation @@ -184,6 +183,7 @@ public BooleanFormula assignEqualAt(Expression left, Event leftAt, Expression ri private class Visitor implements ExpressionVisitor> { private Event event; + public void setEvent(Event e) { this.event = e; } @@ -584,7 +584,9 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final BigInteger highValue = BigInteger.TWO.pow(expr.getType().getBitWidth()); final IntegerFormulaManager imgr = integerFormulaManager(); enc = imgr.modulo((IntegerFormula) inner.formula(), imgr.makeNumber(highValue)); - }else{ enc = inner.formula(); } + } else { + enc = inner.formula(); + } } else { assert inner.formula() instanceof BitvectorFormula; final BitvectorFormulaManager bvmgr = bitvectorFormulaManager(); @@ -592,8 +594,9 @@ public TypedFormula visitIntCmpExpression(IntCmpExp final int targetBitWidth = expr.getTargetType().getBitWidth(); final int sourceBitWidth = expr.getSourceType().getBitWidth(); assert (sourceBitWidth == bvmgr.getLength(innerBv)); - if (expr.sameWidth()) { enc = innerBv;} - else{ + if (expr.sameWidth()) { + enc = innerBv; + } else { enc = expr.isExtension() ? bvmgr.extend(innerBv, targetBitWidth - sourceBitWidth, false) : bvmgr.extract(innerBv, targetBitWidth - 1, 0); @@ -606,11 +609,11 @@ public TypedFormula visitIntCmpExpression(IntCmpExp public TypedFormula visitIntToPtrCastExpression(IntToPtrCast expr) { final TypedFormula address = encodeIntegerExpr(expr.getOperand()); if (!context.useIntegers) { - int ibw = ((IntegerType)expr.getOperand().getType()).getBitWidth(); + int ibw = ((IntegerType) expr.getOperand().getType()).getBitWidth(); int pbw = expr.getType().getBitWidth(); - if (ibw(expr.getType(), fmgr.getBitvectorFormulaManager() - .extend(((BitvectorFormula) address.formula()), pbw - ibw,false)); + .extend(((BitvectorFormula) address.formula()), pbw - ibw, false)); } } return new TypedFormula<>(expr.getType(), address.formula()); @@ -628,10 +631,10 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp case NEQ -> bmgr.not(fmgr.equal(left.formula(), right.formula())); }; return new TypedFormula<>(types.getBooleanType(), result); - }else{ - final int nullLocation = expr.getLeft() instanceof NullLiteral ? 1 : ( expr.getRight() instanceof NullLiteral ? 2 : 0); // 0 means no nullpointer - final BitvectorFormula left = (BitvectorFormula) encodePointerExpr(expr.getLeft()).formula(); - final BitvectorFormula right = (BitvectorFormula) encodePointerExpr(expr.getRight()).formula(); + } else { + final int nullLocation = expr.getLeft() instanceof NullLiteral ? 1 : (expr.getRight() instanceof NullLiteral ? 2 : 0); // 0 means no nullpointer + final BitvectorFormula left = (BitvectorFormula) encodePointerExpr(expr.getLeft()).formula(); + final BitvectorFormula right = (BitvectorFormula) encodePointerExpr(expr.getRight()).formula(); final BitvectorFormulaManager bvgr = bitvectorFormulaManager(); final BooleanFormula result = switch (expr.getKind()) { case EQ -> switch (nullLocation) { @@ -648,8 +651,8 @@ public TypedFormula visitPtrCmpExpression(PtrCmpExp }); }; return new TypedFormula<>(types.getBooleanType(), result); - } } + } @Override public TypedFormula visitNullLiteral(NullLiteral lit) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/NonTerminationEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/NonTerminationEncoder.java index 8e8999fd7f..eb8b09bc6d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/NonTerminationEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/NonTerminationEncoder.java @@ -440,7 +440,8 @@ private BooleanFormula encodeInfixSuffixDecomposition() { totalEnc.add(bmgr.not(bmgr.and(isInSuffixVar(iter), isInInfixVar(iter)))); } - final Iteration last = iters.get(iters.size() - 1);; + final Iteration last = iters.get(iters.size() - 1); + ; final BooleanFormula loopIsNonterminating = loop.nontermCases.stream() .map(this::isNonterminating) .reduce(bmgr.makeFalse(), bmgr::or); @@ -679,7 +680,7 @@ private BooleanFormula encodeStrongSuffixExtension() { if (isPossiblySuffix(r)) { enc.add(bmgr.implication( bmgr.and(isInSuffix(r), context.edge(rf, w, r)), - isSuffixReadable((Store)w) + isSuffixReadable((Store) w) )); } }); @@ -747,8 +748,13 @@ public Loop(LoopAnalysis.LoopInfo loopInfo) { this.loopInfo = loopInfo; } - public List getIterations() { return Lists.transform(loopInfo.iterations(), iterInfo2Iter::get); } - public boolean isAlwaysTerminating() { return nontermCases.isEmpty(); } + public List getIterations() { + return Lists.transform(loopInfo.iterations(), iterInfo2Iter::get); + } + + public boolean isAlwaysTerminating() { + return nontermCases.isEmpty(); + } @Override public String toString() { @@ -765,16 +771,28 @@ public String toString() { containingFunc.getName(), containingFunc.getId()); } - public String getUniqueId() { return toString(); } - public boolean isLast() { return loopIterInfo.isLast(); } - public int getIterationNumber() { return loopIterInfo().getIterationNumber(); } + public String getUniqueId() { + return toString(); + } + + public boolean isLast() { + return loopIterInfo.isLast(); + } + + public int getIterationNumber() { + return loopIterInfo().getIterationNumber(); + } } private record NonterminationCase(CondJump nontermEvent, Iteration iteration) { - public boolean isSideEffectFree() { return nontermEvent.hasTag(Tag.SPINLOOP); } + public boolean isSideEffectFree() { + return nontermEvent.hasTag(Tag.SPINLOOP); + } - public Loop getLoop() { return iteration.loop; } + public Loop getLoop() { + return iteration.loop; + } @Override public String toString() { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java index b38fc5cde3..ba8268ab2e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/ProgramEncoder.java @@ -200,7 +200,7 @@ public BooleanFormula encodeControlFlow() { final BooleanFormulaManager bmgr = context.getBooleanFormulaManager(); final ForwardProgressEncoder progressEncoder = new ForwardProgressEncoder(); List enc = new ArrayList<>(); - for(Thread t : program.getThreads()){ + for (Thread t : program.getThreads()) { enc.add(encodeConsistentThreadCF(t)); if (IRHelper.isInitThread(t)) { // Init threads are always progressing @@ -229,7 +229,7 @@ private BooleanFormula encodeConsistentThreadCF(Thread thread) { enc.add(bmgr.implication(threadHasStarted(thread), threadIsEnabled(thread))); enc.add(startEvent.encodeExec(context)); - for(final Event cur : startEvent.getSuccessor().getSuccessors()) { + for (final Event cur : startEvent.getSuccessor().getSuccessors()) { final Event pred = cur.getPredecessor(); // Immediate control flow BooleanFormula cfCond = context.controlFlow(pred); @@ -467,11 +467,11 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { enc.add(assign.apply(addrVar, alignment)); } else { final Expression nextAvailableAddr = exprs.makeAdd( - exprs.makePtrToIntCast(context.address(prev),archType), + exprs.makePtrToIntCast(context.address(prev), archType), context.size(prev) ); final Expression nextAlignedAddr = exprs.makeAdd(nextAvailableAddr, - exprs.makeSub(alignment, exprs.makeRem(nextAvailableAddr, alignment, true)) + exprs.makeSub(alignment, exprs.makeRem(nextAvailableAddr, alignment, true)) ); // ... other objects are placed at the next well-aligned address that is available. @@ -485,8 +485,7 @@ private BooleanFormula encodeMemoryLayout(Memory memory) { // ====================================== Data flow ====================================== /** - * @return - * Describes that for each pair of events, if the reader uses the result of the writer, + * @return Describes that for each pair of events, if the reader uses the result of the writer, * then the value the reader gets from the register is exactly the value that the writer computed. * Also, the reader may only use the value of the latest writer that is executed. * Also, if no fitting writer is executed, the reader uses 0. @@ -525,7 +524,7 @@ public BooleanFormula encodeDependencies() { overwrite.add(context.execution(writer)); } - if(initializeRegisters && !reg.mustBeInitialized()) { + if (initializeRegisters && !reg.mustBeInitialized()) { final Expression zero = exprs.makeGeneralZero(register.getType()); overwrite.add(bmgr.not(context.controlFlow(reader))); overwrite.add(exprEncoder.assignEqualAt(register, reader, zero, reader)); @@ -659,7 +658,7 @@ private BooleanFormula encodeForwardProgress(Program program, ProgressModel.Hier group.getChildren().stream() .map(c -> bmgr.and(hasForwardProgress(c), isSchedulable(c))) .reduce(bmgr.makeFalse(), bmgr::or) - )); + )); } // (2.3 Base cases for threads) @@ -731,7 +730,7 @@ private BooleanFormula encodeProgressForwarding(ThreadHierarchy group, ProgressM for (int i = 0; i < sortedChildren.size(); i++) { final ThreadHierarchy child = sortedChildren.get(i); final BooleanFormula sameOrHigherIDThreadWasScheduledOnce = - sortedChildren.subList(i , sortedChildren.size()).stream() + sortedChildren.subList(i, sortedChildren.size()).stream() .map(this::wasScheduledOnce) .reduce(bmgr.makeFalse(), bmgr::or); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index 0d1df9519a..5fef684f3f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -114,9 +114,9 @@ public BooleanFormula encodeProperties(EnumSet properties) { if (specType == Property.Type.MIXED) { final String warn = String.format( "The set of properties %s are of mixed type (safety and reachability properties). " + - "Cannot encode mixed properties into a single SMT-query. " + - "You can select a different set of properties with option --property. " + - "Defaulting to " + Property.PROGRAM_SPEC.asStringOption() + ".", + "Cannot encode mixed properties into a single SMT-query. " + + "You can select a different set of properties with option --property. " + + "Defaulting to " + Property.PROGRAM_SPEC.asStringOption() + ".", properties); logger.warn(warn); properties = EnumSet.of(Property.PROGRAM_SPEC); @@ -366,25 +366,25 @@ public TrackableFormula encodeDataRaces() { }); BooleanFormula hasRace = bmgr.makeFalse(); - for(Thread t1 : program.getThreads()) { - for(Thread t2 : program.getThreads()) { - if(t1 == t2) { + for (Thread t1 : program.getThreads()) { + for (Thread t2 : program.getThreads()) { + if (t1 == t2) { continue; } for (Event e1 : t1.getEvents()) { if (!e1.hasTag(Tag.WRITE) || e1.hasTag(Tag.INIT)) { continue; } - MemoryCoreEvent w = (MemoryCoreEvent)e1; + MemoryCoreEvent w = (MemoryCoreEvent) e1; if (!canRace.test(w)) { continue; } - for(Event e2 : t2.getEvents()) { + for (Event e2 : t2.getEvents()) { if (!e2.hasTag(Tag.MEMORY) || e2.hasTag(Tag.INIT)) { continue; } - MemoryCoreEvent m = (MemoryCoreEvent)e2; - if((w.hasTag(Tag.RMW) && m.hasTag(Tag.RMW)) || !canRace.test(m) || !alias.mayAlias(m, w)) { + MemoryCoreEvent m = (MemoryCoreEvent) e2; + if ((w.hasTag(Tag.RMW) && m.hasTag(Tag.RMW)) || !canRace.test(m) || !alias.mayAlias(m, w)) { continue; } @@ -413,7 +413,8 @@ public TrackableFormula encodeDataRaces() { private TrackableFormula encodeTrackabilityViolations() { final var enc = new ArrayList(); - record Var(BooleanFormula leak, BooleanFormula track) {} + record Var(BooleanFormula leak, BooleanFormula track) { + } final Map variables = program.getMemory().getObjects().stream() .filter(MemoryObject::isHeapAllocated) .collect(Collectors.toMap(o -> o, o -> new Var(context.leakVariable(o), context.trackVariable(o)))); @@ -451,20 +452,28 @@ record Var(BooleanFormula leak, BooleanFormula track) {} // Object A is reachable from another object B, if a co-maximal store writes an address pointing to A into B. for (Store store : program.getThreadEvents(Store.class)) { final List stores = instructions.getOrDefault(store, List.of(store)); - if (!mayBeFinalAddressStore(store, stores)) { continue; } + if (!mayBeFinalAddressStore(store, stores)) { + continue; + } final Set communicableObjects = alias.communicableObjects(store).stream() .filter(variables::containsKey) .collect(Collectors.toSet()); - if (communicableObjects.isEmpty()) { continue; } + if (communicableObjects.isEmpty()) { + continue; + } final BooleanFormula isFinal = bmgr.and(stores.stream().map(context::lastCoVar).toList()); for (MemoryObject addressableObject : alias.addressableObjects(store)) { final Var addressVariable = variables.get(addressableObject); - if (addressVariable == null && !addressableObject.isStaticallyAllocated()) { continue; } + if (addressVariable == null && !addressableObject.isStaticallyAllocated()) { + continue; + } final BooleanFormula addressed = referencesObject(stores, false, addressableObject); final BooleanFormula addressTrack = addressVariable != null ? addressVariable.track : bmgr.makeTrue(); for (MemoryObject communicableObject : communicableObjects) { final Var valueVariable = variables.get(communicableObject); - if (valueVariable == null) { continue; } + if (valueVariable == null) { + continue; + } final BooleanFormula valueTrack = valueVariable.track; final BooleanFormula communicated = referencesObject(stores, true, communicableObject); enc.add(bmgr.not(bmgr.and(isFinal, addressed, addressTrack, communicated, bmgr.not(valueTrack)))); @@ -501,8 +510,8 @@ private BooleanFormula referencesObject(List stores, boolean isValue, Mem if (isValue) { List memVals = stores.stream().map(Store::getMemValue).toList(); // assert memVals.get(0) instanceof MemoryType; - pointer = expressions.makeFromMemoryCast(expressions.makeMemoryConcat(memVals),object.getType()); - }else{ + pointer = expressions.makeFromMemoryCast(expressions.makeMemoryConcat(memVals), object.getType()); + } else { pointer = stores.get(0).getAddress(); } if (object.equals(pointer)) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/SymmetryEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/SymmetryEncoder.java index 32b3e8b854..db091f22a5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/SymmetryEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/SymmetryEncoder.java @@ -93,7 +93,7 @@ public BooleanFormula encodeFullSymmetryBreaking() { final BooleanFormulaManager bmgr = context.getBooleanFormulaManager(); final EventGraph maySet; final EncodingContext.EdgeEncoder edgeEncoder; - switch(symmBreakTarget) { + switch (symmBreakTarget) { case "": return bmgr.makeTrue(); case "_cf": diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java index 9ffff167e2..b38351d50b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/TypedFormula.java @@ -57,7 +57,7 @@ metadata, i.e., they may be of shape (metadata, bvX). Metadata then needs to be preserved even over extract/concatenation operations. */ public record TypedFormula(TType type, TFormula formula) - implements LeafExpression { + implements LeafExpression { public TypedFormula { Preconditions.checkNotNull(type); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index d318f695a1..e10ef48807 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -16,6 +16,7 @@ import com.dat3m.dartagnan.program.memory.ScopedPointerVariable; import com.google.common.base.Preconditions; import com.google.common.collect.Iterables; + import java.util.Stack; import java.math.BigDecimal; @@ -45,7 +46,8 @@ public final class ExpressionFactory { private final BoolLiteral falseConstant = new BoolLiteral(booleanType, false); private final BoolLiteral trueConstant = new BoolLiteral(booleanType, true); - private ExpressionFactory() {} + private ExpressionFactory() { + } public static ExpressionFactory getInstance() { return instance; @@ -92,7 +94,7 @@ public Expression makeBooleanCast(Expression operand) { return operand; } else if (sourceType instanceof IntegerType intType) { return makeNEQ(operand, makeZero(intType)); - }else if (sourceType instanceof PointerType) { + } else if (sourceType instanceof PointerType) { return makeBooleanCast(makePtrToIntCast(operand, archType)); } throw new UnsupportedOperationException(String.format("Cannot cast %s to %s.", sourceType, booleanType)); @@ -128,34 +130,35 @@ public IntLiteral makeValue(long value, IntegerType type) { public IntLiteral makeValue(BigInteger value, IntegerType type) { return new IntLiteral(type, value); } + public IntLiteral makeValue(int value, int bitwidth) { return makeValue(BigInteger.valueOf(value), bitwidth); } public Expression makeLT(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpfromInts(leftOperand,IntCmpOp.ULT,rightOperand); + if (leftOperand.getType() instanceof PointerType) { + return makeIntCmpfromInts(leftOperand, IntCmpOp.ULT, rightOperand); } return makeIntCmp(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } public Expression makeGT(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpfromInts(leftOperand,IntCmpOp.UGT,rightOperand); + if (leftOperand.getType() instanceof PointerType) { + return makeIntCmpfromInts(leftOperand, IntCmpOp.UGT, rightOperand); } return makeIntCmp(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } public Expression makeLTE(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpfromInts(leftOperand,IntCmpOp.ULTE,rightOperand); + if (leftOperand.getType() instanceof PointerType) { + return makeIntCmpfromInts(leftOperand, IntCmpOp.ULTE, rightOperand); } return makeIntCmp(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } public Expression makeGTE(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType){ - return makeIntCmpfromInts(leftOperand,IntCmpOp.UGTE,rightOperand); + if (leftOperand.getType() instanceof PointerType) { + return makeIntCmpfromInts(leftOperand, IntCmpOp.UGTE, rightOperand); } return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } @@ -229,10 +232,10 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi } public Expression makeIntCmpfromInts(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { - if (leftOperand.getType() instanceof PointerType){ + if (leftOperand.getType() instanceof PointerType) { return makeIntCmpfromInts(makePtrToIntCast(leftOperand, archType), operator, rightOperand); } - if (rightOperand.getType() instanceof PointerType){ + if (rightOperand.getType() instanceof PointerType) { return makeIntCmpfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, archType)); } return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); @@ -251,7 +254,7 @@ public Expression makeIntegerCast(Expression operand, IntegerType targetType, bo return sourceType.equals(targetType) ? operand : new IntSizeCast(targetType, operand, signed); } else if (sourceType instanceof FloatType) { return new FloatToIntCast(targetType, operand, signed); - }else if (sourceType instanceof PointerType) { + } else if (sourceType instanceof PointerType) { return makePtrToIntCast(operand, targetType); } @@ -322,6 +325,7 @@ public Expression makeFloatCast(Expression operand, FloatType targetType, boolea public Expression makeConstruct(Type type, List arguments) { return new ConstructExpr(type, arguments); } + public Expression makeCompatibilityConstruct(Type type, List arguments) { assert ExpressionHelper.isAggregateLike(type); List types = new ArrayList<>(); @@ -345,7 +349,7 @@ public Expression makeCompatibilityConstruct(Type type, List newArguments = new ArrayList<>(); assert types.size() == arguments.size(); for (int i = 0; i < types.size(); ++i) { - newArguments.add(makeCast(arguments.get(i),types.get(i))); + newArguments.add(makeCast(arguments.get(i), types.get(i))); } return new ConstructExpr(type, newArguments); } @@ -393,19 +397,19 @@ public Expression makeAggregateCmp(Expression x, AggregateCmpOp op, Expression y // Pointers public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets) { - Preconditions.checkArgument(base.getType() instanceof PointerType, + Preconditions.checkArgument(base.getType() instanceof PointerType, "Applying offsets to non-pointer expression."); - return new GEPExpr(indexingType, base, offsets,null); + return new GEPExpr(indexingType, base, offsets, null); } public Expression makeGetElementPointer(Type indexingType, Expression base, List offsets, Integer stride) { // TODO: Stride should be a property of the pointer, not of a GEPExpr. // Refactor GEPExpr to only accept a (new) PointerType and a list of offsets. // A PointerType should have the referred type and the stride in its attributes. - Preconditions.checkArgument(base.getType() instanceof PointerType, + Preconditions.checkArgument(base.getType() instanceof PointerType, "Applying offsets to non-pointer expression."); Preconditions.checkArgument(stride == null || stride >= types.getMemorySizeInBytes(indexingType), - "Stride cannot be smaller than indexing type"); + "Stride cannot be smaller than indexing type"); return new GEPExpr(indexingType, base, offsets, stride); } @@ -421,23 +425,24 @@ public Expression makePtrAdd(Expression base, Expression offset) { return new PtrAddExpr(base, offset); } - public Expression makePtrCast(Expression base, PointerType type){ - if (base.getType() instanceof PointerType){ + public Expression makePtrCast(Expression base, PointerType type) { + if (base.getType() instanceof PointerType) { if (base.getType().equals(type)) { return base; - // pointers of different size than arch should not be used (store | load). Comparison is still possible in wmm. - }else{ + // pointers of different size than arch should not be used (store | load). Comparison is still possible in wmm. + } else { // we use this because spirv has some weird casts between scoped pointers. // not the most elegant solution, maybe a dedicated ptr size/type cast? return makeIntToPtrCast(makePtrToIntCast(base, types.getIntegerType(type.bitWidth)), type); - }} + } + } if (base.getType() instanceof IntegerType) { return makeIntToPtrCast(base, type); } if (base.getType() instanceof BooleanType) { - return makePtrCast(makeIntegerCast(base, archType,false),type); + return makePtrCast(makeIntegerCast(base, archType, false), type); } - throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.",base)); + throw new UnsupportedOperationException(String.format("Cast %s into pointer unsupported.", base)); } @@ -449,12 +454,12 @@ public Expression makePtrToIntCast(Expression pointer, IntegerType type) { public Expression makeIntToPtrCast(Expression integer, PointerType pointerType) { return new IntToPtrCast(pointerType, integer); } + public Expression makeIntToPtrCast(Expression operand) { - return makeIntToPtrCast(operand,pointerType); + return makeIntToPtrCast(operand, pointerType); } - public Expression makeNullLiteral(PointerType pointerType) { return new NullLiteral(pointerType); } @@ -561,19 +566,22 @@ public Expression makeGeneralZero(Type type) { return makeToMemoryCast(makeZero(types.getIntegerType(memoryType.getBitWidth()))); } else if (type instanceof PointerType pt) { return makeNullLiteral(pt); - }else{ + } else { throw new UnsupportedOperationException("Cannot create zero of type " + type); } } public Expression makeCast(Expression expression, Type type, boolean signed) { - if (expression.getType().equals(type)) {return expression;} - if (type instanceof BooleanType) {return makeBooleanCast(expression);} - else if (type instanceof IntegerType integerType) { + if (expression.getType().equals(type)) { + return expression; + } + if (type instanceof BooleanType) { + return makeBooleanCast(expression); + } else if (type instanceof IntegerType integerType) { return makeIntegerCast(expression, integerType, signed); } else if (type instanceof FloatType floatType) { return makeFloatCast(expression, floatType, signed); - }else if (type instanceof PointerType) { + } else if (type instanceof PointerType) { return makePtrCast(expression, (PointerType) type); } throw new UnsupportedOperationException(String.format("Cast %s into %s unsupported.", expression, type)); @@ -593,7 +601,8 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { return makeBoolBinary(leftOperand, BoolBinaryOp.IFF, rightOperand); } else if (type instanceof IntegerType) { return makeIntCmp(leftOperand, IntCmpOp.EQ, rightOperand); - } if (type instanceof PointerType) { + } + if (type instanceof PointerType) { return makePtrCmp(leftOperand, PtrCmpOp.EQ, rightOperand); } else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? @@ -608,10 +617,10 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { public Expression makeBitwiseEQ(Expression leftOperand, Expression rightOperand) { - if (leftOperand.getType() instanceof PointerType){ + if (leftOperand.getType() instanceof PointerType) { return makeBitwiseEQ(makePtrToIntCast(leftOperand, archType), rightOperand); } - if (rightOperand.getType() instanceof PointerType){ + if (rightOperand.getType() instanceof PointerType) { return makeBitwiseEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); } return makeEQ(leftOperand, rightOperand); @@ -623,9 +632,10 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { return makeNot(makeBoolBinary(leftOperand, BoolBinaryOp.IFF, rightOperand)); } else if (type instanceof IntegerType) { return makeIntCmp(leftOperand, IntCmpOp.NEQ, rightOperand); - } if (type instanceof PointerType) { + } + if (type instanceof PointerType) { return makePtrCmp(leftOperand, PtrCmpOp.NEQ, rightOperand); - }else if (type instanceof FloatType) { + } else if (type instanceof FloatType) { // TODO: Decide on a default semantics for float equality? return makeFloatCmp(leftOperand, FloatCmpOp.ONEQ, rightOperand); } else if (type instanceof AggregateType) { @@ -637,10 +647,10 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { public Expression makeBitwiseNEQ(Expression leftOperand, Expression rightOperand) { // casts both operands to archtype and compares them - if (leftOperand.getType() instanceof PointerType){ + if (leftOperand.getType() instanceof PointerType) { return makeBitwiseNEQ(makePtrToIntCast(leftOperand, archType), rightOperand); } - if (rightOperand.getType() instanceof PointerType){ + if (rightOperand.getType() instanceof PointerType) { return makeBitwiseNEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); } return makeNEQ(leftOperand, rightOperand); @@ -666,7 +676,7 @@ public Expression makeBinary(Expression x, ExpressionKind op, Expression y) { return makeFloatBinary(x, floatOp, y); } else if (op instanceof IntCmpOp cmpOp) { return makeCompare(x, cmpOp, y); - }else if (op instanceof PtrCmpOp cmpOp) { + } else if (op instanceof PtrCmpOp cmpOp) { return makeCompare(x, cmpOp, y); } throw new UnsupportedOperationException(String.format("Expression kind %s is no binary operator.", op)); @@ -679,7 +689,7 @@ public Expression makeCompare(Expression x, ExpressionKind cmpOp, Expression y) return makeFloatCmp(x, floatOp, y); } else if (cmpOp instanceof AggregateCmpOp aggrCmpOp) { return makeAggregateCmp(x, aggrCmpOp, y); - }else if (cmpOp instanceof PtrCmpOp ptrCmpOp) { + } else if (cmpOp instanceof PtrCmpOp ptrCmpOp) { return makePtrCmp(x, ptrCmpOp, y); } throw new UnsupportedOperationException(String.format("Expression kind %s is no comparison operator.", cmpOp)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/floats/FloatBinaryExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/floats/FloatBinaryExpr.java index 6fbe43c57e..6a10634cd9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/floats/FloatBinaryExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/floats/FloatBinaryExpr.java @@ -26,8 +26,8 @@ public int hashCode() { case FADD -> leftHash + rightHash; case FSUB -> leftHash - rightHash; case FMUL -> leftHash * rightHash; - case FDIV -> leftHash * (rightHash + 31); - case FREM -> leftHash * (rightHash + 127); + case FDIV -> leftHash * (rightHash + 31); + case FREM -> leftHash * (rightHash + 127); }; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java index a65a3db8f1..3122081539 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryConcat.java @@ -21,7 +21,7 @@ private static MemoryType getConcatType(List operands) { int size = 0; for (Expression op : operands) { ExpressionHelper.checkExpectedType(op, MemoryType.class); - size += ((MemoryType)op.getType()).getBitWidth(); + size += ((MemoryType) op.getType()).getBitWidth(); } return TypeFactory.getInstance().getMemoryType(size); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java index 846e7e784a..25d504c006 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/memory/MemoryExtract.java @@ -28,12 +28,18 @@ public MemoryExtract(Expression operand, int lowBit, int highBit) { public boolean isExtractingLowBits() { return lowBit == 0; } + public boolean isExtractingHighBits() { return operand.getType() instanceof MemoryType t && highBit + 1 == t.getBitWidth(); } - public int getLowBit() { return lowBit; } - public int getHighBit() { return highBit; } + public int getLowBit() { + return lowBit; + } + + public int getHighBit() { + return highBit; + } @Override public T accept(ExpressionVisitor visitor) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java index a913538133..ad921f0cef 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java @@ -1,4 +1,5 @@ package com.dat3m.dartagnan.expression.pointers; + import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionKind; import com.dat3m.dartagnan.expression.ExpressionVisitor; @@ -20,8 +21,13 @@ public PtrAddExpr(Expression base, Expression offset) { this.offset = offset; } - public Expression getBase() { return base; } - public Expression getOffset() { return offset; } + public Expression getBase() { + return base; + } + + public Expression getOffset() { + return offset; + } @Override public ImmutableList getOperands() { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java index 4abe421fbc..7811a7cd55 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java @@ -23,6 +23,7 @@ public String getSymbol() { // case LT -> "<"; }; } + public PtrCmpOp inverted() { return switch (this) { case EQ -> NEQ; @@ -33,6 +34,7 @@ public PtrCmpOp inverted() { // case LT -> GTE; }; } + public PtrCmpOp reverse() { return switch (this) { case EQ, NEQ -> this; @@ -42,6 +44,7 @@ public PtrCmpOp reverse() { // case LT -> GT; }; } + public boolean isStrict() { return switch (this) { case NEQ -> true; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java index 04eba73c90..bed5198e1a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java @@ -21,7 +21,7 @@ private static PointerType getConcatType(List operands) { int size = 0; for (Expression op : operands) { ExpressionHelper.checkExpectedType(op, PointerType.class); - size += ((PointerType)op.getType()).getBitWidth(); + size += ((PointerType) op.getType()).getBitWidth(); } return TypeFactory.getInstance().getPointerType(size); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java index 26adae32b3..b01663ace6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java @@ -19,18 +19,24 @@ public PtrExtract(Expression operand, int lowBit, int highBit) { ExpressionKind.Other.BV_EXTRACT, operand); ExpressionHelper.checkExpectedType(operand, PointerType.class); - int originalWidth = ((PointerType)operand.getType()).getBitWidth(); + int originalWidth = ((PointerType) operand.getType()).getBitWidth(); Preconditions.checkArgument(0 <= lowBit && lowBit <= highBit && highBit < originalWidth); this.lowBit = lowBit; this.highBit = highBit; } - public int getLowBit() { return lowBit; } - public int getHighBit() { return highBit; } + public int getLowBit() { + return lowBit; + } + + public int getHighBit() { + return highBit; + } public boolean isExtractingLowBits() { return lowBit == 0; } + public boolean isExtractingHighBits() { return operand.getType() instanceof PointerType t && highBit + 1 == t.getBitWidth(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java index 4d3d992967..dd70f005ff 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/processing/ExprSimplifier.java @@ -168,7 +168,7 @@ public Expression visitIntCmpExpression(IntCmpExpr cmp) { case ULT -> IntegerHelper.ucmp(l1.getValue(), l2.getValue(), bitWidth) < 0; case ULTE -> IntegerHelper.ucmp(l1.getValue(), l2.getValue(), bitWidth) <= 0; default -> - throw new VerifyException(String.format("Unexpected comparison operator '%s'. Missing normalization?", op)); + throw new VerifyException(String.format("Unexpected comparison operator '%s'. Missing normalization?", op)); }; return expressions.makeValue(cmpResult); } @@ -184,7 +184,7 @@ public Expression visitIntCmpExpression(IntCmpExpr cmp) { case LT, ULT -> sameObj ? false : null; case LTE, ULTE -> sameObj ? true : null; default -> - throw new VerifyException(String.format("Unexpected comparison operator '%s'. Missing normalization?", op)); + throw new VerifyException(String.format("Unexpected comparison operator '%s'. Missing normalization?", op)); }; if (cmpResult != null) { @@ -346,7 +346,9 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { // Optimizations for "x op constant" if (offset instanceof IntLiteral lit) { - if(lit.isZero()){return base;} + if (lit.isZero()) { + return base; + } } return expressions.makePtrAdd(base, offset); } @@ -357,31 +359,31 @@ public Expression visitPtrAddExpression(PtrAddExpr expr) { @Override public Expression visitPtrToIntCastExpression(PtrToIntCast expr) { final Expression sub = expr.getOperand().accept(this); - if (sub instanceof IntToPtrCast subT){ + if (sub instanceof IntToPtrCast subT) { final int originalBitWidth = subT.getSourceType().getBitWidth(); final int inBetweenBitWidth = subT.getTargetType().getBitWidth(); final int finalBitWidth = expr.getType().getBitWidth(); - if (originalBitWidth == inBetweenBitWidth && finalBitWidth == originalBitWidth ) { + if (originalBitWidth == inBetweenBitWidth && finalBitWidth == originalBitWidth) { return subT.getOperand(); } } if (sub instanceof NullLiteral) { return expressions.makeZero(expr.getType()); } - return expressions.makePtrToIntCast(expr.getOperand(), expr.getType()); + return expressions.makePtrToIntCast(expr.getOperand(), expr.getType()); } // Simplifies (ptr(i) -> int(i)) -> ptr(i). @Override public Expression visitIntToPtrCastExpression(IntToPtrCast expr) { final Expression sub = expr.getOperand().accept(this); - if (sub instanceof PtrToIntCast subT){ + if (sub instanceof PtrToIntCast subT) { final int originalBitWidth = subT.getSourceType().getBitWidth(); final int inBetweenBitWidth = subT.getTargetType().getBitWidth(); final int finalBitWidth = expr.getType().getBitWidth(); - if (originalBitWidth == inBetweenBitWidth && finalBitWidth == originalBitWidth ) { + if (originalBitWidth == inBetweenBitWidth && finalBitWidth == originalBitWidth) { return subT.getOperand(); } } @@ -441,7 +443,7 @@ public Expression visitExtractExpression(ExtractExpr expr) { final ImmutableList indices = expr.getIndices(); int indexCursor = 0; - while(indexCursor < indices.size() && (inner instanceof ConstructExpr construct)) { + while (indexCursor < indices.size() && (inner instanceof ConstructExpr construct)) { inner = construct.getOperands().get(indices.get(indexCursor)); indexCursor++; } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java index fea493149f..859cb117a8 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/PointerType.java @@ -12,7 +12,7 @@ public class PointerType implements Type { @Override public String toString() { - return "ptr"+ bitWidth; + return "ptr" + bitWidth; } @Override diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java index 55542e55b5..e16b503368 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/type/TypeFactory.java @@ -39,9 +39,13 @@ public BooleanType getBooleanType() { return booleanType; } - public VoidType getVoidType() { return voidType; } + public VoidType getVoidType() { + return voidType; + } - public Type getUnitType() { return getAggregateType(List.of()); } + public Type getUnitType() { + return getAggregateType(List.of()); + } public PointerType getPointerType() { return pointerType; @@ -111,10 +115,10 @@ public AggregateType getAggregateType(List fields, List offsets) checkArgument(offsets.stream().noneMatch(o -> o < 0), "Offset cannot be negative"); checkArgument(offsets.isEmpty() || offsets.get(0) == 0, "The first offset must be zero"); checkArgument(IntStream.range(1, offsets.size()).allMatch( - i -> offsets.get(i) >= offsets.get(i - 1) + Integer.max(0, getMemorySizeInBytes(fields.get(i - 1), false))), + i -> offsets.get(i) >= offsets.get(i - 1) + Integer.max(0, getMemorySizeInBytes(fields.get(i - 1), false))), "Offset is too small"); checkArgument(IntStream.range(0, fields.size() - 1).allMatch( - i -> hasKnownSize(fields.get(i))), + i -> hasKnownSize(fields.get(i))), "Non-last element with unknown size"); return typeNormalizer.normalize(new AggregateType(fields, offsets)); } @@ -260,7 +264,9 @@ public static int paddedSize(int size, int alignment) { return size; } - public boolean hasKnownSize(Type type) { return getMemorySizeInBytes(type) >= 0; } + public boolean hasKnownSize(Type type) { + return getMemorySizeInBytes(type) >= 0; + } public int getMemorySizeInBits(Type type) { return getMemorySizeInBytes(type) * 8; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java index 818f9a5fab..978ae5a42e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/utils/ExpressionHelper.java @@ -9,7 +9,8 @@ public class ExpressionHelper { - private ExpressionHelper() {} + private ExpressionHelper() { + } public static void checkSameType(Expression x, Expression y) { Preconditions.checkArgument(x.getType().equals(y.getType()), diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java index 4b62b316ac..a66024310e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/cat/VisitorCat.java @@ -35,6 +35,7 @@ import com.dat3m.dartagnan.parsers.CatParser.*; import com.dat3m.dartagnan.wmm.definition.*; import org.antlr.v4.runtime.*; + import java.util.*; class VisitorCat extends CatBaseVisitor { @@ -144,7 +145,7 @@ private String createUniqueName(String name) { nameOccurrenceCounter.putIfAbsent(name, 1); } - final int occurrenceNumber = nameOccurrenceCounter.compute(name, (k, v) -> v == null ? 1 : v + 1); + final int occurrenceNumber = nameOccurrenceCounter.compute(name, (k, v) -> v == null ? 1 : v + 1); // If it is the first time we encounter this name, we return it as is. return occurrenceNumber == 1 ? name : name + "#" + occurrenceNumber; } @@ -260,7 +261,7 @@ public Object visitExprCall(ExprCallContext ctx) { final Map curNamespace = namespace; namespace = functionNamespace; final CatParser parser = getParser(CharStreams.fromString(funcDef.expression)); - Object result = parser.expression().accept(this); + Object result = parser.expression().accept(this); namespace = curNamespace; return result; } @@ -380,7 +381,7 @@ private Relation addDefinition(Definition definition) { } private void checkNoRecursion(ExpressionContext c) { - if(relationToBeDefined != null) { + if (relationToBeDefined != null) { throw new ParsingException("Unexpected recursive context at expression: " + c.getText()); } } @@ -420,7 +421,8 @@ private static CatParser getParser(CharStream input) { private final class ArityInspector extends CatBaseVisitor { - private ArityInspector() {} + private ArityInspector() { + } @Override public Relation.Arity visitExpr(ExprContext c) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java index 1cdfa08cf3..2ea5b21e81 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/ProgramParser.java @@ -95,7 +95,7 @@ private ParserInterface getConcreteParser(File file) throws IOException { return new ParserLlvm(); } if (name.endsWith(EXTENSION_SPV_DIS)) { - logger.warn(String.format("Extension %s is deprecated. Please rename your file to %s instead.", EXTENSION_SPV_DIS, EXTENSION_SPVASM)); + logger.warn(String.format("Extension %s is deprecated. Please rename your file to %s instead.", EXTENSION_SPV_DIS, EXTENSION_SPVASM)); return new ParserSpirv(); } if (name.endsWith(EXTENSION_SPVASM)) { @@ -120,7 +120,7 @@ private ParserInterface getConcreteLitmusParser(String programText) { return new ParserLitmusRISCV(); } else if (programText.indexOf(TYPE_LITMUS_PTX) == 0) { return new ParserLitmusPTX(); - } else if(programText.indexOf(TYPE_LITMUS_VULKAN) == 0) { + } else if (programText.indexOf(TYPE_LITMUS_VULKAN) == 0) { return new ParserLitmusVulkan(); } final int spaceIndex = programText.indexOf(" "); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java index f0e14e2042..b1db64d18b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/AsmUtils.java @@ -43,7 +43,7 @@ public static boolean isReturnRegisterAggregate(Register returnRegister) { } // Tells if the registerID is mapped to the returnRegister - public static boolean isPartOfReturnRegister(Register returnRegister,int registerID) { + public static boolean isPartOfReturnRegister(Register returnRegister, int registerID) { return registerID < getNumASMReturnRegisters(returnRegister); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/Compilation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/Compilation.java index 405830fa24..5c9327cb58 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/Compilation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/Compilation.java @@ -52,8 +52,8 @@ private static void runCmd(ArrayList cmd) throws Exception { processBuilder.redirectOutput(log); Process proc = processBuilder.start(); proc.waitFor(); - if(proc.exitValue() != 0) { - String errorString = Files.asCharSource(log, Charsets.UTF_8).read(); + if (proc.exitValue() != 0) { + String errorString = Files.asCharSource(log, Charsets.UTF_8).read(); throw new IOException("'" + String.join("' '", cmd) + "': " + errorString); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java index 95cd4d937e..649446f21e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/utils/ProgramBuilder.java @@ -140,7 +140,7 @@ public void setAssertFilter(Expression ass) { // This method creates a "default" thread that has no parameters, no return value, and runs unconditionally. // It is only useful for creating threads of Litmus code. public Thread newThread(String name, int tid) { - if(id2FunctionsMap.containsKey(tid)) { + if (id2FunctionsMap.containsKey(tid)) { throw new MalformedProgramException("Function or thread with id " + tid + " already exists."); } final Thread thread = new Thread(name, DEFAULT_THREAD_TYPE, List.of(), tid, EventFactory.newThreadStart(null)); @@ -150,7 +150,7 @@ public Thread newThread(String name, int tid) { } public Function newFunction(String name, int fid, FunctionType type, List parameterNames) { - if(id2FunctionsMap.containsKey(fid)) { + if (id2FunctionsMap.containsKey(fid)) { throw new MalformedProgramException("Function or thread with id " + fid + " already exists."); } final Function func = new Function(name, type, parameterNames, fid, null); @@ -237,11 +237,11 @@ public void initLocEqLocPtr(String leftName, String rightName) { initLocEqConst(leftName, getOrNewMemoryObject(rightName)); } - public void initLocEqLocVal(String leftName, String rightName){ - initLocEqConst(leftName,getInitialValue(rightName)); + public void initLocEqLocVal(String leftName, String rightName) { + initLocEqConst(leftName, getInitialValue(rightName)); } - public void initLocEqConst(String locName, Expression iValue){ + public void initLocEqConst(String locName, Expression iValue) { getOrNewMemoryObject(locName).setInitialValue(0, iValue); } @@ -253,10 +253,10 @@ public void initRegEqLocPtr(int regThread, String regName, String locName) { public void initRegEqLocVal(int regThread, String regName, String locName, Type type) { Register reg = getOrNewRegister(regThread, regName, type); - addChild(regThread, EventFactory.newLocal(reg,getInitialValue(locName))); + addChild(regThread, EventFactory.newLocal(reg, getInitialValue(locName))); } - public void initRegEqConst(int regThread, String regName, Expression value){ + public void initRegEqConst(int regThread, String regName, Expression value) { Preconditions.checkArgument(value.getRegs().isEmpty()); addChild(regThread, EventFactory.newLocal(getOrNewRegister(regThread, regName, value.getType()), value)); } @@ -268,7 +268,7 @@ private Expression getInitialValue(String name) { // ---------------------------------------------------------------------------------------------------------------- // Utility - public Register getRegister(int fid, String name){ + public Register getRegister(int fid, String name) { return getFunctionOrError(fid).getRegister(name); } @@ -290,7 +290,7 @@ public Register getOrErrorRegister(int fid, String name) { throw new IllegalStateException("Register " + fid + ":" + name + " is not initialised"); } - public Label getOrCreateLabel(int funcId, String name){ + public Label getOrCreateLabel(int funcId, String name) { return fid2LabelsMap .computeIfAbsent(funcId, k -> new HashMap<>()) .computeIfAbsent(name, EventFactory::newLabel); @@ -303,7 +303,7 @@ public Label getEndOfThreadLabel(int tid) { // ---------------------------------------------------------------------------------------------------------------- // GPU - public void newScopedThread(Arch arch, String name, int id, int ...scopeIds) { + public void newScopedThread(Arch arch, String name, int id, int... scopeIds) { ScopeHierarchy scopeHierarchy = switch (arch) { case PTX -> ScopeHierarchy.ScopeHierarchyForPTX(scopeIds[0], scopeIds[1]); case VULKAN -> ScopeHierarchy.ScopeHierarchyForVulkan(scopeIds[0], scopeIds[1], scopeIds[2]); @@ -311,7 +311,7 @@ public void newScopedThread(Arch arch, String name, int id, int ...scopeIds) { default -> throw new UnsupportedOperationException("Unsupported architecture: " + arch); }; - if(id2FunctionsMap.containsKey(id)) { + if (id2FunctionsMap.containsKey(id)) { throw new MalformedProgramException("Function or thread with id " + id + " already exists."); } // Litmus threads run unconditionally (have no creator) and have no parameters/return types. @@ -321,17 +321,17 @@ public void newScopedThread(Arch arch, String name, int id, int ...scopeIds) { program.addThread(scopedThread); } - public void newScopedThread(Arch arch, int id, int ...ids) { + public void newScopedThread(Arch arch, int id, int... ids) { newScopedThread(arch, String.valueOf(id), id, ids); } // ---------------------------------------------------------------------------------------------------------------- // PTX - public void initVirLocEqCon(String leftName, IntLiteral iValue){ + public void initVirLocEqCon(String leftName, IntLiteral iValue) { getOrNewVirtualMemoryObject(leftName, true, null).setInitialValue(0, iValue); } - public void initVirLocEqLoc(String leftName, String rightName){ + public void initVirLocEqLoc(String leftName, String rightName) { VirtualMemoryObject rightLocation = (VirtualMemoryObject) getMemoryObject(rightName); if (rightLocation == null) { throw new MalformedProgramException("Alias to non-exist location: " + rightName); @@ -339,7 +339,7 @@ public void initVirLocEqLoc(String leftName, String rightName){ getOrNewVirtualMemoryObject(leftName, true, null).setInitialValue(0, rightLocation.getInitialValue(0)); } - public void initVirLocEqLocAliasGen(String leftName, String rightName){ + public void initVirLocEqLocAliasGen(String leftName, String rightName) { VirtualMemoryObject rightLocation = (VirtualMemoryObject) getMemoryObject(rightName); if (rightLocation == null) { throw new MalformedProgramException("Alias to non-exist location: " + rightName); @@ -347,7 +347,7 @@ public void initVirLocEqLocAliasGen(String leftName, String rightName){ getOrNewVirtualMemoryObject(leftName, true, rightLocation).setInitialValue(0, rightLocation.getInitialValue(0)); } - public void initVirLocEqLocAliasProxy(String leftName, String rightName){ + public void initVirLocEqLocAliasProxy(String leftName, String rightName) { VirtualMemoryObject rightLocation = (VirtualMemoryObject) getMemoryObject(rightName); if (rightLocation == null) { throw new MalformedProgramException("Alias to non-exist location: " + rightName); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index fd22a22d9c..a991a5d663 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -24,6 +24,7 @@ import com.dat3m.dartagnan.program.event.Tag; import com.dat3m.dartagnan.program.event.core.Label; import com.dat3m.dartagnan.program.event.core.Local; + import static com.google.common.base.Preconditions.checkState; // The trickiest part of handling inline assembly is matching input and output registers on the LLVM side with the registers in the assembly. @@ -93,7 +94,10 @@ // 3. the third asm register is related both to the return register (already above in r11[3] <- asm_3) and to an args register, i.e. asm_3 <- r8 public class VisitorAsmArm extends AsmArmBaseVisitor { - private record CmpInstruction(Expression left, Expression right) {}; + private record CmpInstruction(Expression left, Expression right) { + } + + ; private final List inputAssignments = new ArrayList<>(); private final List asmInstructions = new ArrayList<>(); @@ -139,7 +143,7 @@ public List visitAsm(AsmArmParser.AsmContext ctx) { return events; } - private Expression toPtr(Register r){ + private Expression toPtr(Register r) { return expressions.makeIntToPtrCast(r, pointerType); } @@ -284,7 +288,7 @@ public Object visitCompare(AsmArmParser.CompareContext ctx) { public Object visitCompareBranchNonZero(AsmArmParser.CompareBranchNonZeroContext ctx) { Label label = AsmUtils.getOrNewLabel(labelsDefined, ctx.Numbers().getText()); Register firstRegister = (Register) ctx.register().accept(this); - Expression zero = expressions.makeZero( (IntegerType) firstRegister.getType()); + Expression zero = expressions.makeZero((IntegerType) firstRegister.getType()); Expression expr = expressions.makeIntCmp(firstRegister, IntCmpOp.NEQ, zero); asmInstructions.add(EventFactory.newJump(expr, label)); return null; @@ -335,8 +339,10 @@ public Object visitRegister(AsmArmParser.RegisterContext ctx) { return asmRegisters.get(registerID); } else { // Pick up the correct type and create the new Register - Type registerType = AsmUtils.getLlvmRegisterTypeGivenAsmRegisterID(this.argsRegisters,this.returnRegister,registerID); - if (registerType instanceof PointerType pt) {registerType = typeFactory.getIntegerType(pt.bitWidth);} + Type registerType = AsmUtils.getLlvmRegisterTypeGivenAsmRegisterID(this.argsRegisters, this.returnRegister, registerID); + if (registerType instanceof PointerType pt) { + registerType = typeFactory.getIntegerType(pt.bitWidth); + } String newRegisterName = AsmUtils.makeRegisterName(registerID); Register newRegister = this.llvmFunction.getOrNewRegister(newRegisterName, registerType); if (AsmUtils.isPartOfReturnRegister(this.returnRegister, registerID) && AsmUtils.isReturnRegisterAggregate(this.returnRegister)) { @@ -373,7 +379,7 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx if (!isOutputRegistersInitialized) { isOutputRegistersInitialized = true; if (i == 1) { - outputAssignments.add(EventFactory.newLocal(returnRegister, expressions.makeCast(asmRegisters.get(0),returnRegister.getType()))); + outputAssignments.add(EventFactory.newLocal(returnRegister, expressions.makeCast(asmRegisters.get(0), returnRegister.getType()))); } else { Type aggregateType = returnRegister.getType(); Expression finalAssignExpression = expressions.makeCompatibilityConstruct(aggregateType, this.pendingRegisters); @@ -391,7 +397,7 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx if (isConstraintNumeric(constraint)) { int constraintValue = Integer.parseInt(constraint.getText()); inputAssignments.add(EventFactory.newLocal(asmRegisters.get(constraintValue), - expressions.makeCast(argsRegisters.get(i - AsmUtils.getNumASMReturnRegisters(this.returnRegister)),asmRegisters.get(constraintValue).getType()) + expressions.makeCast(argsRegisters.get(i - AsmUtils.getNumASMReturnRegisters(this.returnRegister)), asmRegisters.get(constraintValue).getType()) )); } } @@ -400,15 +406,15 @@ public Object visitAsmMetadataEntries(AsmArmParser.AsmMetadataEntriesContext ctx @Override public Object visitValue(AsmArmParser.ValueContext ctx) { - if (expectedType instanceof IntegerType t ) { + if (expectedType instanceof IntegerType t) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, t ); + return expressions.makeValue(value, t); } - if ( expectedType instanceof PointerType t) { + if (expectedType instanceof PointerType t) { String valueString = ctx.Numbers().getText(); BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, typeFactory.getIntegerType(t.bitWidth) ); + return expressions.makeValue(value, typeFactory.getIntegerType(t.bitWidth)); } throw new RuntimeException("Unexpected type " + expectedType + " visited"); } @@ -420,26 +426,16 @@ public Object visitArmFence(AsmArmParser.ArmFenceContext ctx) { String option = ctx.FenceArmOpt().getText(); String barrier = type + " " + option; Event fence = switch (barrier) { - case "dmb ish" -> - EventFactory.AArch64.DMB.newISHBarrier(); - case "dmb ishld" -> - EventFactory.AArch64.DMB.newISHLDBarrier(); - case "dmb sy" -> - EventFactory.AArch64.DMB.newSYBarrier(); - case "dmb st" -> - EventFactory.AArch64.DMB.newSTBarrier(); - case "dmb ishst" -> - EventFactory.AArch64.DMB.newISHSTBarrier(); - case "dsb ish" -> - EventFactory.AArch64.DSB.newISHBarrier(); - case "dsb ishld" -> - EventFactory.AArch64.DSB.newISHLDBarrier(); - case "dsb sy" -> - EventFactory.AArch64.DSB.newSYBarrier(); - case "dsb ishst" -> - EventFactory.AArch64.DSB.newISHSTBarrier(); - default -> - throw new ParsingException("Barrier not implemented"); + case "dmb ish" -> EventFactory.AArch64.DMB.newISHBarrier(); + case "dmb ishld" -> EventFactory.AArch64.DMB.newISHLDBarrier(); + case "dmb sy" -> EventFactory.AArch64.DMB.newSYBarrier(); + case "dmb st" -> EventFactory.AArch64.DMB.newSTBarrier(); + case "dmb ishst" -> EventFactory.AArch64.DMB.newISHSTBarrier(); + case "dsb ish" -> EventFactory.AArch64.DSB.newISHBarrier(); + case "dsb ishld" -> EventFactory.AArch64.DSB.newISHLDBarrier(); + case "dsb sy" -> EventFactory.AArch64.DSB.newSYBarrier(); + case "dsb ishst" -> EventFactory.AArch64.DSB.newISHSTBarrier(); + default -> throw new ParsingException("Barrier not implemented"); }; asmInstructions.add(fence); return null; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java index 2403b7c1ae..e11843e794 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java @@ -29,7 +29,10 @@ public class VisitorAsmPPC extends AsmPPCBaseVisitor { - private record CmpInstruction(Expression left, Expression right) {}; + private record CmpInstruction(Expression left, Expression right) { + } + + ; private final List inputAssignments = new ArrayList<>(); private final List asmInstructions = new ArrayList<>(); @@ -61,7 +64,7 @@ public VisitorAsmPPC(Function llvmFunction, Register returnRegister, List - EventFactory.Power.newSyncBarrier(); - case "isync" -> - EventFactory.Power.newISyncBarrier(); - case "lwsync" -> - EventFactory.Power.newLwSyncBarrier(); - default -> - throw new ParsingException("Barrier not implemented"); + case "sync" -> EventFactory.Power.newSyncBarrier(); + case "isync" -> EventFactory.Power.newISyncBarrier(); + case "lwsync" -> EventFactory.Power.newLwSyncBarrier(); + default -> throw new ParsingException("Barrier not implemented"); }; asmInstructions.add(fence); return null; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java index 7dbbc01389..cf38830cba 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmRISCV.java @@ -23,7 +23,7 @@ import com.dat3m.dartagnan.program.event.Tag; import com.dat3m.dartagnan.program.event.core.Label; import com.dat3m.dartagnan.program.event.core.Local; -import static com.google.common.base.Preconditions.checkState; + public class VisitorAsmRISCV extends AsmRISCVBaseVisitor { private final List inputAssignments = new ArrayList<>(); @@ -88,7 +88,7 @@ public Object visitLoad(AsmRISCVParser.LoadContext ctx) { Register address = (Register) ctx.register(1).accept(this); expectedType = address.getType(); Expression offset = (Expression) ctx.value().accept(this); - Expression newAddress = expressions.makePtrAdd(address,offset); + Expression newAddress = expressions.makePtrAdd(address, offset); asmInstructions.add(EventFactory.newLoad(register, newAddress)); return null; } @@ -144,7 +144,7 @@ public Object visitStore(AsmRISCVParser.StoreContext ctx) { Register address = (Register) ctx.register(1).accept(this); expectedType = address.getType(); Expression offset = (Expression) ctx.value().accept(this); - Expression newAddress = expressions.makePtrAdd(address,offset); + Expression newAddress = expressions.makePtrAdd(address, offset); asmInstructions.add(EventFactory.newStore(newAddress, value)); return null; } @@ -205,28 +205,28 @@ public Object visitLabelDefinition(AsmRISCVParser.LabelDefinitionContext ctx) { } @Override - public Object visitNegate(AsmRISCVParser.NegateContext ctx){ + public Object visitNegate(AsmRISCVParser.NegateContext ctx) { // neg $0 $1 -> sub $0, #0, $1 Register destinationRegister = (Register) ctx.register(0).accept(this); Register sourceRegister = (Register) ctx.register(1).accept(this); Expression zero = expressions.makeZero((IntegerType) sourceRegister.getType()); Expression exp = expressions.makeSub(zero, sourceRegister); - asmInstructions.add(EventFactory.newLocal(destinationRegister,exp)); + asmInstructions.add(EventFactory.newLocal(destinationRegister, exp)); return null; } @Override - public Object visitAtomicAdd(AsmRISCVParser.AtomicAddContext ctx){ + public Object visitAtomicAdd(AsmRISCVParser.AtomicAddContext ctx) { throw new UnsupportedOperationException(ctx.AtomicAdd().getText()); } - + @Override - public Object visitAtomicAddRelease(AsmRISCVParser.AtomicAddReleaseContext ctx){ + public Object visitAtomicAddRelease(AsmRISCVParser.AtomicAddReleaseContext ctx) { throw new UnsupportedOperationException(ctx.AtomicAddRelease().getText()); } @Override - public Object visitAtomicAddAcquireRelease(AsmRISCVParser.AtomicAddAcquireReleaseContext ctx){ + public Object visitAtomicAddAcquireRelease(AsmRISCVParser.AtomicAddAcquireReleaseContext ctx) { throw new UnsupportedOperationException(ctx.AtomicAddAcquireRelease().getText()); } @@ -243,7 +243,7 @@ public Object visitRegister(AsmRISCVParser.RegisterContext ctx) { return asmRegisters.get(registerID); } else { // Pick up the correct type and create the new Register - Type registerType = AsmUtils.getLlvmRegisterTypeGivenAsmRegisterID(this.argsRegisters,this.returnRegister,registerID); + Type registerType = AsmUtils.getLlvmRegisterTypeGivenAsmRegisterID(this.argsRegisters, this.returnRegister, registerID); String newRegisterName = AsmUtils.makeRegisterName(registerID); Register newRegister = this.llvmFunction.getOrNewRegister(newRegisterName, registerType); if (AsmUtils.isPartOfReturnRegister(this.returnRegister, registerID) && AsmUtils.isReturnRegisterAggregate(this.returnRegister)) { @@ -305,7 +305,7 @@ public Object visitAsmMetadataEntries(AsmRISCVParser.AsmMetadataEntriesContext c @Override public Object visitRiscvFence(AsmRISCVParser.RiscvFenceContext ctx) { String mo = ctx.fenceOptions().mode; - Event fence = switch(mo) { + Event fence = switch (mo) { case "r r" -> EventFactory.RISCV.newRRFence(); case "r w" -> EventFactory.RISCV.newRWFence(); case "r rw" -> EventFactory.RISCV.newRRWFence(); @@ -325,17 +325,16 @@ public Object visitRiscvFence(AsmRISCVParser.RiscvFenceContext ctx) { @Override public Object visitValue(AsmRISCVParser.ValueContext ctx) { - if (expectedType instanceof IntegerType) { - String valueString = ctx.Numbers().getText(); - BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, (IntegerType) expectedType); - } - else if (expectedType instanceof PointerType){ - String valueString = ctx.Numbers().getText(); - BigInteger value = new BigInteger(valueString); - return expressions.makeValue(value, ((PointerType) expectedType).getBitWidth()); - } + if (expectedType instanceof IntegerType) { + String valueString = ctx.Numbers().getText(); + BigInteger value = new BigInteger(valueString); + return expressions.makeValue(value, (IntegerType) expectedType); + } else if (expectedType instanceof PointerType) { + String valueString = ctx.Numbers().getText(); + BigInteger value = new BigInteger(valueString); + return expressions.makeValue(value, ((PointerType) expectedType).getBitWidth()); + } throw new RuntimeException("Unexpected type " + expectedType + " visited"); -} + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java index c35f479a5c..58ee74d41e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusAArch64.java @@ -29,7 +29,8 @@ public class VisitorLitmusAArch64 extends LitmusAArch64BaseVisitor { - private record CmpInstruction(Expression left, Expression right) {} + private record CmpInstruction(Expression left, Expression right) { + } private final ProgramBuilder programBuilder = ProgramBuilder.forArch(Program.SourceLanguage.LITMUS, Arch.ARM8); private final TypeFactory types = programBuilder.getTypeFactory(); @@ -125,7 +126,7 @@ public Object visitVariableDeclaratorLocationLocation(VariableDeclaratorLocation @Override public Object visitThreadDeclaratorList(ThreadDeclaratorListContext ctx) { - for(ThreadIdContext threadCtx : ctx.threadId()){ + for (ThreadIdContext threadCtx : ctx.threadId()) { programBuilder.newThread(threadCtx.id); threadCount++; } @@ -137,7 +138,7 @@ public Object visitThreadDeclaratorList(ThreadDeclaratorListContext ctx) { @Override public Object visitInstructionRow(InstructionRowContext ctx) { - for(int i = 0; i < threadCount; i++){ + for (int i = 0; i < threadCount; i++) { mainThread = i; visitInstruction(ctx.instruction(i)); } @@ -182,7 +183,7 @@ public Object visitLoad(LoadContext ctx) { final Register register = shrinkRegister(r64, ctx.rD32, inst.halfWordSize, inst.byteSize); final Expression address = parseAddress(ctx.address()); final String mo = inst.acquire ? MO_ACQ : ""; - add(EventFactory.newLoadWithMo(register, expressions.makeCast(address,pointerType), mo)); + add(EventFactory.newLoadWithMo(register, expressions.makeCast(address, pointerType), mo)); addRegister64Update(r64, register); return null; } @@ -299,11 +300,11 @@ public Object visitSwap(SwapContext ctx) { @Override public Object visitBranch(BranchContext ctx) { Label label = programBuilder.getOrCreateLabel(mainThread, ctx.label().getText()); - if(ctx.branchCondition() == null){ + if (ctx.branchCondition() == null) { return add(EventFactory.newGoto(label)); } CmpInstruction cmp = lastCmpInstructionPerThread.put(mainThread, null); - if(cmp == null){ + if (cmp == null) { throw new ParsingException("Invalid syntax near " + ctx.getText()); } Expression expr = expressions.makeIntCmp(cmp.left, ctx.branchCondition().op, cmp.right); @@ -341,7 +342,7 @@ public Object visitReturn(ReturnContext ctx) { @Override public Expression visitExpressionRegister64(ExpressionRegister64Context ctx) { Expression expr = programBuilder.getOrNewRegister(mainThread, ctx.register64().id, i64); - if(ctx.shift() != null){ + if (ctx.shift() != null) { IntLiteral val = parseValue(ctx.shift().immediate().constant(), i64); expr = expressions.makeIntBinary(expr, ctx.shift().shiftOperator().op, val); } @@ -362,7 +363,7 @@ public Expression visitExpressionRegister32(ExpressionRegister32Context ctx) { @Override public Expression visitExpressionImmediate(ExpressionImmediateContext ctx) { Expression expr = parseValue(ctx.immediate().constant(), i64); - if(ctx.shift() != null){ + if (ctx.shift() != null) { IntLiteral val = parseValue(ctx.shift().immediate().constant(), i64); expr = expressions.makeIntBinary(expr, ctx.shift().shiftOperator().op, val); } @@ -389,7 +390,7 @@ private Expression parseExpression(Expr32Context x32, Expr64Context x64) { private Expression parseAddress(AddressContext ctx) { final Register base = programBuilder.getOrErrorRegister(mainThread, ctx.register64().id); if (ctx.offset() == null) { - return expressions.makeCast(base,pointerType); + return expressions.makeCast(base, pointerType); } final ExpressionConversionContext conversion = ctx.offset().expressionConversion(); final Register32Context register32 = conversion == null ? null : conversion.register32(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index f5909de0c2..b891481275 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -46,7 +46,7 @@ public class VisitorLitmusC extends LitmusCBaseVisitor { private boolean isOpenCL = false; private final List threadIds = new ArrayList<>(); - public VisitorLitmusC(){ + public VisitorLitmusC() { } // ---------------------------------------------------------------------------------------------------------------- @@ -85,19 +85,19 @@ public Object visitGlobalDeclaratorLocation(LitmusCParser.GlobalDeclaratorLocati public Object visitGlobalDeclaratorRegister(LitmusCParser.GlobalDeclaratorRegisterContext ctx) { if (ctx.initConstantValue() != null) { IntLiteral value = expressions.parseValue(ctx.initConstantValue().constant().getText(), archType); - programBuilder.initRegEqConst(ctx.threadId().id,ctx.varName().getText(), value); + programBuilder.initRegEqConst(ctx.threadId().id, ctx.varName().getText(), value); } return null; } @Override public Object visitGlobalDeclaratorLocationLocation(LitmusCParser.GlobalDeclaratorLocationLocationContext ctx) { - if(ctx.Ast() == null) { + if (ctx.Ast() == null) { programBuilder.initLocEqLocPtr(ctx.varName(0).getText(), ctx.varName(1).getText()); } else { String rightName = ctx.varName(1).getText(); MemoryObject object = programBuilder.getMemoryObject(rightName); - if(object != null){ + if (object != null) { programBuilder.initLocEqConst(ctx.varName(0).getText(), object); } else { programBuilder.initLocEqLocVal(ctx.varName(0).getText(), ctx.varName(1).getText()); @@ -109,12 +109,12 @@ public Object visitGlobalDeclaratorLocationLocation(LitmusCParser.GlobalDeclarat @Override public Object visitGlobalDeclaratorRegisterLocation(LitmusCParser.GlobalDeclaratorRegisterLocationContext ctx) { // FIXME: We visit declarators before threads, so we need to create threads early - if(ctx.Ast() == null){ + if (ctx.Ast() == null) { programBuilder.initRegEqLocPtr(ctx.threadId().id, ctx.varName(0).getText(), ctx.varName(1).getText()); } else { String rightName = ctx.varName(1).getText(); MemoryObject object = programBuilder.getMemoryObject(rightName); - if(object != null){ + if (object != null) { programBuilder.initRegEqConst(ctx.threadId().id, ctx.varName(0).getText(), object); } else { programBuilder.initRegEqLocVal(ctx.threadId().id, ctx.varName(0).getText(), ctx.varName(1).getText(), pointerType); @@ -128,21 +128,21 @@ public Object visitGlobalDeclaratorArray(LitmusCParser.GlobalDeclaratorArrayCont String name = ctx.varName().getText(); Integer size = ctx.DigitSequence() != null ? Integer.parseInt(ctx.DigitSequence().getText()) : null; - if(ctx.initArray() == null && size != null && size > 0){ - programBuilder.newMemoryObject(name,size); + if (ctx.initArray() == null && size != null && size > 0) { + programBuilder.newMemoryObject(name, size); return null; } - if(ctx.initArray() != null){ - if(size == null || ctx.initArray().arrayElement().size() == size){ + if (ctx.initArray() != null) { + if (size == null || ctx.initArray().arrayElement().size() == size) { List values = new ArrayList<>(); - for(LitmusCParser.ArrayElementContext elCtx : ctx.initArray().arrayElement()){ - if(elCtx.constant() != null){ + for (LitmusCParser.ArrayElementContext elCtx : ctx.initArray().arrayElement()) { + if (elCtx.constant() != null) { values.add(expressions.parseValue(elCtx.constant().getText(), archType)); } else { String varName = elCtx.varName().getText(); //see test/resources/arrays/ok/C-array-ok-17.litmus MemoryObject object = programBuilder.getMemoryObject(varName); - if(object != null){ + if (object != null) { values.add(object); } else { object = programBuilder.getOrNewMemoryObject(varName); @@ -150,9 +150,9 @@ public Object visitGlobalDeclaratorArray(LitmusCParser.GlobalDeclaratorArrayCont } } } - MemoryObject object = programBuilder.newMemoryObject(name,values.size() * archSize); - for(int i = 0; i < values.size(); i++) { - object.setInitialValue(i,values.get(i)); + MemoryObject object = programBuilder.newMemoryObject(name, values.size() * archSize); + for (int i = 0; i < values.size(); i++) { + object.setInitialValue(i, values.get(i)); } return null; } @@ -183,15 +183,15 @@ public Object visitThreadDeclarator(LitmusCParser.ThreadDeclaratorContext ctx) { @Override public Object visitThreadContent(LitmusCParser.ThreadContentContext ctx) { visitThreadArguments(ctx.threadArguments()); - for(LitmusCParser.ExpressionContext expressionContext : ctx.expression()) + for (LitmusCParser.ExpressionContext expressionContext : ctx.expression()) expressionContext.accept(this); return null; } @Override - public Object visitThreadArguments(LitmusCParser.ThreadArgumentsContext ctx){ - if(ctx != null){ - for(LitmusCParser.ThreadArgumentContext threadArgumentContext : ctx.threadArgument()){ + public Object visitThreadArguments(LitmusCParser.ThreadArgumentsContext ctx) { + if (ctx != null) { + for (LitmusCParser.ThreadArgumentContext threadArgumentContext : ctx.threadArgument()) { threadArgumentContext.accept(this); } } @@ -227,37 +227,37 @@ public Object visitIfExpression(LitmusCParser.IfExpressionContext ctx) { Expression expr = (Expression) ctx.re().accept(this); ifId++; - Label elseL = programBuilder.getOrCreateLabel(currentThread,"else_" + ifId); - Label endL = programBuilder.getOrCreateLabel(currentThread,"end_" + ifId); + Label elseL = programBuilder.getOrCreateLabel(currentThread, "else_" + ifId); + Label endL = programBuilder.getOrCreateLabel(currentThread, "end_" + ifId); IfAsJump ifEvent = EventFactory.newIfJumpUnless(expressions.makeBooleanCast(expr), elseL, endL); programBuilder.addChild(currentThread, ifEvent); - for(LitmusCParser.ExpressionContext expressionContext : ctx.expression()) + for (LitmusCParser.ExpressionContext expressionContext : ctx.expression()) expressionContext.accept(this); CondJump jumpToEnd = EventFactory.newGoto(endL); programBuilder.addChild(currentThread, jumpToEnd); programBuilder.addChild(currentThread, elseL); - if(ctx.elseExpression() != null){ + if (ctx.elseExpression() != null) { ctx.elseExpression().accept(this); } programBuilder.addChild(currentThread, endL); return null; } - @Override + @Override public Object visitWhileExpression(LitmusCParser.WhileExpressionContext ctx) { whileId++; - Label headL = programBuilder.getOrCreateLabel(currentThread,"head_" + whileId); - Label endL = programBuilder.getOrCreateLabel(currentThread,"end_" + whileId); + Label headL = programBuilder.getOrCreateLabel(currentThread, "head_" + whileId); + Label endL = programBuilder.getOrCreateLabel(currentThread, "end_" + whileId); programBuilder.addChild(currentThread, headL); Expression expr = (Expression) ctx.re().accept(this); programBuilder.addChild(currentThread, EventFactory.newJumpUnless(expr, endL)); - for(LitmusCParser.ExpressionContext expressionContext : ctx.expression()) { + for (LitmusCParser.ExpressionContext expressionContext : ctx.expression()) { expressionContext.accept(this); } @@ -272,7 +272,7 @@ public Object visitWhileExpression(LitmusCParser.WhileExpressionContext ctx) { // Returns new value (the value after computation) @Override - public Expression visitReAtomicOpReturn(LitmusCParser.ReAtomicOpReturnContext ctx){ + public Expression visitReAtomicOpReturn(LitmusCParser.ReAtomicOpReturnContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = returnExpressionOrOne(ctx.value); Event event = EventFactory.Linux.newRMWOpReturn(getAddress(ctx.address), register, value, ctx.op, ctx.mo); @@ -282,7 +282,7 @@ public Expression visitReAtomicOpReturn(LitmusCParser.ReAtomicOpReturnContext ct // Returns old value (the value before computation) @Override - public Expression visitReAtomicFetchOp(LitmusCParser.ReAtomicFetchOpContext ctx){ + public Expression visitReAtomicFetchOp(LitmusCParser.ReAtomicFetchOpContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = returnExpressionOrOne(ctx.value); Event event = EventFactory.Linux.newRMWFetchOp(getAddress(ctx.address), register, value, ctx.op, ctx.mo); @@ -303,7 +303,7 @@ public Expression visitC11AtomicOp(LitmusCParser.C11AtomicOpContext ctx) { @Override - public Expression visitReAtomicOpAndTest(LitmusCParser.ReAtomicOpAndTestContext ctx){ + public Expression visitReAtomicOpAndTest(LitmusCParser.ReAtomicOpAndTestContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = returnExpressionOrOne(ctx.value); Event event = EventFactory.Linux.newRMWOpAndTest(getAddress(ctx.address), register, value, ctx.op); @@ -313,7 +313,7 @@ public Expression visitReAtomicOpAndTest(LitmusCParser.ReAtomicOpAndTestContext // Returns non-zero if the addition was executed, zero otherwise @Override - public Expression visitReAtomicAddUnless(LitmusCParser.ReAtomicAddUnlessContext ctx){ + public Expression visitReAtomicAddUnless(LitmusCParser.ReAtomicAddUnlessContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression) ctx.value.accept(this); Expression cmp = (Expression) ctx.cmp.accept(this); @@ -344,7 +344,7 @@ public Expression visitReC11AtomicXchgExplicit(LitmusCParser.ReC11AtomicXchgExpl } @Override - public Expression visitReXchg(LitmusCParser.ReXchgContext ctx){ + public Expression visitReXchg(LitmusCParser.ReXchgContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression value = (Expression) ctx.value.accept(this); Event event = EventFactory.Linux.newRMWExchange(getAddress(ctx.address), register, value, ctx.mo); @@ -355,7 +355,7 @@ public Expression visitReXchg(LitmusCParser.ReXchgContext ctx){ @Override public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicitContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); - Expression value = (Expression)ctx.value.accept(this); + Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); String mo = ctx.c11Mo(0).mo; @@ -368,7 +368,7 @@ public Expression visitReC11SCmpXchgExplicit(LitmusCParser.ReC11SCmpXchgExplicit @Override public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); - Expression value = (Expression)ctx.value.accept(this); + Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); Event event = EventFactory.Atomic.newCompareExchange(register, address, expectedAdd, value, @@ -381,7 +381,7 @@ public Expression visitReC11SCmpXchg(LitmusCParser.ReC11SCmpXchgContext ctx) { @Override public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicitContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); - Expression value = (Expression)ctx.value.accept(this); + Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); String mo = ctx.c11Mo(0).mo; @@ -394,7 +394,7 @@ public Expression visitReC11WCmpXchgExplicit(LitmusCParser.ReC11WCmpXchgExplicit @Override public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); - Expression value = (Expression)ctx.value.accept(this); + Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); Expression expectedAdd = getAddress(ctx.expectedAdd); Event event = EventFactory.Atomic.newCompareExchange(register, address, expectedAdd, value, @@ -405,16 +405,17 @@ public Expression visitReC11WCmpXchg(LitmusCParser.ReC11WCmpXchgContext ctx) { } @Override - public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ + public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); - Expression cmp = (Expression)ctx.cmp.accept(this); - Expression value = (Expression)ctx.value.accept(this); + Expression cmp = (Expression) ctx.cmp.accept(this); + Expression value = (Expression) ctx.value.accept(this); Event event = EventFactory.Linux.newRMWCompareExchange(getAddress(ctx.address), register, cmp, value, ctx.mo); programBuilder.addChild(currentThread, event); return register; } - @Override public Expression visitReC11LoadExplicit(LitmusCParser.ReC11LoadExplicitContext ctx) { + @Override + public Expression visitReC11LoadExplicit(LitmusCParser.ReC11LoadExplicitContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression address = getAddress(ctx.address); AtomicLoad event = EventFactory.Atomic.newLoad(register, address, ctx.c11Mo().mo); @@ -423,7 +424,8 @@ public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ return register; } - @Override public Expression visitReC11Load(LitmusCParser.ReC11LoadContext ctx) { + @Override + public Expression visitReC11Load(LitmusCParser.ReC11LoadContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression address = getAddress(ctx.address); AtomicLoad event = EventFactory.Atomic.newLoad(register, address, C11.DEFAULT_MO); @@ -433,7 +435,7 @@ public Expression visitReCmpXchg(LitmusCParser.ReCmpXchgContext ctx){ } @Override - public Expression visitReLoad(LitmusCParser.ReLoadContext ctx){ + public Expression visitReLoad(LitmusCParser.ReLoadContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Event event = EventFactory.Linux.newLKMMLoad(register, getAddress(ctx.address), ctx.mo); programBuilder.addChild(currentThread, event); @@ -441,7 +443,7 @@ public Expression visitReLoad(LitmusCParser.ReLoadContext ctx){ } @Override - public Expression visitReReadOnce(LitmusCParser.ReReadOnceContext ctx){ + public Expression visitReReadOnce(LitmusCParser.ReReadOnceContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Event event = EventFactory.Linux.newLKMMLoad(register, getAddress(ctx.address), ctx.mo); programBuilder.addChild(currentThread, event); @@ -449,7 +451,7 @@ public Expression visitReReadOnce(LitmusCParser.ReReadOnceContext ctx){ } @Override - public Expression visitReReadNa(LitmusCParser.ReReadNaContext ctx){ + public Expression visitReReadNa(LitmusCParser.ReReadNaContext ctx) { Register register = getReReturnRegisterOrDefaultTo(archType); Expression address = getAddress(ctx.address); Load event = EventFactory.newLoadWithMo(register, address, C11.NONATOMIC); @@ -461,34 +463,36 @@ public Expression visitReReadNa(LitmusCParser.ReReadNaContext ctx){ // Return expressions (register for return value is optional) @Override - public Expression visitReOpCompare(LitmusCParser.ReOpCompareContext ctx){ + public Expression visitReOpCompare(LitmusCParser.ReOpCompareContext ctx) { Register register = getOptionalReturnRegister(); - Expression v1 = (Expression)ctx.re(0).accept(this); - Expression v2 = (Expression)ctx.re(1).accept(this); + Expression v1 = (Expression) ctx.re(0).accept(this); + Expression v2 = (Expression) ctx.re(1).accept(this); Expression result = expressions.makeIntCmp(v1, ctx.opCompare().op, v2); return assignToReturnRegister(register, result); } @Override - public Expression visitReOpArith(LitmusCParser.ReOpArithContext ctx){ + public Expression visitReOpArith(LitmusCParser.ReOpArithContext ctx) { Register register = getOptionalReturnRegister(); - Expression v1 = (Expression)ctx.re(0).accept(this); - Expression v2 = (Expression)ctx.re(1).accept(this); + Expression v1 = (Expression) ctx.re(0).accept(this); + Expression v2 = (Expression) ctx.re(1).accept(this); Expression result; assert v2.getType() instanceof IntegerType || v1.getType() instanceof IntegerType; if (ctx.opArith().op == IntBinaryOp.ADD && v1.getType() instanceof PointerType && v2.getType() instanceof IntegerType) { result = expressions.makePtrAdd(v1, v2); - }else if (ctx.opArith().op == IntBinaryOp.ADD && v2.getType() instanceof PointerType && v1.getType() instanceof IntegerType) { + } else if (ctx.opArith().op == IntBinaryOp.ADD && v2.getType() instanceof PointerType && v1.getType() instanceof IntegerType) { result = expressions.makePtrAdd(v2, v1); - } else { result = expressions.makeIntBinary(v1, ctx.opArith().op, v2);} + } else { + result = expressions.makeIntBinary(v1, ctx.opArith().op, v2); + } return assignToReturnRegister(register, result); } @Override - public Expression visitReOpBool(LitmusCParser.ReOpBoolContext ctx){ + public Expression visitReOpBool(LitmusCParser.ReOpBoolContext ctx) { Register register = getOptionalReturnRegister(); - Expression v1 = (Expression)ctx.re(0).accept(this); - Expression v2 = (Expression)ctx.re(1).accept(this); + Expression v1 = (Expression) ctx.re(0).accept(this); + Expression v2 = (Expression) ctx.re(1).accept(this); v1 = expressions.makeBooleanCast(v1); v2 = expressions.makeBooleanCast(v2); Expression result = expressions.makeBoolBinary(v1, ctx.opBool().op, v2); @@ -496,33 +500,33 @@ public Expression visitReOpBool(LitmusCParser.ReOpBoolContext ctx){ } @Override - public Expression visitReOpBoolNot(LitmusCParser.ReOpBoolNotContext ctx){ + public Expression visitReOpBoolNot(LitmusCParser.ReOpBoolNotContext ctx) { Register register = getOptionalReturnRegister(); - Expression v = (Expression)ctx.re().accept(this); + Expression v = (Expression) ctx.re().accept(this); v = expressions.makeBooleanCast(v); Expression result = expressions.makeNot(v); return assignToReturnRegister(register, result); } @Override - public Expression visitReBoolConst(LitmusCParser.ReBoolConstContext ctx){ + public Expression visitReBoolConst(LitmusCParser.ReBoolConstContext ctx) { return expressions.makeValue(ctx.boolConst().value); } @Override - public Expression visitReParenthesis(LitmusCParser.ReParenthesisContext ctx){ - return (Expression)ctx.re().accept(this); + public Expression visitReParenthesis(LitmusCParser.ReParenthesisContext ctx) { + return (Expression) ctx.re().accept(this); } @Override - public Expression visitReCast(LitmusCParser.ReCastContext ctx){ + public Expression visitReCast(LitmusCParser.ReCastContext ctx) { Register register = getOptionalReturnRegister(); - Expression result = (Expression)ctx.re().accept(this); + Expression result = (Expression) ctx.re().accept(this); return assignToReturnRegister(register, result); } @Override - public Expression visitReVarName(LitmusCParser.ReVarNameContext ctx){ + public Expression visitReVarName(LitmusCParser.ReVarNameContext ctx) { Register register = getOptionalReturnRegister(); Expression variable = visitVarName(ctx.varName()); if (variable instanceof Register result) { @@ -532,7 +536,7 @@ public Expression visitReVarName(LitmusCParser.ReVarNameContext ctx){ } @Override - public Expression visitReConst(LitmusCParser.ReConstContext ctx){ + public Expression visitReConst(LitmusCParser.ReConstContext ctx) { Register register = getOptionalReturnRegister(); IntLiteral result = expressions.parseValue(ctx.getText(), archType); return assignToReturnRegister(register, result); @@ -543,16 +547,16 @@ public Expression visitReConst(LitmusCParser.ReConstContext ctx){ // NonReturn expressions (all other return expressions are reduced to these ones) @Override - public Object visitNreAtomicOp(LitmusCParser.NreAtomicOpContext ctx){ + public Object visitNreAtomicOp(LitmusCParser.NreAtomicOpContext ctx) { Expression value = returnExpressionOrOne(ctx.value); Event event = EventFactory.Linux.newRMWOp(getAddress(ctx.address), value, ctx.op); return programBuilder.addChild(currentThread, event); } @Override - public Object visitNreStore(LitmusCParser.NreStoreContext ctx){ - Expression value = (Expression)ctx.value.accept(this); - if(ctx.mo.equals(Tag.Linux.MO_MB)){ + public Object visitNreStore(LitmusCParser.NreStoreContext ctx) { + Expression value = (Expression) ctx.value.accept(this); + if (ctx.mo.equals(Tag.Linux.MO_MB)) { Event event = EventFactory.Linux.newLKMMStore(getAddress(ctx.address), value, Tag.Linux.MO_ONCE); programBuilder.addChild(currentThread, event); return programBuilder.addChild(currentThread, EventFactory.Linux.newMemoryBarrier()); @@ -562,15 +566,15 @@ public Object visitNreStore(LitmusCParser.NreStoreContext ctx){ } @Override - public Object visitNreWriteOnce(LitmusCParser.NreWriteOnceContext ctx){ - Expression value = (Expression)ctx.value.accept(this); + public Object visitNreWriteOnce(LitmusCParser.NreWriteOnceContext ctx) { + Expression value = (Expression) ctx.value.accept(this); Event event = EventFactory.Linux.newLKMMStore(getAddress(ctx.address), value, ctx.mo); return programBuilder.addChild(currentThread, event); } @Override public Object visitNreC11StoreExplicit(LitmusCParser.NreC11StoreExplicitContext ctx) { - Expression value = (Expression)ctx.value.accept(this); + Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); AtomicStore event = EventFactory.Atomic.newStore(address, value, ctx.c11Mo().mo); addScopeTag(event, ctx.openCLScope()); @@ -579,7 +583,7 @@ public Object visitNreC11StoreExplicit(LitmusCParser.NreC11StoreExplicitContext @Override public Object visitNreC11Store(LitmusCParser.NreC11StoreContext ctx) { - Expression value = (Expression)ctx.value.accept(this); + Expression value = (Expression) ctx.value.accept(this); Expression address = getAddress(ctx.address); AtomicStore event = EventFactory.Atomic.newStore(address, value, C11.DEFAULT_MO); addScopeTag(event, null); @@ -587,18 +591,18 @@ public Object visitNreC11Store(LitmusCParser.NreC11StoreContext ctx) { } @Override - public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ - Expression variable = (Expression)ctx.varName().accept(this); - if(ctx.Ast() == null){ - if(variable instanceof Register reg){ + public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx) { + Expression variable = (Expression) ctx.varName().accept(this); + if (ctx.Ast() == null) { + if (variable instanceof Register reg) { returnRegister = reg; ctx.re().accept(this); return null; } throw new ParsingException("Invalid syntax near " + ctx.getText()); } - Expression value = (Expression)ctx.re().accept(this); - if(variable instanceof MemoryObject || variable instanceof Register){ + Expression value = (Expression) ctx.re().accept(this); + if (variable instanceof MemoryObject || variable instanceof Register) { Event event = EventFactory.newStoreWithMo(expressions.makeCast(variable, pointerType), value, C11.NONATOMIC); if (isOpenCL) { event.addTags(Tag.OpenCL.DEFAULT_WEAK_SCOPE); @@ -609,10 +613,10 @@ public Object visitNreAssignment(LitmusCParser.NreAssignmentContext ctx){ } @Override - public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx){ - if(programBuilder.getRegister(scope, ctx.varName().getText()) == null){ + public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx) { + if (programBuilder.getRegister(scope, ctx.varName().getText()) == null) { Register register = programBuilder.getOrNewRegister(scope, ctx.varName().getText(), parseNreDeclarationType(ctx)); - if(ctx.re() != null){ + if (ctx.re() != null) { returnRegister = register; ctx.re().accept(this); } @@ -623,8 +627,11 @@ public Object visitNreRegDeclaration(LitmusCParser.NreRegDeclarationContext ctx) // helper private Type parseNreDeclarationType(LitmusCParser.NreRegDeclarationContext ctx) { - if (ctx.typeSpecifier().Ast().isEmpty()) {return archType;} - else {return pointerType;} + if (ctx.typeSpecifier().Ast().isEmpty()) { + return archType; + } else { + return pointerType; + } } @Override @@ -634,12 +641,12 @@ public Object visitNreC11Fence(LitmusCParser.NreC11FenceContext ctx) { } @Override - public Object visitNreFence(LitmusCParser.NreFenceContext ctx){ + public Object visitNreFence(LitmusCParser.NreFenceContext ctx) { return programBuilder.addChild(currentThread, EventFactory.Linux.newLKMMFence(ctx.name)); } @Override - public Object visitNreOpenCLFence(LitmusCParser.NreOpenCLFenceContext ctx){ + public Object visitNreOpenCLFence(LitmusCParser.NreOpenCLFenceContext ctx) { AtomicThreadFence fence = EventFactory.Atomic.newFence(ctx.c11Mo().mo); if (ctx.openCLScope() != null) { fence.addTags(ctx.openCLScope().scope); @@ -653,7 +660,7 @@ public Object visitNreOpenCLFence(LitmusCParser.NreOpenCLFenceContext ctx){ } @Override - public Object visitNreOpenCLBarrier(LitmusCParser.NreOpenCLBarrierContext ctx){ + public Object visitNreOpenCLBarrier(LitmusCParser.NreOpenCLBarrierContext ctx) { List flags = ctx.openCLFenceFlags().openCLFenceFlag().stream().map(f -> f.flag).toList(); String barrierScope = ctx.openCLScope() != null ? ctx.openCLScope().scope : Tag.OpenCL.WORK_GROUP; String name = String.format("barrier(%s.%s)", ctx.openCLFenceFlags().getText(), barrierScope).toLowerCase(); @@ -687,14 +694,14 @@ public Object visitNreSrcuSync(LitmusCParser.NreSrcuSyncContext ctx) { // problem here @Override - public Expression visitVarName(LitmusCParser.VarNameContext ctx){ - if(scope > -1){ + public Expression visitVarName(LitmusCParser.VarNameContext ctx) { + if (scope > -1) { Register register = programBuilder.getRegister(scope, ctx.getText()); - if(register != null){ + if (register != null) { return register; } MemoryObject object = programBuilder.getMemoryObject(ctx.getText()); - if(object != null){ + if (object != null) { register = programBuilder.getOrNewRegister(scope, null, archType); programBuilder.addChild(currentThread, EventFactory.newLoadWithMo(register, object, C11.NONATOMIC)); return register; @@ -707,14 +714,14 @@ public Expression visitVarName(LitmusCParser.VarNameContext ctx){ return register; } - private Expression getAddress(LitmusCParser.ReContext ctx){ - Expression address = (Expression)ctx.accept(this); - if(address.getType() instanceof IntegerType){ + private Expression getAddress(LitmusCParser.ReContext ctx) { + Expression address = (Expression) ctx.accept(this); + if (address.getType() instanceof IntegerType) { // todo reg default type is sometimes wrong ==> cast for now logger.warn("Integer used as address."); return expressions.makeIntToPtrCast(address); } - if(address.getType() instanceof PointerType){ + if (address.getType() instanceof PointerType) { return address; } throw new ParsingException("Invalid syntax near " + ctx.getText()); @@ -725,14 +732,15 @@ private Expression returnExpressionOrOne(LitmusCParser.ReContext ctx) { return ctx != null ? (Expression) ctx.accept(this) : expressions.makeOne(archType); } - private Register getOptionalReturnRegister(){ + private Register getOptionalReturnRegister() { Register register = returnRegister; returnRegister = null; return register; } - private Register getReReturnRegisterOrDefaultTo(Type defaultType){ + + private Register getReReturnRegisterOrDefaultTo(Type defaultType) { Register register = returnRegister; - if(register == null){ + if (register == null) { logger.warn("Default register type used in a returning expression."); return programBuilder.getOrNewRegister(scope, null, defaultType); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java index a4d4646c46..abb751ee40 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPPC.java @@ -16,15 +16,20 @@ import com.dat3m.dartagnan.program.Program; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.EventFactory; + import static com.dat3m.dartagnan.program.event.FenceNameRepository.ISYNC; import static com.dat3m.dartagnan.program.event.FenceNameRepository.LWSYNC; import static com.dat3m.dartagnan.program.event.FenceNameRepository.SYNC; + import com.dat3m.dartagnan.program.event.core.Label; import com.google.common.collect.ImmutableSet; public class VisitorLitmusPPC extends LitmusPPCBaseVisitor { - private record CmpInstruction(Expression left, Expression right) {}; + private record CmpInstruction(Expression left, Expression right) { + } + + ; private final static ImmutableSet fences = ImmutableSet.of(SYNC, LWSYNC, ISYNC); private final ProgramBuilder programBuilder = ProgramBuilder.forArch(Program.SourceLanguage.LITMUS, Arch.POWER); @@ -86,7 +91,7 @@ public Object visitVariableDeclaratorLocationLocation(LitmusPPCParser.VariableDe @Override public Object visitThreadDeclaratorList(LitmusPPCParser.ThreadDeclaratorListContext ctx) { - for(LitmusPPCParser.ThreadIdContext threadCtx : ctx.threadId()){ + for (LitmusPPCParser.ThreadIdContext threadCtx : ctx.threadId()) { programBuilder.newThread(threadCtx.id); threadCount++; } @@ -99,7 +104,7 @@ public Object visitThreadDeclaratorList(LitmusPPCParser.ThreadDeclaratorListCont @Override public Object visitInstructionRow(LitmusPPCParser.InstructionRowContext ctx) { - for(int i = 0; i < threadCount; i++){ + for (int i = 0; i < threadCount; i++) { mainThread = i; visitInstruction(ctx.instruction(i)); } @@ -195,10 +200,10 @@ public Object visitBranchCond(LitmusPPCParser.BranchCondContext ctx) { Label label = programBuilder.getOrCreateLabel(mainThread, ctx.Label().getText()); CmpInstruction cmp = lastCmpInstructionPerThread.put(mainThread, null); Expression expr = cmp == null ? - // In PPC, when there is no previous comparison instruction, - // the value of r0 is used as the branching condition - expressions.makeBooleanCast(programBuilder.getOrNewRegister(mainThread, "r0",archType)) : - expressions.makeIntCmp(cmp.left, ctx.cond().op, cmp.right); + // In PPC, when there is no previous comparison instruction, + // the value of r0 is used as the branching condition + expressions.makeBooleanCast(programBuilder.getOrNewRegister(mainThread, "r0", archType)) : + expressions.makeIntCmp(cmp.left, ctx.cond().op, cmp.right); return programBuilder.addChild(mainThread, EventFactory.newJump(expr, label)); } @@ -210,7 +215,7 @@ public Object visitLabel(LitmusPPCParser.LabelContext ctx) { @Override public Object visitFence(LitmusPPCParser.FenceContext ctx) { String name = ctx.getText().toLowerCase(); - if(fences.contains(name)){ + if (fences.contains(name)) { return programBuilder.addChild(mainThread, EventFactory.newFence(name)); } throw new ParsingException("Unrecognised fence " + name); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java index 806ccde72c..8bf1810158 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusPTX.java @@ -239,7 +239,7 @@ public Object visitAtomCAS(LitmusPTXParser.AtomCASContext ctx) { return programBuilder.addChild(mainThread, atom); } - @Override + @Override public Object visitAtomExchange(LitmusPTXParser.AtomExchangeContext ctx) { Register register_destination = programBuilder.getOrNewRegister(mainThread, ctx.register().getText(), archType); MemoryObject object = programBuilder.getOrNewVirtualMemoryObject(ctx.location().getText()); @@ -310,7 +310,7 @@ public Object visitBarrier(LitmusPTXParser.BarrierContext ctx) { } barrier = EventFactory.newNamedBarrier(name, instanceId, Tag.PTX.CTA, id, quorum); } - if(ctx.barrierMode().Arrive() != null) { + if (ctx.barrierMode().Arrive() != null) { barrier.addTags(Tag.PTX.ARRIVE); } return programBuilder.addChild(mainThread, barrier); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java index 9f5a6e5a23..6cda71e7ea 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusRISCV.java @@ -1,6 +1,7 @@ package com.dat3m.dartagnan.parsers.program.visitors; import java.util.Arrays; + import com.dat3m.dartagnan.configuration.Arch; import com.dat3m.dartagnan.exception.ParsingException; import com.dat3m.dartagnan.expression.Expression; @@ -31,7 +32,7 @@ public class VisitorLitmusRISCV extends LitmusRISCVBaseVisitor { private int mainThread; private int threadCount = 0; - public VisitorLitmusRISCV(){ + public VisitorLitmusRISCV() { } // ---------------------------------------------------------------------------------------------------------------- @@ -79,7 +80,7 @@ public Object visitVariableDeclaratorLocationLocation(LitmusRISCVParser.Variable // Thread declarator list (on top of instructions), e.g. " P0 | P1 | P2 ;" @Override public Object visitThreadDeclaratorList(LitmusRISCVParser.ThreadDeclaratorListContext ctx) { - for(LitmusRISCVParser.ThreadIdContext threadCtx : ctx.threadId()){ + for (LitmusRISCVParser.ThreadIdContext threadCtx : ctx.threadId()) { programBuilder.newThread(threadCtx.id); threadCount++; } @@ -90,49 +91,49 @@ public Object visitThreadDeclaratorList(LitmusRISCVParser.ThreadDeclaratorListCo // Instruction list (the program itself) @Override public Object visitInstructionRow(LitmusRISCVParser.InstructionRowContext ctx) { - for(int i = 0; i < threadCount; i++){ + for (int i = 0; i < threadCount; i++) { mainThread = i; visitInstruction(ctx.instruction(i)); } return null; } - @Override - public Object visitLi(LitmusRISCVParser.LiContext ctx) { + @Override + public Object visitLi(LitmusRISCVParser.LiContext ctx) { Register register = programBuilder.getOrNewRegister(mainThread, ctx.register().getText(), archType); IntLiteral constant = expressions.parseValue(ctx.constant().getText(), archType); return programBuilder.addChild(mainThread, EventFactory.newLocal(register, constant)); - } + } - @Override - public Object visitXor(LitmusRISCVParser.XorContext ctx) { + @Override + public Object visitXor(LitmusRISCVParser.XorContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeIntXor(r2, r3))); - } + } - @Override - public Object visitAnd(LitmusRISCVParser.AndContext ctx) { + @Override + public Object visitAnd(LitmusRISCVParser.AndContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeIntAnd(r2, r3))); - } + } - @Override - public Object visitOr(LitmusRISCVParser.OrContext ctx) { + @Override + public Object visitOr(LitmusRISCVParser.OrContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); Register r3 = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeIntOr(r2, r3))); - } + } - @Override - public Object visitAdd(LitmusRISCVParser.AddContext ctx) { + @Override + public Object visitAdd(LitmusRISCVParser.AddContext ctx) { // todo the problem here is pointer addition saved to int reg Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); @@ -140,91 +141,91 @@ public Object visitAdd(LitmusRISCVParser.AddContext ctx) { return programBuilder.addChild( mainThread, EventFactory.newLocal(r1, expressions.makeCast( - expressions.makeAdd(expressions.makeIntegerCast(r2,archType,false), - expressions.makeIntegerCast(r3,archType,false)),r1.getType()))); + expressions.makeAdd(expressions.makeIntegerCast(r2, archType, false), + expressions.makeIntegerCast(r3, archType, false)), r1.getType()))); - } + } - @Override - public Object visitXori(LitmusRISCVParser.XoriContext ctx) { + @Override + public Object visitXori(LitmusRISCVParser.XoriContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); IntLiteral constant = expressions.parseValue(ctx.constant().getText(), archType); return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeIntXor(r2, constant))); - } + } - @Override - public Object visitAndi(LitmusRISCVParser.AndiContext ctx) { + @Override + public Object visitAndi(LitmusRISCVParser.AndiContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); IntLiteral constant = expressions.parseValue(ctx.constant().getText(), archType); return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeIntAnd(r2, constant))); - } + } - @Override - public Object visitOri(LitmusRISCVParser.OriContext ctx) { + @Override + public Object visitOri(LitmusRISCVParser.OriContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrNewRegister(mainThread, ctx.register(1).getText(), archType); IntLiteral constant = expressions.parseValue(ctx.constant().getText(), archType); return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeIntOr(r2, constant))); - } + } - @Override - public Object visitAddi(LitmusRISCVParser.AddiContext ctx) { + @Override + public Object visitAddi(LitmusRISCVParser.AddiContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrNewRegister(mainThread, ctx.register(1).getText(), archType); IntLiteral constant = expressions.parseValue(ctx.constant().getText(), archType); return programBuilder.addChild(mainThread, EventFactory.newLocal(r1, expressions.makeAdd(r2, constant))); - } + } - @Override - public Object visitLw(LitmusRISCVParser.LwContext ctx) { + @Override + public Object visitLw(LitmusRISCVParser.LwContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); - return programBuilder.addChild(mainThread, EventFactory.newLoadWithMo(r1, expressions.makePtrCast(ra,pointerType), getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); - } + return programBuilder.addChild(mainThread, EventFactory.newLoadWithMo(r1, expressions.makePtrCast(ra, pointerType), getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + } - @Override - public Object visitSw(LitmusRISCVParser.SwContext ctx) { + @Override + public Object visitSw(LitmusRISCVParser.SwContext ctx) { Register r1 = programBuilder.getOrErrorRegister(mainThread, ctx.register(0).getText()); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); - return programBuilder.addChild(mainThread, EventFactory.newStoreWithMo(expressions.makePtrCast(ra,pointerType), r1, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); - } + return programBuilder.addChild(mainThread, EventFactory.newStoreWithMo(expressions.makePtrCast(ra, pointerType), r1, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + } - @Override - public Object visitLr(LitmusRISCVParser.LrContext ctx) { + @Override + public Object visitLr(LitmusRISCVParser.LrContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(1).getText()); - return programBuilder.addChild(mainThread, EventFactory.newRMWLoadExclusiveWithMo(r1, expressions.makePtrCast(ra,pointerType), getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); - } + return programBuilder.addChild(mainThread, EventFactory.newRMWLoadExclusiveWithMo(r1, expressions.makePtrCast(ra, pointerType), getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + } - @Override - public Object visitSc(LitmusRISCVParser.ScContext ctx) { + @Override + public Object visitSc(LitmusRISCVParser.ScContext ctx) { Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrNewRegister(mainThread, ctx.register(1).getText(), archType); Register ra = programBuilder.getOrErrorRegister(mainThread, ctx.register(2).getText()); - return programBuilder.addChild(mainThread, EventFactory.Common.newExclusiveStore(r1, expressions.makePtrCast(ra,pointerType), r2, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); - } + return programBuilder.addChild(mainThread, EventFactory.Common.newExclusiveStore(r1, expressions.makePtrCast(ra, pointerType), r2, getMo(ctx.moRISCV(0), ctx.moRISCV(1)))); + } - @Override - public Object visitLabel(LitmusRISCVParser.LabelContext ctx) { - return programBuilder.addChild(mainThread, programBuilder.getOrCreateLabel(mainThread, ctx.Label().getText())); - } + @Override + public Object visitLabel(LitmusRISCVParser.LabelContext ctx) { + return programBuilder.addChild(mainThread, programBuilder.getOrCreateLabel(mainThread, ctx.Label().getText())); + } - @Override - public Object visitBranchCond(LitmusRISCVParser.BranchCondContext ctx) { + @Override + public Object visitBranchCond(LitmusRISCVParser.BranchCondContext ctx) { Label label = programBuilder.getOrCreateLabel(mainThread, ctx.Label().getText()); Register r1 = programBuilder.getOrNewRegister(mainThread, ctx.register(0).getText(), archType); Register r2 = programBuilder.getOrNewRegister(mainThread, ctx.register(1).getText(), archType); Expression expr = expressions.makeIntCmp(r1, ctx.cond().op, r2); return programBuilder.addChild(mainThread, EventFactory.newJump(expr, label)); - } + } - @Override - public Object visitFence(LitmusRISCVParser.FenceContext ctx) { + @Override + public Object visitFence(LitmusRISCVParser.FenceContext ctx) { String mo = ctx.fenceMode().mode; - Event fence = switch(mo) { + Event fence = switch (mo) { case "r.r" -> EventFactory.RISCV.newRRFence(); case "r.w" -> EventFactory.RISCV.newRWFence(); case "r.rw" -> EventFactory.RISCV.newRRWFence(); @@ -238,29 +239,30 @@ public Object visitFence(LitmusRISCVParser.FenceContext ctx) { case "i" -> EventFactory.RISCV.newSynchronizeFence(); default -> throw new ParsingException("Invalid fence mode " + mo); }; - return programBuilder.addChild(mainThread, fence); - } + return programBuilder.addChild(mainThread, fence); + } + + @Override + public Object visitAmoadd(LitmusRISCVParser.AmoaddContext ctx) { + throw new ParsingException("No support for amoadd instructions"); + } - @Override - public Object visitAmoadd(LitmusRISCVParser.AmoaddContext ctx) { - throw new ParsingException("No support for amoadd instructions"); + @Override + public Object visitAmoor(LitmusRISCVParser.AmoorContext ctx) { + throw new ParsingException("No support for amoor instructions"); } - @Override - public Object visitAmoor(LitmusRISCVParser.AmoorContext ctx) { - throw new ParsingException("No support for amoor instructions"); } - - @Override - public Object visitAmoswap(LitmusRISCVParser.AmoswapContext ctx) { - throw new ParsingException("No support for amoswap instructions"); - } - - // ======================================= - // ================ Utils ================ - // ======================================= - private String getMo(LitmusRISCVParser.MoRISCVContext mo1, LitmusRISCVParser.MoRISCVContext mo2) { - String moR = mo1 != null ? mo1.mo : ""; - String moW = mo2 != null ? mo2.mo : ""; - return !moR.isEmpty() ? (!moW.isEmpty() ? Tag.RISCV.MO_ACQ_REL : moR) : moW; - } + @Override + public Object visitAmoswap(LitmusRISCVParser.AmoswapContext ctx) { + throw new ParsingException("No support for amoswap instructions"); + } + + // ======================================= + // ================ Utils ================ + // ======================================= + private String getMo(LitmusRISCVParser.MoRISCVContext mo1, LitmusRISCVParser.MoRISCVContext mo2) { + String moR = mo1 != null ? mo1.mo : ""; + String moW = mo2 != null ? mo2.mo : ""; + return !moR.isEmpty() ? (!moW.isEmpty() ? Tag.RISCV.MO_ACQ_REL : moR) : moW; + } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java index a7019f2c82..1e3df09ccd 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusVulkan.java @@ -332,7 +332,7 @@ private String getMemoryOrderOrDefault(ParserRuleContext ctx, String defaultMo) if (ctx.getRuleContext(LitmusVulkanParser.MoAcqContext.class, 0) != null) { return Tag.Vulkan.ACQUIRE; } - if(ctx.getRuleContext(LitmusVulkanParser.MoRelContext.class, 0) != null) { + if (ctx.getRuleContext(LitmusVulkanParser.MoRelContext.class, 0) != null) { return Tag.Vulkan.RELEASE; } if (ctx.getRuleContext(LitmusVulkanParser.MoAcqRelContext.class, 0) != null) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java index f84d804ddf..6d476c4415 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusX86.java @@ -28,7 +28,7 @@ public class VisitorLitmusX86 extends LitmusX86BaseVisitor { private int mainThread; private int threadCount = 0; - public VisitorLitmusX86(){ + public VisitorLitmusX86() { } // ---------------------------------------------------------------------------------------------------------------- @@ -79,7 +79,7 @@ public Object visitVariableDeclaratorLocationLocation(LitmusX86Parser.VariableDe @Override public Object visitThreadDeclaratorList(LitmusX86Parser.ThreadDeclaratorListContext ctx) { - for(LitmusX86Parser.ThreadIdContext threadCtx : ctx.threadId()){ + for (LitmusX86Parser.ThreadIdContext threadCtx : ctx.threadId()) { programBuilder.newThread(threadCtx.id); threadCount++; } @@ -92,7 +92,7 @@ public Object visitThreadDeclaratorList(LitmusX86Parser.ThreadDeclaratorListCont @Override public Object visitInstructionRow(LitmusX86Parser.InstructionRowContext ctx) { - for(int i = 0; i < threadCount; i++){ + for (int i = 0; i < threadCount; i++) { mainThread = i; visitInstruction(ctx.instruction(i)); } @@ -167,7 +167,7 @@ public Object visitAddRegisterValue(LitmusX86Parser.AddRegisterValueContext ctx) @Override public Object visitFence(LitmusX86Parser.FenceContext ctx) { String name = ctx.getText().toLowerCase(); - if(fences.contains(name)) { + if (fences.contains(name)) { return programBuilder.addChild(mainThread, EventFactory.newFence(name)); } throw new ParsingException("Unrecognised fence " + name); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index 452a75697c..ab02dfdbde 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -273,8 +273,8 @@ public Expression visitGlobalDef(GlobalDefContext ctx) { final boolean isExternal = ctx.externalLinkage() != null; final boolean hasInitializer = ctx.constant() != null; - check (!(isExternal && hasInitializer), "External global cannot have initializer: %s", ctx); - check (isExternal || hasInitializer, "Global without initializer; %s", ctx); + check(!(isExternal && hasInitializer), "External global cannot have initializer: %s", ctx); + check(isExternal || hasInitializer, "Global without initializer; %s", ctx); final Expression value; value = hasInitializer ? checkExpression(type, ctx.constant()) : program.newConstant(type); @@ -299,7 +299,7 @@ private List parseMetadataAttachment(List m final List metadata = new ArrayList<>(); //FIXME: This code only looks for DILocation metadata, // and it only extracts the information needed to construct SourceLocation metadata - for (MetadataAttachmentContext metadataCtx: metadataAttachmentContexts) { + for (MetadataAttachmentContext metadataCtx : metadataAttachmentContexts) { MdNode mdNode = (MdNode) metadataCtx.accept(this); assert mdNode instanceof MdReference; mdNode = metadataSymbolTable.get(((MdReference) mdNode).mdName()); @@ -390,18 +390,18 @@ public Expression visitCallInst(CallInstContext ctx) { ); Optional> events = Optional.empty(); boolean unsupportedEncountered = false; - for(ParserAsm parser : parsers){ + for (ParserAsm parser : parsers) { // we have to generate the stream each time as the parser consumes it CharStream charStream = CharStreams.fromString(asmCode); try { - events = tryParse(parser,charStream); - if(events.isPresent()){ + events = tryParse(parser, charStream); + if (events.isPresent()) { block.events.addAll(events.get()); break; } } catch (UnsupportedOperationException e) { logger.warn("Support for inline assembly instruction '{}' is not available for parser '{}'. Setting non deterministic value ", e.getMessage(), parser.getClass().getSimpleName()); - if(resultRegister != null){ + if (resultRegister != null) { Event nonDeterministicValue = EventFactory.Svcomp.newNonDetChoice(resultRegister); events = Optional.of(List.of(nonDeterministicValue)); } @@ -409,9 +409,9 @@ public Expression visitCallInst(CallInstContext ctx) { break; } } - if(!unsupportedEncountered && events.isEmpty()){ + if (!unsupportedEncountered && events.isEmpty()) { String msg = "Ignoring call."; - if(resultRegister != null){ + if (resultRegister != null) { block.events.add(EventFactory.Svcomp.newNonDetChoice(resultRegister)); msg = "Setting non deterministic value."; } @@ -539,7 +539,7 @@ public Expression visitAllocaInst(AllocaInstContext ctx) { sizeExpression = checkExpression(sizeType, ctx.typeValue().value()); } final Event alloc; - if(ctx.align() != null) { + if (ctx.align() != null) { final Expression alignmentExpression = expressions.makeValue(parseBigInteger(ctx.align().IntLit()), types.getArchType()); alloc = EventFactory.newAlignedAlloc(register, elementType, sizeExpression, alignmentExpression, false, false); } else { @@ -786,7 +786,8 @@ public Expression visitAtomicRMWInst(AtomicRMWInstContext ctx) { case "or" -> IntBinaryOp.OR; case "xor" -> IntBinaryOp.XOR; //TODO nand, min, umin, max, umax, uinc_wrap, udec_wrap, fadd, fsub, fmax, fmin - default -> throw new UnsupportedOperationException(String.format("Unknown atomic operand %s.", ctx.getText())); + default -> + throw new UnsupportedOperationException(String.format("Unknown atomic operand %s.", ctx.getText())); }; event = Llvm.newRMW(register, address, operand, op, mo); } @@ -1296,12 +1297,12 @@ public Expression visitColumnField(ColumnFieldContext ctx) { @Override public Expression visitScopeField(ScopeFieldContext ctx) { - return new NamedMdNode("scope", (MdNode)visitMdField(ctx.mdField())); + return new NamedMdNode("scope", (MdNode) visitMdField(ctx.mdField())); } @Override public Expression visitFileField(FileFieldContext ctx) { - return new NamedMdNode("file", (MdNode)visitMdField(ctx.mdField())); + return new NamedMdNode("file", (MdNode) visitMdField(ctx.mdField())); } @Override @@ -1347,12 +1348,12 @@ private BigInteger parseBigInteger(TerminalNode node) { // Prefix "u" is used to force interpreting them as hexa ints // https://stackoverflow.com/questions/16310509/is-it-possible-to-specify-a-hexadecimal-number-in-llvm-ir-code if (nodeString.startsWith("u0x")) { - radix = 16; - // Get rid of u0x prefix - valueString = nodeString.substring(3); + radix = 16; + // Get rid of u0x prefix + valueString = nodeString.substring(3); } else { - radix = 10; - valueString = nodeString; + radix = 10; + valueString = nodeString; } return new BigInteger(valueString, radix); } @@ -1425,7 +1426,8 @@ private static String adjustRegisterName(String original) { return "r" + original; } - private record Block(String name, Label label, List events) {} + private record Block(String name, Label label, List events) { + } // ---------------------------------------------------------------------------------------------------------------- // Metadata nodes that reflect LLVM's notion of metadata @@ -1433,42 +1435,73 @@ private record Block(String name, Label label, List events) {} private interface MdNode extends Expression { Type TYPE = new Type() { - @Override public int hashCode() { return -1; } + @Override + public int hashCode() { + return -1; + } }; ExpressionKind MdKind = new ExpressionKind() { @Override - public String getSymbol() { return "Md"; } + public String getSymbol() { + return "Md"; + } + @Override - public String getName() { return "Metadata"; } + public String getName() { + return "Metadata"; + } + @Override - public String toString() { return getName(); } + public String toString() { + return getName(); + } }; @Override - default Type getType() { return TYPE; } + default Type getType() { + return TYPE; + } + @Override - default ImmutableSet getRegs() { throw new UnsupportedOperationException(); } + default ImmutableSet getRegs() { + throw new UnsupportedOperationException(); + } + @Override - default T accept(ExpressionVisitor visitor) { throw new UnsupportedOperationException(); } + default T accept(ExpressionVisitor visitor) { + throw new UnsupportedOperationException(); + } + @Override - default ImmutableList getOperands() { return ImmutableList.of(); } + default ImmutableList getOperands() { + return ImmutableList.of(); + } + @Override - default ExpressionKind getKind() { return MdKind; } + default ExpressionKind getKind() { + return MdKind; + } } private static final MdNode MD_NULL = new MdNode() { @Override - public String toString() { return "NULL"; } + public String toString() { + return "NULL"; + } }; private static final MdNode MD_NOT_PARSED = new MdNode() { @Override - public String toString() { return "NOT PARSED"; } + public String toString() { + return "NOT PARSED"; + } }; private record MdReference(String mdName) implements MdNode { @Override - public String toString() { return mdName; } + public String toString() { + return mdName; + } } private record MdGenericValue(T value) implements MdNode { @@ -1476,18 +1509,25 @@ private record MdGenericValue(T value) implements MdNode { // This node should only hold values external to the MdNode hierarchy. Preconditions.checkArgument(!(value instanceof MdNode)); } + @Override - public String toString() { return value.toString(); } + public String toString() { + return value.toString(); + } } private record MdTuple(List mdFields) implements MdNode { - public String toString() { return mdFields.stream().map(Object::toString) - .collect(Collectors.joining(", ", "!{", "}")); } + public String toString() { + return mdFields.stream().map(Object::toString) + .collect(Collectors.joining(", ", "!{", "}")); + } } private record NamedMdNode(String name, MdNode node) implements MdNode { @Override - public String toString() { return String.format("%s: %s", name, node); } + public String toString() { + return String.format("%s: %s", name, node); + } } private record SpecialMdTupleNode(Type nodeType, List namedMDFields) implements MdNode { @@ -1508,7 +1548,7 @@ public String toString() { public Optional getField(String fieldName) { for (NamedMdNode field : namedMDFields) { if (field.name().equals(fieldName)) { - return Optional.of((T)field.node()); + return Optional.of((T) field.node()); } } return Optional.empty(); @@ -1517,11 +1557,12 @@ public Optional getField(String fieldName) { // ---------------------------------------------------------------------------------------------------------------- // Helper to parse inline asm code - private Optional> tryParse(ParserAsm parser, CharStream asmCode) throws ProgramProcessingException{ - try{ + private Optional> tryParse(ParserAsm parser, CharStream asmCode) throws ProgramProcessingException { + try { List events = parser.parse(asmCode); return (events != null) ? Optional.of(events) : Optional.empty(); - } catch (ParsingException e){} + } catch (ParsingException e) { + } return Optional.empty(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java index b09a77ff25..327bb2a675 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/spirv/VisitorOpsConversion.java @@ -43,7 +43,7 @@ public Event visitOpBitcast(SpirvParser.OpBitcastContext ctx) { if (resultType instanceof ScopedPointerType scpPointerType1 && operandType instanceof ScopedPointerType scpPointerType2 && !(scpPointerType1.getScopeId().equals(scpPointerType2.getScopeId()))) { - throw new ParsingException("Storage class mismatch in OpBitcast between '%s' and '%s' for id '%s'", typeId, operand, id); + throw new ParsingException("Storage class mismatch in OpBitcast between '%s' and '%s' for id '%s'", typeId, operand, id); } Expression convertedExpr = expressions.makeCast(operandExpr, resultType); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/witness/ParserWitness.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/witness/ParserWitness.java index 04ae23c7bc..fb492830e7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/witness/ParserWitness.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/witness/ParserWitness.java @@ -18,10 +18,10 @@ public class ParserWitness { - private static final Logger logger = LoggerFactory.getLogger(ParserWitness.class); + private static final Logger logger = LoggerFactory.getLogger(ParserWitness.class); public WitnessGraph parse(CharStream charStream) { - XMLLexer lexer = new XMLLexer(charStream); + XMLLexer lexer = new XMLLexer(charStream); lexer.addErrorListener(new AbortErrorListener()); lexer.addErrorListener(new DiagnosticErrorListener(true)); CommonTokenStream tokenStream = new CommonTokenStream(lexer); @@ -33,19 +33,19 @@ public WitnessGraph parse(CharStream charStream) { VisitorXML visitor = new VisitorXML(); WitnessGraph graph = (WitnessGraph) parserEntryPoint.accept(visitor); - if(graph.hasAttributed("producer")) { - logger.info("Witness graph produced by " + graph.getAttributed("producer")); - } - logger.info("Witness graph stats: #Nodes " + graph.getNodes().size()); - logger.info("Witness graph stats: #Edges " + graph.getEdges().size()); + if (graph.hasAttributed("producer")) { + logger.info("Witness graph produced by " + graph.getAttributed("producer")); + } + logger.info("Witness graph stats: #Nodes " + graph.getNodes().size()); + logger.info("Witness graph stats: #Edges " + graph.getEdges().size()); return graph; } - + public WitnessGraph parse(String raw) { - return parse(CharStreams.fromString(raw)); + return parse(CharStreams.fromString(raw)); } - + public WitnessGraph parse(File file) throws IOException { CharStream charStream; try (FileInputStream stream = new FileInputStream(file)) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/Dependency.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/Dependency.java index 7f23acda3a..5070f7e566 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/Dependency.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/Dependency.java @@ -68,7 +68,7 @@ public static Dependency fromConfig(Program program, Context analysisContext, Co /** * Queries the collection of providers for a variable, given a certain state of the program. * - * @param reader Event containing some computation over values of the register space. + * @param reader Event containing some computation over values of the register space. * @return Local result of this analysis. */ @Override @@ -111,7 +111,7 @@ private void process(Thread thread, ExecutionAnalysis exec) { //collecting all register dependencies Set registers = new HashSet<>(); if (event instanceof RegReader regReader) { - regReader.getRegisterReads().forEach( read -> registers.add(read.register())); + regReader.getRegisterReads().forEach(read -> registers.add(read.register())); } if (!registers.isEmpty()) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/SyntacticContextAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/SyntacticContextAnalysis.java index e5336fc74f..7634140882 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/SyntacticContextAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/SyntacticContextAnalysis.java @@ -171,7 +171,7 @@ private void run(Thread thread, LoopAnalysis loops) { // FIXME: DCE can sometimes delete the end marker of functions if those never return // (e.g., "reach_error() { abort(0); }"). // Here we try to also pop those calls that have missing markers. - if(curContextStack.peek() instanceof CallContext) { + if (curContextStack.peek() instanceof CallContext) { topCallCtx = (CallContext) curContextStack.pop(); } else { logger.warn("Found a FunCallMarker without a matching FunReturnMarker. Giving up the analysis"); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java index 9266d10332..d2f4124d4d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AliasAnalysis.java @@ -54,7 +54,7 @@ public interface AliasAnalysis { List mayMixedSizeAccesses(MemoryCoreEvent event); static AliasAnalysis fromConfig(Program program, Context analysisContext, Configuration config, - boolean detectMixedSizeAccesses) throws InvalidConfigurationException { + boolean detectMixedSizeAccesses) throws InvalidConfigurationException { Config c = new Config(config, detectMixedSizeAccesses); logger.info("Selected alias analysis: {}", c.method); long t0 = System.currentTimeMillis(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java index 330d9285f3..c1c4b88125 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/AndersenAliasAnalysis.java @@ -54,9 +54,9 @@ public class AndersenAliasAnalysis implements AliasAnalysis { // For providing helpful error messages, this analysis prints call-stack and loop information for events. private final Supplier synContext; - ///When a pointer set gains new content, it is added to this queue + /// When a pointer set gains new content, it is added to this queue private final Queue variables = new ArrayDeque<>(); - ///Super set of all pointer sets in this analysis + /// Super set of all pointer sets in this analysis private final ImmutableSet maxAddressSet; private final Map> edges = new HashMap<>(); private final Map> addresses = new HashMap<>(); @@ -77,7 +77,7 @@ private AndersenAliasAnalysis(Program program, Config c) { for (MemoryObject a : program.getMemory().getObjects()) { if (!a.hasKnownSize()) { throw new UnsupportedOperationException(String.format("%s alias analysis does not support memory objects of unknown size. " + - "You can try the %s alias analysis", FIELD_INSENSITIVE, FULL)); + "You can try the %s alias analysis", FIELD_INSENSITIVE, FULL)); } for (int i = 0; i < a.getKnownSize(); i++) { builder.add(new Location(a, i)); @@ -220,7 +220,7 @@ private void processLocs(MemoryCoreEvent e) { //event is a store operation Verify.verify(e instanceof Store, "Encountered memory event that is neither store nor load: {}", e); - Expression value = ((Store)e).getMemValue(); + Expression value = ((Store) e).getMemValue(); if (value instanceof Register) { addEdge(value, location); return; @@ -299,15 +299,15 @@ private void processResults(Local e) { addTarget(reg, new Location(mem, 0)); return; } - if (!(exp instanceof IntBinaryExpr|| exp instanceof PtrAddExpr)) { + if (!(exp instanceof IntBinaryExpr || exp instanceof PtrAddExpr)) { return; } - Expression base = exp instanceof IntBinaryExpr ? ((IntBinaryExpr)exp).getLeft(): ((PtrAddExpr)exp).getBase(); + Expression base = exp instanceof IntBinaryExpr ? ((IntBinaryExpr) exp).getLeft() : ((PtrAddExpr) exp).getBase(); // fixme: this is a temp solution. if (base instanceof IntToPtrCast || base instanceof PtrToIntCast) { base = ((CastExpressionBase) base).getOperand(); } - Expression rhs = exp instanceof IntBinaryExpr ? ((IntBinaryExpr)exp).getRight(): ((PtrAddExpr)exp).getOffset(); + Expression rhs = exp instanceof IntBinaryExpr ? ((IntBinaryExpr) exp).getRight() : ((PtrAddExpr) exp).getOffset(); if (base instanceof MemoryObject mem) { if (rhs instanceof IntLiteral ic) { addTarget(reg, new Location(mem, ic.getValueAsInt())); @@ -407,7 +407,8 @@ public String toString() { } } - private record Location(MemoryObject base, int offset) {} + private record Location(MemoryObject base, int offset) { + } private boolean addEdge(Object v1, Object v2) { return edges.computeIfAbsent(v1, key -> new HashSet<>()).add(v2); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java index 420e87152b..174c80a4fa 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/FieldSensitiveAndersen.java @@ -60,17 +60,17 @@ public class FieldSensitiveAndersen implements AliasAnalysis { // For providing helpful error messages, this analysis prints call-stack and loop information for events. private final Supplier synContext; - ///When a pointer set gains new content, it is added to this queue + /// When a pointer set gains new content, it is added to this queue private final LinkedHashSet variables = new LinkedHashSet<>(); private final Map>> edges = new HashMap<>(); private final Map> addresses = new HashMap<>(); - ///Maps registers to result registers of loads that use the register in their address + /// Maps registers to result registers of loads that use the register in their address private final Map>> loads = new HashMap<>(); - ///Maps registers to matched value expressions of stores that use the register in their address + /// Maps registers to matched value expressions of stores that use the register in their address private final Map>> stores = new HashMap<>(); - ///Result sets + /// Result sets private final Map> eventAddressSpaceMap = new HashMap<>(); // Maps memory events to additional offsets inside their byte range, which may match other accesses' bounds. @@ -279,16 +279,18 @@ protected void processResults(MemoryCoreEvent e) { eventAddressSpaceMap.put(e, addresses.build()); } - private record Offset(Base base, int offset, int alignment) {} + private record Offset(Base base, int offset, int alignment) { + } - private record Location(MemoryObject base, int offset) {} + private record Location(MemoryObject base, int offset) { + } private static List fields(Collection v, int offset, int alignment) { final List result = new ArrayList<>(); for (Location l : v) { if (!l.base.hasKnownSize()) { throw new UnsupportedOperationException(String.format("%s alias analysis does not support memory objects of unknown size. " + - "You can try the %s alias analysis", FIELD_SENSITIVE, FULL)); + "You can try the %s alias analysis", FIELD_SENSITIVE, FULL)); } for (int i = 0; i < div(l.base.getKnownSize(), alignment); i++) { int mapped = l.offset + offset + i * alignment; @@ -414,14 +416,17 @@ public Result visitPtrAddExpression(PtrAddExpr x) { return new Result(null, r.register, offset, min(l.alignment, r.alignment)); } + @Override public Result visitIntToPtrCastExpression(IntToPtrCast expr) { return expr.getOperand().accept(this); } + @Override public Result visitPtrToIntCastExpression(PtrToIntCast expr) { return expr.getOperand().accept(this); } + @Override public Result visitIntUnaryExpression(IntUnaryExpr x) { Result i = x.getOperand().accept(this); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java index c11c9a0cbd..ddb790754f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/analysis/alias/InclusionBasedPointerAnalysis.java @@ -112,7 +112,10 @@ public class InclusionBasedPointerAnalysis implements AliasAnalysis { // ================================ Debugging ================================ private record IntPair(int x, int y) { - @Override public String toString() {return x + "," + y;} + @Override + public String toString() { + return x + "," + y; + } } // Count inclusion tests grouped by complexity. @@ -270,7 +273,7 @@ private List toIncludeSet(Variable address) { } private void fetchAllMixedOffsets(Set xSet, Modifier xModifier, int xBytes, - Set ySet, Modifier yModifier, int yBytes) { + Set ySet, Modifier yModifier, int yBytes) { fetchMixedOffsets(xSet, xModifier, xBytes, yModifier, yBytes); fetchMixedOffsets(ySet, yModifier, yBytes, xModifier, xBytes); } @@ -332,7 +335,7 @@ private void run(Program program, AliasAnalysis.Config configuration) { private void processWriter(RegWriter event) { logger.trace("{}", event); final Expression expr = event instanceof Local local ? local.getExpr() : - event instanceof ThreadArgument arg ? arg.getCreator().getArguments().get(arg.getIndex()) : + event instanceof ThreadArgument arg ? arg.getCreator().getArguments().get(arg.getIndex()) : event instanceof Alloc alloc ? alloc.getAllocatedObject() : null; final DerivedVariable value; if (expr != null) { @@ -538,23 +541,33 @@ private static final class Variable { private final DerivedVariable[] aggregate; // For visualization. private final String name; + private Variable(MemoryObject o, DerivedVariable[] a, String n) { object = o; aggregate = a; name = n; } - @Override public String toString() { return name; } + + @Override + public String toString() { + return name; + } } - private record IncludeEdge(Variable source, Modifier modifier) {} + private record IncludeEdge(Variable source, Modifier modifier) { + } - private record LoadEdge(Variable result, Modifier addressModifier) {} + private record LoadEdge(Variable result, Modifier addressModifier) { + } - private record StoreEdge(DerivedVariable value, Modifier addressModifier) {} + private record StoreEdge(DerivedVariable value, Modifier addressModifier) { + } - private record Modifier(int offset, List alignment) {} + private record Modifier(int offset, List alignment) { + } - private record DerivedVariable(Variable base, Modifier modifier) {} + private record DerivedVariable(Variable base, Modifier modifier) { + } private static boolean isConstant(Modifier modifier) { return modifier.alignment.isEmpty(); @@ -830,18 +843,18 @@ private boolean includes(Modifier left, Modifier right) { mem[0] = true; for (int j = 1; j < mem.length; j++) { for (final Integer i : left.alignment) { - if (j - i/gcd >= 0 && mem[j - i/gcd]) { + if (j - i / gcd >= 0 && mem[j - i / gcd]) { mem[j] = true; break; } } } for (final Integer j : right.alignment) { - if (!mem[j/gcd]) { + if (!mem[j / gcd]) { return false; } } - return mem[Math.abs(offset)/gcd]; + return mem[Math.abs(offset) / gcd]; } // Checks if there may be some common value in both sets. @@ -1016,6 +1029,7 @@ public Expression visitRegister(Register register) { edges.add(new IncludeEdge(getPhiNodeVariable(register, reader).base, RELAXED_MODIFIER)); return register; } + @Override public Expression visitMemoryObject(MemoryObject object) { edges.add(new IncludeEdge(objectVariables.get(object), RELAXED_MODIFIER)); @@ -1025,7 +1039,8 @@ public Expression visitMemoryObject(MemoryObject object) { return edges; } - record ExprFlip(Expression expr, int factor) {} + record ExprFlip(Expression expr, int factor) { + } @Override public List visitPtrAddExpression(PtrAddExpr expr) { @@ -1110,10 +1125,10 @@ public List visitByteExpression(Expression x) { } private boolean matchByteExpression(ExprFlip operand, Stack stack) { - if (operand.expr instanceof IntBinaryExpr ) { + if (operand.expr instanceof IntBinaryExpr) { return matchLinearExpression(operand, stack); } - if (operand.expr instanceof PtrAddExpr ) { + if (operand.expr instanceof PtrAddExpr) { return matchPtrAddExpression(operand, stack); } return false; @@ -1123,6 +1138,7 @@ private boolean matchByteExpression(ExprFlip operand, Stack stack) { public List visitIntToPtrCastExpression(IntToPtrCast expr) { return expr.getOperand().accept(this); } + @Override public List visitPtrToIntCastExpression(PtrToIntCast expr) { return expr.getOperand().accept(this); @@ -1201,9 +1217,9 @@ public List visitConstructExpression(ConstructExpr construct) { // Red edges connect address variables to stored value variables. // Green-labeled nodes represent memory objects. // Red-labeled nodes are address variables that do not include any memory objects (probably a bug). - private void generateGraph() { + private void generateGraph() { final Set seen = new HashSet<>(objectVariables.values()); - for (Set news = seen; !news.isEmpty();) { + for (Set news = seen; !news.isEmpty(); ) { final var next = new HashSet(); for (final Variable v : news) { next.addAll(v.seeAlso); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java index 8ead3ae6cf..bed1205fc5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/EventFactory.java @@ -116,7 +116,7 @@ public static Alloc newAlloc(Register register, Type allocType, Expression array } public static Alloc newAlignedAlloc(Register register, Type allocType, Expression arraySize, Expression alignment, - boolean isHeapAlloc, boolean doesZeroOutMemory) { + boolean isHeapAlloc, boolean doesZeroOutMemory) { arraySize = expressions.makeCast(arraySize, types.getArchType(), false); // why cast? alignment = expressions.makeCast(alignment, types.getArchType(), false); return new Alloc(register, allocType, arraySize, alignment, isHeapAlloc, doesZeroOutMemory); @@ -187,6 +187,7 @@ public static ValueFunctionCall newValueFunctionCall(Register resultRegister, Fu public static VoidFunctionCall newVoidFunctionCall(Function function, List arguments) { return new VoidFunctionCall(function.getFunctionType(), function, arguments); } + public static VoidFunctionCall newVoidFunctionCall(FunctionType funcType, Expression funcPtr, List arguments) { return new VoidFunctionCall(funcType, funcPtr, arguments); } @@ -781,7 +782,8 @@ public static GenericVisibleEvent newLwSyncBarrier() { // ============================================ PTX ============================================ // ============================================================================================= public static class PTX { - private PTX() {} + private PTX() { + } public static PTXAtomOp newAtomOp(Expression address, Register register, Expression value, IntBinaryOp op, String mo, String scope) { @@ -792,14 +794,14 @@ public static PTXAtomOp newAtomOp(Expression address, Register register, Express } public static PTXAtomCAS newAtomCAS(Expression address, Register register, Expression expected, - Expression value, String mo, String scope) { + Expression value, String mo, String scope) { PTXAtomCAS atom = new PTXAtomCAS(register, address, expected, value, mo); atom.addTags(scope); return atom; } public static PTXAtomExch newAtomExch(Expression address, Register register, - Expression value, String mo, String scope) { + Expression value, String mo, String scope) { PTXAtomExch atom = new PTXAtomExch(register, address, value, mo); atom.addTags(scope); return atom; @@ -818,10 +820,11 @@ public static PTXRedOp newRedOp(Expression address, Expression value, // =========================================== Vulkan ========================================== // ============================================================================================= public static class Vulkan { - private Vulkan() {} + private Vulkan() { + } public static VulkanRMW newRMW(Expression address, Register register, Expression value, - String mo, String scope) { + String mo, String scope) { return new VulkanRMW(register, address, value, mo, scope); } @@ -854,7 +857,8 @@ public static GenericVisibleEvent newVisDevice() { // ============================================================================================= public static class Spirv { - private Spirv() {} + private Spirv() { + } public static SpirvLoad newSpirvLoad(Register register, Expression address, String scope, Set tags) { @@ -872,7 +876,7 @@ public static SpirvXchg newSpirvXchg(Register register, Expression address, Expr } public static SpirvRmw newSpirvRmw(Register register, Expression address, IntBinaryOp op, Expression value, - String scope, Set tags) { + String scope, Set tags) { return new SpirvRmw(register, address, op, value, scope, tags); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java index 39c1da63c4..3f5138270f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/common/SingleAccessMemoryEvent.java @@ -50,11 +50,21 @@ protected SingleAccessMemoryEvent(SingleAccessMemoryEvent other) { this.accessType = other.accessType; } - public Expression getAddress() { return address; } - public void setAddress(Expression address) { this.address = address; } + public Expression getAddress() { + return address; + } + + public void setAddress(Expression address) { + this.address = address; + } - public Type getAccessType() { return accessType; } - public void setAccessType(Type type) { this.accessType = type; } + public Type getAccessType() { + return accessType; + } + + public void setAccessType(Type type) { + this.accessType = type; + } public String getMo() { return mo; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java index 225dc87d1f..fb6dfd1677 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/AbstractMemoryCoreEvent.java @@ -6,8 +6,10 @@ import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.AbstractEvent; + import static com.dat3m.dartagnan.program.event.Tag.MEMORY; import static com.dat3m.dartagnan.program.event.Tag.VISIBLE; + import com.dat3m.dartagnan.program.event.common.NoInterface; import com.google.common.base.Preconditions; @@ -33,11 +35,21 @@ protected AbstractMemoryCoreEvent(AbstractMemoryCoreEvent other) { this.accessType = other.accessType; } - public Expression getAddress() { return address; } - public void setAddress(Expression address) { this.address = address; } + public Expression getAddress() { + return address; + } + + public void setAddress(Expression address) { + this.address = address; + } + + public Type getAccessType() { + return accessType; + } - public Type getAccessType() { return accessType; } - public void setAccessType(Type type) { this.accessType = type; } + public void setAccessType(Type type) { + this.accessType = type; + } @Override public void transformExpressions(ExpressionVisitor exprTransformer) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java index 8720395d28..36f80e5e3c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/core/Alloc.java @@ -62,20 +62,47 @@ private Alloc(Alloc other) { } @Override - public Register getResultRegister() { return resultRegister; } + public Register getResultRegister() { + return resultRegister; + } + @Override - public void setResultRegister(Register reg) { this.resultRegister = reg; } + public void setResultRegister(Register reg) { + this.resultRegister = reg; + } + + public Type getAllocationType() { + return allocationType; + } + + public Expression getArraySize() { + return arraySize; + } + + public Expression getAlignment() { + return alignment; + } - public Type getAllocationType() { return allocationType; } - public Expression getArraySize() { return arraySize; } - public Expression getAlignment() { return alignment; } - public boolean isHeapAllocation() { return isHeapAllocation; } - public boolean doesZeroOutMemory() { return doesZeroOutMemory; } + public boolean isHeapAllocation() { + return isHeapAllocation; + } - public boolean isSimpleAllocation() { return (arraySize instanceof IntLiteral size && size.isOne()); } - public boolean isArrayAllocation() { return !isSimpleAllocation(); } + public boolean doesZeroOutMemory() { + return doesZeroOutMemory; + } + + public boolean isSimpleAllocation() { + return (arraySize instanceof IntLiteral size && size.isOne()); + } + + public boolean isArrayAllocation() { + return !isSimpleAllocation(); + } + + public void setAllocatedObject(MemoryObject obj) { + this.allocatedObject = obj; + } - public void setAllocatedObject(MemoryObject obj) { this.allocatedObject = obj; } // WARNING: This should only be accessed after program processing. public MemoryObject getAllocatedObject() { Preconditions.checkState(allocatedObject != null, @@ -122,7 +149,9 @@ protected String defaultString() { } @Override - public Alloc getCopy() { return new Alloc(this); } + public Alloc getCopy() { + return new Alloc(this); + } @Override public T accept(EventVisitor visitor) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java index 138674740c..4f37b8408c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/memory/MemoryObject.java @@ -48,39 +48,83 @@ public class MemoryObject extends LeafExpressionBase { this.allocationSite = allocationSite; } - public sealed interface ThreadLocalMode {} + public sealed interface ThreadLocalMode { + } + + public record ThreadLocal() implements ThreadLocalMode { + } + + public record PosixThreadLocal(MemoryObject destructor) implements ThreadLocalMode { + } + + public boolean hasName() { + return name != null; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public boolean isStaticallyAllocated() { + return allocationSite == null; + } + + public boolean isDynamicallyAllocated() { + return !isStaticallyAllocated(); + } - public record ThreadLocal() implements ThreadLocalMode {} + public boolean isHeapAllocated() { + return allocationSite != null && allocationSite.isHeapAllocation(); + } + + public Alloc getAllocationSite() { + return allocationSite; + } - public record PosixThreadLocal(MemoryObject destructor) implements ThreadLocalMode {} + public boolean isThreadLocal() { + return this.isThreadLocal; + } - public boolean hasName() { return name != null; } - public String getName() { return name; } - public void setName(String name) { this.name = name; } + public void setIsThreadLocal(boolean value) { + this.isThreadLocal = value; + } - public boolean isStaticallyAllocated() { return allocationSite == null; } - public boolean isDynamicallyAllocated() { return !isStaticallyAllocated(); } - public boolean isHeapAllocated() { return allocationSite != null && allocationSite.isHeapAllocation(); } - public Alloc getAllocationSite() { return allocationSite; } + public void addFeatureTag(String tag) { + featureTags.add(tag); + } - public boolean isThreadLocal() { return this.isThreadLocal; } - public void setIsThreadLocal(boolean value) { this.isThreadLocal = value; } + public Set getFeatureTags() { + return featureTags; + } - public void addFeatureTag(String tag) { featureTags.add(tag); } - public Set getFeatureTags() { return featureTags; } + public Expression size() { + return size; + } + + public boolean hasKnownSize() { + return size instanceof IntLiteral; + } - public Expression size() { return size; } - public boolean hasKnownSize() { return size instanceof IntLiteral;} public int getKnownSize() { Preconditions.checkState(hasKnownSize(), "Cannot call method getKnownSize() for object %s with unknown size", this); - return ((IntLiteral)size).getValueAsInt(); + return ((IntLiteral) size).getValueAsInt(); + } + + public Expression alignment() { + return alignment; + } + + public boolean hasKnownAlignment() { + return alignment instanceof IntLiteral; } - public Expression alignment() { return alignment; } - public boolean hasKnownAlignment() { return alignment instanceof IntLiteral; } public int getKnownAlignment() { Preconditions.checkState(hasKnownAlignment()); - return ((IntLiteral)alignment).getValueAsInt(); + return ((IntLiteral) alignment).getValueAsInt(); } public boolean isInRange(int offset) { @@ -135,7 +179,9 @@ public String toString() { } @Override - public int hashCode() { return id; } + public int hashCode() { + return id; + } @Override public ExpressionKind getKind() { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/DynamicSpinLoopDetection.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/DynamicSpinLoopDetection.java index 5a49953f2e..166f23395e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/DynamicSpinLoopDetection.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/DynamicSpinLoopDetection.java @@ -69,7 +69,7 @@ public void run(Program program) { AnalysisStats stats = new AnalysisStats(0); for (Function func : Iterables.concat(program.getFunctions(), program.getThreads())) { final List loops = computeLoopData(func, loopAnalysis); - final LiveRegistersAnalysis liveRegsAna = LiveRegistersAnalysis.forFunction(func); + final LiveRegistersAnalysis liveRegsAna = LiveRegistersAnalysis.forFunction(func); loops.forEach(loop -> this.collectSideEffects(loop, liveRegsAna)); loops.forEach(this::instrumentLoop); stats = stats.add(collectStats(loops)); @@ -214,8 +214,13 @@ private LoopData(LoopAnalysis.LoopInfo loopInfo) { this.loopInfo = loopInfo; } - private Event getStart() { return loopInfo.iterations().get(0).getIterationStart(); } - private Event getEnd() { return loopInfo.iterations().get(0).getIterationEnd(); } + private Event getStart() { + return loopInfo.iterations().get(0).getIterationStart(); + } + + private Event getEnd() { + return loopInfo.iterations().get(0).getIterationEnd(); + } @Override public String toString() { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java index a23dadd066..24f7c1ed7a 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/GEPToAddition.java @@ -40,7 +40,8 @@ */ public class GEPToAddition implements ProgramProcessor { - private GEPToAddition() {} + private GEPToAddition() { + } public static GEPToAddition newInstance() { return new GEPToAddition(); @@ -75,7 +76,7 @@ public Expression visitGEPExpression(GEPExpr gep) { Expression totalOffset = expressions.makeMul(expressions.makeValue(baseSize, offsetType), indices.get(0).accept(this)); for (Expression index : indices.subList(1, indices.size())) { - index = index.accept(this); + index = index.accept(this); Expression offset; if (indexingType instanceof AggregateType aggType && index instanceof IntLiteral lit) { final int intIndex = lit.getValueAsInt(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java index b0e1950d83..ff70348830 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Inlining.java @@ -42,7 +42,9 @@ public class Inlining implements ProgramProcessor { private int bound = 1; private static final ExpressionFactory expressions = ExpressionFactory.getInstance(); - private Inlining() {} + + private Inlining() { + } public static Inlining fromConfig(Configuration config) throws InvalidConfigurationException { Inlining process = new Inlining(); @@ -69,7 +71,9 @@ public void run(Program program) { } } - private record Snapshot(String name, List parameters, List events, List registers, boolean isVarArgs) {} + private record Snapshot(String name, List parameters, List events, List registers, + boolean isVarArgs) { + } private boolean canInline(FunctionCall call) { return call.isDirectCall() && call.getCalledFunction().hasBody(); @@ -108,10 +112,13 @@ private int getScopeCount(Function function) { // Advance scope counter. for (Register r : function.getRegisters()) { final int i = r.getName().indexOf(":"); - if (i == -1) { continue; } + if (i == -1) { + continue; + } try { scope = Integer.max(scope, Integer.parseInt(r.getName().substring(0, i))); - } catch (NumberFormatException ignore) {} + } catch (NumberFormatException ignore) { + } } return scope; } @@ -148,11 +155,11 @@ private static Event inlineBody(FunctionCall call, Snapshot callTarget, int scop for (int j = 0; j < callTarget.parameters.size(); j++) { final Register register = registerMap.get(callTarget.parameters.get(j)); if (register.getType() instanceof PointerType) { - Expression v = expressions.makeCast(arguments.get(j),(PointerType) register.getType()); + Expression v = expressions.makeCast(arguments.get(j), (PointerType) register.getType()); + parameterAssignments.add(newLocal(register, v)); + } else { + Expression v = arguments.get(j); parameterAssignments.add(newLocal(register, v)); - }else{ - Expression v = arguments.get(j); - parameterAssignments.add(newLocal(register, v)); } // todo check } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index 2118eafe24..d9c4749498 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -60,11 +60,11 @@ public class Intrinsics { @Option(name = REMOVE_ASSERTION_OF_TYPE, description = "Remove assertions of type [user, overflow, invalidderef, unknown_function].", - toUppercase=true, + toUppercase = true, secure = true) private EnumSet notToInline = EnumSet.noneOf(AssertionType.class); - private enum AssertionType { USER, OVERFLOW, INVALIDDEREF, UNKNOWN_FUNCTION } + private enum AssertionType {USER, OVERFLOW, INVALIDDEREF, UNKNOWN_FUNCTION} private final boolean detectMixedSizeAccesses; private final IntegerType archType = types.getArchType(); @@ -82,7 +82,7 @@ private Intrinsics(boolean msa) { public static Intrinsics newInstance() { return new Intrinsics(false); } - + public static Intrinsics fromConfig(Configuration config, boolean detectMixedSizeAccesses) throws InvalidConfigurationException { Intrinsics instance = new Intrinsics(detectMixedSizeAccesses); @@ -240,10 +240,10 @@ public enum Info { STD_SLEEP("sleep", false, false, true, true, Intrinsics::inlineAsZero), STD_FFS(List.of("ffs", "ffsl", "ffsll"), false, false, true, true, Intrinsics::inlineFfs), // --------------------------- UBSAN --------------------------- - UBSAN_OVERFLOW(List.of("__ubsan_handle_add_overflow", "__ubsan_handle_sub_overflow", + UBSAN_OVERFLOW(List.of("__ubsan_handle_add_overflow", "__ubsan_handle_sub_overflow", "__ubsan_handle_divrem_overflow", "__ubsan_handle_mul_overflow", "__ubsan_handle_negate_overflow", "__ubsan_handle_shift_out_of_bounds"), false, false, false, true, Intrinsics::inlineIntegerOverflow), - UBSAN_TYPE_MISSMATCH(List.of("__ubsan_handle_type_mismatch_v1"), + UBSAN_TYPE_MISSMATCH(List.of("__ubsan_handle_type_mismatch_v1"), false, false, false, true, Intrinsics::inlineInvalidDereference), // ------------------------- Unknown function --------------------------- MISSING(List.of(), false, false, false, true, Intrinsics::inlineUnknownFunction), @@ -257,7 +257,7 @@ public enum Info { private final Replacer replacer; Info(List variants, boolean writesMemory, boolean readsMemory, boolean alwaysReturns, boolean isEarly, - Replacer replacer) { + Replacer replacer) { this.variants = variants; this.writesMemory = writesMemory; this.readsMemory = readsMemory; @@ -267,7 +267,7 @@ public enum Info { } Info(String name, boolean writesMemory, boolean readsMemory, boolean alwaysReturns, boolean isEarly, - Replacer replacer) { + Replacer replacer) { this(List.of(name), writesMemory, readsMemory, alwaysReturns, isEarly, replacer); } @@ -292,7 +292,7 @@ public boolean isEarly() { } private boolean matches(String funcName) { - boolean isPrefix = switch(this) { + boolean isPrefix = switch (this) { case LLVM, LLVM_ASSUME, LLVM_META, LLVM_MEMCPY, LLVM_MEMSET, LLVM_EXPECT, LLVM_OBJECTSIZE -> true; default -> false; }; @@ -317,12 +317,13 @@ private void markIntrinsics(Program program) { .findFirst() .ifPresentOrElse(func::setIntrinsicInfo, () -> { missingSymbols.add(funcName); - func.setIntrinsicInfo(Info.MISSING);}); + func.setIntrinsicInfo(Info.MISSING); + }); } } if (!missingSymbols.isEmpty()) { logger.warn(missingSymbols.stream().collect(Collectors.joining(", ", "Unknown intrinsics ", "")) + - ". Detecting calls to unknown functions requires --property=program_spec."); + ". Detecting calls to unknown functions requires --property=program_spec."); } } @@ -589,10 +590,11 @@ private IntegerType getPthreadAttrType() { return types.getIntegerType(2); } - private record PthreadAttrImplementation(Expression out, List errorChecks) {} + private record PthreadAttrImplementation(Expression out, List errorChecks) { + } private PthreadAttrImplementation inlinePthreadAttrDetachState(Expression oldValue, Expression detachstate, - Label returnEINVAL) { + Label returnEINVAL) { // POSIX defines these two named constants of type int. // see https://pubs.opengroup.org/onlinepubs/9799919799/basedefs/pthread.h.html //TODO values may vary by platform @@ -1113,7 +1115,7 @@ private List inlineAssert(FunctionCall call, AssertionType skip, String e } private List inlineVerifierAssert(FunctionCall call, AssertionType skip, String errorMsg) { - if(notToInline.contains(skip)) { + if (notToInline.contains(skip)) { return List.of(); } assert call.getArguments().size() == 1; @@ -1144,7 +1146,7 @@ private List inlineUnknownFunction(FunctionCall call) { replacement.addAll(inlineCallAsNonDet(call)); } replacement.addAll(inlineAssert(call, AssertionType.UNKNOWN_FUNCTION, - "Calling unknown function " + call.getCalledFunction().getName())); + "Calling unknown function " + call.getCalledFunction().getName())); return replacement; } @@ -1642,7 +1644,7 @@ private List inlineMemCpy(FunctionCall call) { // https://en.cppreference.com/w/c/string/byte/memcpy private List inlineMemCpyS(FunctionCall call) { // Cast guaranteed to success by the return type of memcpy_s - final Register resultRegister = ((ValueFunctionCall)call).getResultRegister(); + final Register resultRegister = ((ValueFunctionCall) call).getResultRegister(); final Function caller = call.getFunction(); final Expression dest = call.getArguments().get(0); final Expression destszExpr = call.getArguments().get(1); @@ -1682,14 +1684,14 @@ private List inlineMemCpyS(FunctionCall call) { final List replacement = new ArrayList<>(); - + Label check1 = EventFactory.newLabel("__memcpy_s_check_1"); Label check2 = EventFactory.newLabel("__memcpy_s_check_2"); Label success = EventFactory.newLabel("__memcpy_s_success"); Label end = EventFactory.newLabel("__memcpy_s_end"); - Expression errorCodeFail = expressions.makeOne((IntegerType)resultRegister.getType()); - Expression errorCodeSuccess = expressions.makeZero((IntegerType)resultRegister.getType()); + Expression errorCodeFail = expressions.makeOne((IntegerType) resultRegister.getType()); + Expression errorCodeSuccess = expressions.makeZero((IntegerType) resultRegister.getType()); // Condition 1: dest == NULL or destsz > RSIZE_MAX ----> return error > 0 final Expression cond1 = expressions.makeOr(destIsNull, invalidDestsz); @@ -1697,10 +1699,10 @@ private List inlineMemCpyS(FunctionCall call) { CondJump skipRest1 = EventFactory.newGoto(end); Local retError1 = EventFactory.newLocal(resultRegister, errorCodeFail); replacement.addAll(List.of( - check1, - skipE1, - retError1, - skipRest1 + check1, + skipE1, + retError1, + skipRest1 )); // Condition 2: dest != NULL && destsz <= RSIZE_MAX && (src == NULL || count > destsz || overlap(src, dest)) @@ -1711,25 +1713,25 @@ private List inlineMemCpyS(FunctionCall call) { CondJump skipRest2 = EventFactory.newGoto(end); Local retError2 = EventFactory.newLocal(resultRegister, errorCodeFail); replacement.addAll(List.of( - check2, - skipE2 + check2, + skipE2 )); for (int i = 0; i < destsz; i++) { final Expression offset = expressions.makeValue(i, archType); final Expression destAddr = expressions.makePtrAdd(dest, offset); final Expression zero = expressions.makeZero(archType); replacement.add( - newStore(destAddr, zero) + newStore(destAddr, zero) ); } replacement.addAll(List.of( - retError2, - skipRest2 + retError2, + skipRest2 )); // Else ----> return error = 0 and do the actual copy Local retSuccess = EventFactory.newLocal(resultRegister, errorCodeSuccess); - replacement.add(success); + replacement.add(success); for (int i = 0; i < count; i++) { final Expression offset = expressions.makeValue(i, archType); final Expression srcAddr = expressions.makePtrAdd(src, offset); @@ -1743,8 +1745,8 @@ private List inlineMemCpyS(FunctionCall call) { )); } replacement.addAll(List.of( - retSuccess, - end + retSuccess, + end )); return replacement; @@ -1755,7 +1757,7 @@ private List inlineMemCmp(FunctionCall call) { final Expression src1 = call.getArguments().get(0); final Expression src2 = call.getArguments().get(1); final Expression numExpr = call.getArguments().get(2); - final Register returnReg = ((ValueFunctionCall)call).getResultRegister(); + final Register returnReg = ((ValueFunctionCall) call).getResultRegister(); if (!(numExpr instanceof IntLiteral numValue)) { final String error = "Cannot handle memcmp with dynamic num argument: " + call; @@ -1816,7 +1818,7 @@ private List inlineMemSet(FunctionCall call) { assert fill == 0; final Expression zero = expressions.makeValue(fill, types.getByteType()); - final List replacement = new ArrayList<>( count + 1); + final List replacement = new ArrayList<>(count + 1); for (int i = 0; i < count; i++) { final Expression offset = expressions.makeValue(i, archType); final Expression destAddr = expressions.makePtrAdd(dest, offset); @@ -1836,7 +1838,7 @@ private List inlineLLVMThreadLocal(FunctionCall call) { final Expression exp = call.getArguments().get(0); checkArgument(exp instanceof MemoryObject object && object.isThreadLocal(), "Calling thread-local intrinsic on a non-thread-local object \"%s\"", call); return List.of( - EventFactory.newLocal(resultReg, exp) + EventFactory.newLocal(resultReg, exp) ); } @@ -1850,7 +1852,7 @@ private List inlineFfs(FunctionCall call) { final Type outputType = resultReg.getType(); checkArgument(outputType instanceof IntegerType, "Non-integer %s type for \"%s\".", name, outputType); - final IntegerType inputType = (IntegerType)input.getType(); + final IntegerType inputType = (IntegerType) input.getType(); final Expression cttz = expressions.makeCTTZ(input); final Expression widthExpr = expressions.makeValue(BigInteger.valueOf(inputType.getBitWidth()), inputType); final Expression count = expressions.makeAdd(cttz, expressions.makeOne(inputType)); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LogThreadStatistics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LogThreadStatistics.java index 61cf8d6bbc..2f9966a6c5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LogThreadStatistics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LogThreadStatistics.java @@ -20,9 +20,12 @@ public class LogThreadStatistics implements ProgramProcessor { private static final Logger logger = LoggerFactory.getLogger(LogThreadStatistics.class); - private LogThreadStatistics() { } + private LogThreadStatistics() { + } - public static LogThreadStatistics newInstance() { return new LogThreadStatistics(); } + public static LogThreadStatistics newInstance() { + return new LogThreadStatistics(); + } @Override public void run(Program program) { @@ -54,7 +57,7 @@ public void run(Program program) { } } - int numNonInitThreads = (int)threads.stream().filter(t -> !(t.getEntry().getSuccessor() instanceof Init)).count(); + int numNonInitThreads = (int) threads.stream().filter(t -> !(t.getEntry().getSuccessor() instanceof Init)).count(); int staticAddressSpaceSize = program.getMemory().getObjects().stream() .filter(m -> m.isStaticallyAllocated() && m.hasKnownSize()).mapToInt(MemoryObject::getKnownSize).sum(); int dynamicAddressSpaceSize = program.getMemory().getObjects().stream() diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LoopUnrolling.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LoopUnrolling.java index f19459d715..388d8ad62f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LoopUnrolling.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/LoopUnrolling.java @@ -160,7 +160,7 @@ private Map computeLoopBoundsMap(Function func, int defaultBo } // Merge with loaded bounds if those exist. - if(globalLoopBoundsMap.containsKey(func)) { + if (globalLoopBoundsMap.containsKey(func)) { final Map loopBoundsMapFromFile = globalLoopBoundsMap.get(func); loopBoundsMapFromFile.forEach((key, value) -> loopBoundsMap.merge(key, value, Math::max)); } @@ -215,7 +215,7 @@ private void unrollLoop(CondJump loopBackJump, int bound) { } // Rename label of iteration. - final Label loopBeginCopy = ((Label)copyCtx.get(loopBegin)); + final Label loopBeginCopy = ((Label) copyCtx.get(loopBegin)); loopBeginCopy.setName(loopId); loopBeginCopy.addTags(Tag.NOOPT); } @@ -284,7 +284,7 @@ private void dumpLoopBoundsMapToFile(Program program, Map loopBoundsMap : loopBounds.values()) { for (Map.Entry entry : loopBoundsMap.entrySet()) { final CondJump loopJump = entry.getKey(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java index a18967d1d6..7c7a94c158 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/MemToReg.java @@ -150,7 +150,7 @@ private Register newRegister(Alloc allocation, Field field) { } private List promoteAccess(MemoryCoreEvent event, AddressOffset access, - Map promotableObjects) { + Map promotableObjects) { final Promotable object = access == null ? null : promotableObjects.get(access.base); final Type accessType = event.getAccessType(); final int accessSize = types.getMemorySizeInBytes(accessType); @@ -230,7 +230,8 @@ private boolean overlaps(Field other) { } } - private sealed interface AddressOffsets {} + private sealed interface AddressOffsets { + } // Invariant: base != null private record AddressOffset(RegWriter base, long offset) implements AddressOffsets { @@ -240,7 +241,8 @@ private AddressOffset increase(long o) { } // Invariant: hint != null && !hint.isEmpty() - private record AddressOffsetSet(Set hint) implements AddressOffsets {} + private record AddressOffsetSet(Set hint) implements AddressOffsets { + } // Checks if mixed-size accesses to a promotable object were collected. private static boolean hasMixedAccesses(Set registerTypes) { @@ -422,7 +424,8 @@ private void publishRegisters(Set registers) { } } - private record RegisterOffset(Register register, long offset) {} + private record RegisterOffset(Register register, long offset) { + } private AddressOffset computeAddressOffsetFromState(Expression expression) { final RegisterOffset gep = matchGEP(expression); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java index 26c67f537a..da7ee785f6 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NaiveDevirtualisation.java @@ -38,7 +38,9 @@ public class NaiveDevirtualisation implements ProgramProcessor { private NaiveDevirtualisation() { } - public static NaiveDevirtualisation newInstance() { return new NaiveDevirtualisation(); } + public static NaiveDevirtualisation newInstance() { + return new NaiveDevirtualisation(); + } @Override public void run(Program program) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NonterminationDetection.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NonterminationDetection.java index 63cb9b285b..2ef07e4ed9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NonterminationDetection.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/NonterminationDetection.java @@ -44,7 +44,7 @@ number of times (incomplete) */ @Options public class NonterminationDetection implements ProgramProcessor { - + private static final Logger logger = LoggerFactory.getLogger(NonterminationDetection.class); public enum Mode { @@ -58,7 +58,8 @@ public enum Mode { secure = true) private Mode mode = Mode.FULL; - private NonterminationDetection() { } + private NonterminationDetection() { + } public static NonterminationDetection newInstance() { return new NonterminationDetection(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java index f0345e3f9f..d3d06c4834 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ProcessingManager.java @@ -80,7 +80,7 @@ public class ProcessingManager implements ProgramProcessor { secure = true) private boolean printAfterProcessing = false; -// ====================================================================== + // ====================================================================== private ProcessingManager(Configuration config) throws InvalidConfigurationException { config.inject(this); final Intrinsics intrinsics = Intrinsics.fromConfig(config, detectMixedSizeAccesses); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadFunctions.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadFunctions.java index ceca75511f..2f2b193563 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadFunctions.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadFunctions.java @@ -32,7 +32,8 @@ public class RemoveDeadFunctions implements ProgramProcessor { private static final Logger logger = LoggerFactory.getLogger(RemoveDeadFunctions.class); - private RemoveDeadFunctions() { } + private RemoveDeadFunctions() { + } public static RemoveDeadFunctions newInstance() { return new RemoveDeadFunctions(); @@ -90,7 +91,9 @@ private void liveFunctions(Function function, FunctionCollector liveFunctions) { final List> jumps = events.stream().map(e -> new HashSet()).toList(); for (int i = events.size() - 1; i >= 0; i--) { Event event = events.get(i); - if (IRHelper.isAlwaysBranching(event)) { liveRegisters.clear(); } + if (IRHelper.isAlwaysBranching(event)) { + liveRegisters.clear(); + } liveRegisters.addAll(jumps.get(i)); if (event instanceof Label label) { for (CondJump jump : label.getJumpSet()) { @@ -132,7 +135,9 @@ private static class FunctionCollector implements ExpressionInspector { private final Set collectedFunctions = new HashSet<>(); - public void reset() { collectedFunctions.clear(); } + public void reset() { + collectedFunctions.clear(); + } @Override public Expression visitFunction(Function function) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java index 74d46a0d21..dc414a5361 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/RemoveDeadNullChecks.java @@ -45,11 +45,14 @@ */ public class RemoveDeadNullChecks implements FunctionProcessor { - private final static Logger logger = LoggerFactory.getLogger(RemoveDeadNullChecks.class) -; - private RemoveDeadNullChecks() { } + private final static Logger logger = LoggerFactory.getLogger(RemoveDeadNullChecks.class); - public static RemoveDeadNullChecks newInstance() { return new RemoveDeadNullChecks(); } + private RemoveDeadNullChecks() { + } + + public static RemoveDeadNullChecks newInstance() { + return new RemoveDeadNullChecks(); + } private enum Sign { UNKNOWN, @@ -158,6 +161,7 @@ public Sign visitIntLiteral(IntLiteral lit) { final int cmpRes = lit.getValue().compareTo(BigInteger.ZERO); return cmpRes > 0 ? Sign.POS : cmpRes == 0 ? Sign.NON_NEG : Sign.UNKNOWN; } + @Override public Sign visitNullLiteral(NullLiteral lit) { return Sign.NON_NEG; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SymmetryReduction.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SymmetryReduction.java index f184ec3dfa..62355ecf44 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SymmetryReduction.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/SymmetryReduction.java @@ -32,7 +32,8 @@ public class SymmetryReduction implements ProgramProcessor { private static final Logger logger = LoggerFactory.getLogger(SymmetryReduction.class); - private SymmetryReduction() { } + private SymmetryReduction() { + } public static SymmetryReduction newInstance() { return new SymmetryReduction(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java index 3841d5e9d3..a6f1bffa66 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Tearing.java @@ -266,6 +266,7 @@ private Type checkType(Type type, String message, Event event) { } throw new UnsupportedOperationException(String.format(message, event)); } + private PointerType checkPointerType(Type type, String message, Event event) { if (type instanceof PointerType t) { return t; @@ -318,7 +319,7 @@ public Expression visitFinalMemoryValue(FinalMemoryValue value) { final int begin = value.getOffset(); final int end = begin + types.getMemorySizeInBytes(value.getType()); final List result = new ArrayList<>(); - for (int offset = begin; offset < end;) { + for (int offset = begin; offset < end; ) { final Type t = typesByOffset.get(offset); result.add(new FinalMemoryValue(value.getName(), t, value.getMemoryObject(), offset)); offset += types.getMemorySizeInBytes(t); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java index 6bbe6dd042..063069b2b3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/ThreadCreation.java @@ -193,8 +193,8 @@ private void resolveDynamicThreadJoin(Program program, List threadDa final Expression tidExpr = tidExpr_.getType() instanceof PointerType ? expressions.makePtrToIntCast(tidExpr_, archType) : tidExpr_; final Register joinRegister = join.getResultRegister(); - final IntegerType statusType = (IntegerType) ((AggregateType)joinRegister.getType()).getFields().get(0).type(); - final Type retValType = ((AggregateType)joinRegister.getType()).getFields().get(1).type(); + final IntegerType statusType = (IntegerType) ((AggregateType) joinRegister.getType()).getFields().get(0).type(); + final Type retValType = ((AggregateType) joinRegister.getType()).getFields().get(1).type(); final Expression successValue = expressions.makeValue(SUCCESS.getErrorCode(), statusType); final Expression invalidTidValue = expressions.makeValue(INVALID_TID.getErrorCode(), statusType); @@ -254,7 +254,7 @@ private void resolveDynamicThreadJoin(Program program, List threadDa final List switchJumpTable = new ArrayList<>(); for (Expression tid : tid2joinCases.keySet()) { switchJumpTable.add(EventFactory.newJump( - expressions.makeEQ(tidExpr, tid), (Label)tid2joinCases.get(tid).get(0)) + expressions.makeEQ(tidExpr, tid), (Label) tid2joinCases.get(tid).get(0)) ); } // In the case where no tid matches, we return an error status. @@ -350,7 +350,7 @@ private void resolvePthreadSelf(Program program) { final Expression tidExpr = new TIdExpr(archType, call.getThread()); final Local tidAssignment = newLocal(resultRegister, expressions.makeIntToPtrCast(tidExpr)); IRHelper.replaceWithMetadata(call, tidAssignment); - }else{ + } else { final Expression tidExpr = new TIdExpr((IntegerType) regType, call.getThread()); final Local tidAssignment = newLocal(resultRegister, tidExpr); IRHelper.replaceWithMetadata(call, tidAssignment); @@ -391,7 +391,7 @@ private ThreadData createLLVMThreadFromFunction(Function function, int tid, Thre if (e instanceof Return || e instanceof ThreadReturn) { // NOTE: We also replace ThreadReturn but generate a single new one (normalization) afterward. final Expression retVal = (e instanceof Return ret) ? ret.getValue().orElse(null) - : ((ThreadReturn)e).getValue().orElse(null); + : ((ThreadReturn) e).getValue().orElse(null); final List replacement = eventSequence( returnRegister != null ? EventFactory.newLocal(returnRegister, retVal) : null, EventFactory.newGoto(threadReturnLabel) @@ -445,7 +445,9 @@ private void replaceThreadLocalsWithStackalloc(Memory memory, Thread thread) { // Translate thread-local memory object to local stack allocation Map toLocalRegister = new HashMap<>(); for (MemoryObject memoryObject : memory.getObjects()) { - if (!memoryObject.isThreadLocal()) {continue;} + if (!memoryObject.isThreadLocal()) { + continue; + } Preconditions.checkState(memoryObject.hasKnownSize()); // Compute type of memory object based on initial values @@ -496,6 +498,7 @@ public Expression visitMemoryObject(MemoryObject memObj) { private void resolveTidExpressions(Program program) { final ExprTransformer transformer = new ExprTransformer() { final ExpressionFactory expressions = ExpressionFactory.getInstance(); + @Override public Expression visitLeafExpression(LeafExpression expr) { if (expr instanceof TIdExpr tid) { @@ -510,9 +513,14 @@ public Expression visitLeafExpression(LeafExpression expr) { } private void resolveDynamicThreadLocals(Program program, List threads) { - record Storage(int id, MemoryObject data, MemoryObject destructor) {} - interface StorageField { MemoryObject get(Storage s); } - interface Match { Expression compute(StorageField f, Expression k); } + record Storage(int id, MemoryObject data, MemoryObject destructor) { + } + interface StorageField { + MemoryObject get(Storage s); + } + interface Match { + Expression compute(StorageField f, Expression k); + } final List storage = new ArrayList<>(); final Type type = types.getPointerType(); final int size = types.getMemorySizeInBytes(type); @@ -723,11 +731,19 @@ private void copyThreadEvents(Function function, Thread thread, MemoryTransforme // Helper classes private record ThreadData(Thread thread, MemoryObject comAddress, Label returnLabel) { - public boolean isDynamic() { return comAddress != null; } + public boolean isDynamic() { + return comAddress != null; + } + // We assume all dynamically created threads are joinable. // This is not true for pthread_join in general. - public boolean isJoinable() { return isDynamic(); } - public boolean isDetachable() { return isDynamic(); } + public boolean isJoinable() { + return isDynamic(); + } + + public boolean isDetachable() { + return isDynamic(); + } } // We use this class to refer to thread ids before we have (re)assigned proper ids for all threads. diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/Compilation.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/Compilation.java index 3a727d729a..e9442ab482 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/Compilation.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/Compilation.java @@ -39,7 +39,10 @@ public class Compilation implements ProgramProcessor { toUppercase = true) private Arch target = Arch.C11; - public Arch getTarget() { return target; } + public Arch getTarget() { + return target; + } + public void setTarget(Arch target) { this.target = target; compiler = getCompiler(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index f286f24c57..5979bb48e5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -104,7 +104,7 @@ public List visitLlvmRMW(LlvmRMW e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); Load load = newRMWLoadExclusiveWithMo(resultRegister, address, ARMv8.extractLoadMoFromCMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, dummyReg, true, ARMv8.extractStoreMoFromCMo(mo)); @@ -517,11 +517,13 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Register regValue = e.getFunction().newRegister(type); Load load = newRMWLoadExclusiveWithMo(regValue, address, ARMv8.extractLoadMoFromLKMo(mo)); Expression expr; - if(regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { + if (regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { expr = expressions.makePtrAdd(regValue, e.getOperand()); - } else if( regValue.getType() instanceof IntegerType){ + } else if (regValue.getType() instanceof IntegerType) { expr = expressions.makeAdd(regValue, e.getOperand()); - }else {throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless argument");} + } else { + throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless argument"); + } Store store = newRMWStoreExclusiveWithMo(address, expr, true, ARMv8.extractStoreMoFromLKMo(mo)); Label label = newLabel("FakeDep"); @@ -535,7 +537,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeBitwiseNEQ(regValue ,unless), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeBitwiseNEQ(regValue, unless), dummy.getType())), branchOnCauCmpResult, store, fakeCtrlDep, @@ -599,7 +601,7 @@ public List visitLKMMLock(LKMMLock e) { @Override public List visitLKMMUnlock(LKMMUnlock e) { - Expression zero = expressions.makeZero((IntegerType)e.getAccessType()); + Expression zero = expressions.makeZero((IntegerType) e.getAccessType()); return eventSequence( newStoreWithMo(e.getAddress(), zero, ARMv8.MO_REL) ); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java index 9454d6b510..298cafdd37 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorPower.java @@ -179,7 +179,7 @@ public List visitLlvmRMW(LlvmRMW e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand()),dummyReg.getType())); + Local localOp = newLocal(dummyReg, expressions.makeCast(expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand()), dummyReg.getType())); // Power does not have mo tags, thus we use null Load load = newRMWLoadExclusive(resultRegister, address); @@ -369,7 +369,7 @@ public List visitAtomicFetchOp(AtomicFetchOp e) { String mo = e.getMo(); Register dummyReg = e.getFunction().newRegister(resultRegister.getType()); - Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister,e.getOperator() ,e.getOperand())); + Local localOp = newLocal(dummyReg, expressions.makeIntBinary(resultRegister, e.getOperator(), e.getOperand())); Load load = newRMWLoadExclusive(resultRegister, address); Store store = Power.newRMWStoreConditional(address, dummyReg, true); @@ -660,7 +660,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, expressions.makeCast(e.getExpectedValue(),dummy.getType())), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, expressions.makeCast(e.getExpectedValue(), dummy.getType())), casEnd); Load load = newRMWLoadExclusive(dummy, address); Store store = Power.newRMWStoreConditional(address, e.getStoreValue(), true); @@ -820,11 +820,13 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { // Power does not have mo tags, thus we use the empty string Load load = newRMWLoadExclusive(regValue, address); Expression expr; - if(regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { + if (regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { expr = expressions.makePtrAdd(regValue, e.getOperand()); - } else if( regValue.getType() instanceof IntegerType){ + } else if (regValue.getType() instanceof IntegerType) { expr = expressions.makeAdd(regValue, e.getOperand()); - }else {throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless operand");} + } else { + throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless operand"); + } Store store = Power.newRMWStoreConditional(address, expr, true); Label label = newLabel("FakeDep"); Event fakeCtrlDep = newFakeCtrlDep(regValue, label); @@ -842,7 +844,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( optionalMemoryBarrierBefore, load, - newLocal(dummy, expressions.makeNEQ(regValue,unless)), + newLocal(dummy, expressions.makeNEQ(regValue, unless)), branchOnCauCmpResult, store, fakeCtrlDep, @@ -896,7 +898,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { @Override public List visitLKMMLock(LKMMLock e) { - IntegerType type = (IntegerType)e.getAccessType(); + IntegerType type = (IntegerType) e.getAccessType(); Expression zero = expressions.makeZero(type); Expression one = expressions.makeOne(type); Register dummy = e.getFunction().newRegister(type); @@ -917,7 +919,7 @@ public List visitLKMMLock(LKMMLock e) { public List visitLKMMUnlock(LKMMUnlock e) { return eventSequence( Power.newLwSyncBarrier(), - newStore(e.getAddress(), expressions.makeZero((IntegerType)e.getAccessType())) + newStore(e.getAddress(), expressions.makeZero((IntegerType) e.getAccessType())) ); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index 4bf5fbd84c..e9e3cebfd5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -396,7 +396,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeBitwiseNEQ(dummy,e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeBitwiseNEQ(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? Store store = RISCV.newRMWStoreConditional(address, e.getStoreValue(), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); @@ -459,7 +459,7 @@ public List visitLKMMXchg(LKMMXchg e) { public List visitLKMMOpNoReturn(LKMMOpNoReturn e) { Expression address = e.getAddress(); String mo = e.getMo(); - IntegerType type = (IntegerType)e.getAccessType(); + IntegerType type = (IntegerType) e.getAccessType(); Register dummy = e.getFunction().newRegister(type); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); @@ -573,11 +573,13 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { Load load = newRMWLoadExclusive(regValue, address); // TODO: No mo on the load? Expression expr; - if(regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { + if (regValue.getType() instanceof PointerType && e.getOperand().getType() instanceof IntegerType) { expr = expressions.makePtrAdd(regValue, e.getOperand()); - } else if( regValue.getType() instanceof IntegerType){ + } else if (regValue.getType() instanceof IntegerType) { expr = expressions.makeAdd(regValue, e.getOperand()); - }else {throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless argument");} + } else { + throw new IllegalArgumentException("Non int or ptr as lkmmAddUnless argument"); + } Store store = RISCV.newRMWStoreConditional(address, expr, mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); // TODO: Why does this use a different fake dep (from the load) than the other RMW events (from the store)? @@ -617,7 +619,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { Expression testResult = expressions.makeNot(expressions.makeBooleanCast(dummy)); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? - Local localOp = newLocal(dummy,expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); + Local localOp = newLocal(dummy, expressions.makeIntBinary(dummy, e.getOperator(), e.getOperand())); Store store = newRMWStoreExclusiveWithMo(address, dummy, true, mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : ""); Local testOp = newLocal(resultRegister, expressions.makeCast(testResult, resultRegister.getType())); Label label = newLabel("FakeDep"); @@ -639,7 +641,7 @@ public List visitLKMMOpAndTest(LKMMOpAndTest e) { @Override public List visitLKMMLock(LKMMLock e) { - IntegerType type = (IntegerType)e.getAccessType(); + IntegerType type = (IntegerType) e.getAccessType(); Expression one = expressions.makeOne(type); Expression zero = expressions.makeZero(type); Register dummy = e.getFunction().newRegister(type); @@ -658,7 +660,7 @@ public List visitLKMMLock(LKMMLock e) { public List visitLKMMUnlock(LKMMUnlock e) { return eventSequence( RISCV.newRWWFence(), - newStore(e.getAddress(), expressions.makeZero((IntegerType)e.getAccessType())) + newStore(e.getAddress(), expressions.makeZero((IntegerType) e.getAccessType())) ); } } \ No newline at end of file diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java index e042875774..146b0067f2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/transformers/MemoryTransformer.java @@ -68,7 +68,7 @@ public void setThread(Thread thread) { tid = newTid; builtIn.setThreadId(tid); registerMapping = function.getRegisters().stream().collect( - toMap(r -> r, r -> thread.getOrNewRegister(r.getName(),r.getType()))); + toMap(r -> r, r -> thread.getOrNewRegister(r.getName(), r.getType()))); nonDetMapping = new HashMap<>(); } @@ -98,18 +98,18 @@ public Expression visitMemoryObject(MemoryObject memObj) { return switch (storageClass) { // Device-level memory (keep the same instance) case Tag.Spirv.SC_UNIFORM_CONSTANT, - Tag.Spirv.SC_UNIFORM, - Tag.Spirv.SC_OUTPUT, - Tag.Spirv.SC_CROSS_WORKGROUP, - Tag.Spirv.SC_PUSH_CONSTANT, - Tag.Spirv.SC_ATOMIC_COUNTER, - Tag.Spirv.SC_IMAGE, - Tag.Spirv.SC_STORAGE_BUFFER, - Tag.Spirv.SC_PHYS_STORAGE_BUFFER -> memObj; + Tag.Spirv.SC_UNIFORM, + Tag.Spirv.SC_OUTPUT, + Tag.Spirv.SC_CROSS_WORKGROUP, + Tag.Spirv.SC_PUSH_CONSTANT, + Tag.Spirv.SC_ATOMIC_COUNTER, + Tag.Spirv.SC_IMAGE, + Tag.Spirv.SC_STORAGE_BUFFER, + Tag.Spirv.SC_PHYS_STORAGE_BUFFER -> memObj; // Private memory (copy for each new thread) case Tag.Spirv.SC_INPUT, - Tag.Spirv.SC_PRIVATE, - Tag.Spirv.SC_FUNCTION -> applyMapping(memObj, 0); + Tag.Spirv.SC_PRIVATE, + Tag.Spirv.SC_FUNCTION -> applyMapping(memObj, 0); // Workgroup-level memory (copy for each new workgroup) case Tag.Spirv.SC_WORKGROUP -> applyMapping(memObj, 2); default -> throw new UnsupportedOperationException( diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java index e9d59574bb..d653108b46 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/utils/printer/Printer.java @@ -61,7 +61,7 @@ public Printer setMode(Mode mode) { @Option(name = OptionNames.PRINTER_SHOW_SPECIFICATION, description = "Print program specification and filter (default: false)", secure = true) - private boolean showSpecification = true; + private boolean showSpecification = false; // ================================================================================= diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/ModelChecker.java b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/ModelChecker.java index ba4f0f80d2..db12a4c70b 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/ModelChecker.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/ModelChecker.java @@ -211,7 +211,7 @@ public static void preprocessProgram(VerificationTask task, Configuration config ProcessingManager.fromConfig(config).run(program); } - public static void preprocessMemoryModel(VerificationTask task, Configuration config) throws InvalidConfigurationException{ + public static void preprocessMemoryModel(VerificationTask task, Configuration config) throws InvalidConfigurationException { final Wmm memoryModel = task.getMemoryModel(); WmmProcessingManager.fromConfig(config).run(memoryModel); } @@ -227,8 +227,8 @@ public static void performStaticProgramAnalyses(VerificationTask task, Context a analysisContext.register(AliasAnalysis.class, alias); analysisContext.register(ThreadSymmetry.class, ThreadSymmetry.fromConfig(program, config)); - for(Thread thread : program.getThreads()) { - for(Event e : thread.getEvents()) { + for (Thread thread : program.getThreads()) { + for (Event e : thread.getEvents()) { // Some events perform static analyses by themselves (e.g. Svcomp's EndAtomic) // which may rely on previous "global" analyses e.runLocalAnalysis(program, analysisContext); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/RefinementSolver.java b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/RefinementSolver.java index 242a0eb162..12d701cac9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/RefinementSolver.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/verification/solving/RefinementSolver.java @@ -95,20 +95,20 @@ public class RefinementSolver extends ModelChecker { // ================================================================================================================ // Configuration - @Option(name=BASELINE, - description="Refinement starts from this baseline WMM.", - secure=true, - toUppercase=true) + @Option(name = BASELINE, + description = "Refinement starts from this baseline WMM.", + secure = true, + toUppercase = true) private EnumSet baselines = EnumSet.noneOf(Baseline.class); - @Option(name=COVERAGE, - description="Prints the coverage report (this option requires --method=caat).", - secure=true, - toUppercase=true) + @Option(name = COVERAGE, + description = "Prints the coverage report (this option requires --method=caat).", + secure = true, + toUppercase = true) private boolean printCovReport = false; - @Option(name=GRAPHVIZ_DEBUG_FILES, - description="This option causes Refinement to generate many .dot and .png files that describe EACH iteration." + + @Option(name = GRAPHVIZ_DEBUG_FILES, + description = "This option causes Refinement to generate many .dot and .png files that describe EACH iteration." + " It is very expensive and should only be used for debugging purposes.") private boolean generateGraphvizDebugFiles = false; @@ -132,12 +132,19 @@ private record RefinementIteration( DNF inconsistencyReasons, List observedEvents ) { - public boolean isInconclusive() { return smtStatus == SMTStatus.SAT && caatStatus == INCONSISTENT; } - public boolean isConclusive() { return !isInconclusive(); } + public boolean isInconclusive() { + return smtStatus == SMTStatus.SAT && caatStatus == INCONSISTENT; + } + + public boolean isConclusive() { + return !isInconclusive(); + } } private record RefinementTrace(List iterations) { - public RefinementIteration getFinalIteration() { return iterations.get(iterations.size() - 1); } + public RefinementIteration getFinalIteration() { + return iterations.get(iterations.size() - 1); + } public SMTStatus getFinalResult() { final RefinementIteration finalIteration = getFinalIteration(); @@ -150,9 +157,17 @@ public SMTStatus getFinalResult() { } } - public long getNativeSmtTime() { return iterations.stream().mapToLong(RefinementIteration::nativeSmtTime).sum(); } - public long getCaatTime() { return iterations.stream().mapToLong(RefinementIteration::caatTime).sum(); } - public long getRefiningTime() { return iterations.stream().mapToLong(RefinementIteration::refineTime).sum(); } + public long getNativeSmtTime() { + return iterations.stream().mapToLong(RefinementIteration::nativeSmtTime).sum(); + } + + public long getCaatTime() { + return iterations.stream().mapToLong(RefinementIteration::caatTime).sum(); + } + + public long getRefiningTime() { + return iterations.stream().mapToLong(RefinementIteration::refineTime).sum(); + } public Set getObservedEvents() { return iterations.stream().filter(iter -> iter.observedEvents != null) @@ -177,7 +192,7 @@ private RefinementSolver(VerificationTask task) throws InvalidConfigurationExcep task.getConfig().inject(this); } - public static RefinementSolver create(VerificationTask task) throws InvalidConfigurationException { + public static RefinementSolver create(VerificationTask task) throws InvalidConfigurationException { return new RefinementSolver(task); } @@ -595,19 +610,19 @@ private static void addBiases(Wmm wmm, EnumSet biases) { if (biases.contains(Baseline.UNIPROC)) { // ---- acyclic(po-loc | com) ---- wmm.addConstraint(new Acyclicity(wmm.addDefinition(new Union(wmm.newRelation(), - wmm.addDefinition(new Intersection(wmm.newRelation(), po, loc)), - rf, - co, - fr + wmm.addDefinition(new Intersection(wmm.newRelation(), po, loc)), + rf, + co, + fr )))); } if (biases.contains(Baseline.NO_OOTA)) { // ---- acyclic (dep | rf) ---- wmm.addConstraint(new Acyclicity(wmm.addDefinition(new Union(wmm.newRelation(), - wmm.getOrCreatePredefinedRelation(CTRL), - wmm.getOrCreatePredefinedRelation(DATA), - wmm.getOrCreatePredefinedRelation(ADDR), - rf) + wmm.getOrCreatePredefinedRelation(CTRL), + wmm.getOrCreatePredefinedRelation(DATA), + wmm.getOrCreatePredefinedRelation(ADDR), + rf) ))); } if (biases.contains(Baseline.ATOMIC_RMW)) { @@ -643,7 +658,8 @@ Negations come from negated axioms (~empty(r)), RHS of differences (c = a \ b), once with odd negations and once with even negations. It can also be neither, if the relation is dead (i.e., irrelevant for all axioms). */ - private record PolaritySeparator(Set positives, Set negatives) { } + private record PolaritySeparator(Set positives, Set negatives) { + } private PolaritySeparator computePolaritySeparator(Wmm wmm) { final Set positives = new HashSet<>(); @@ -846,14 +862,14 @@ private static CharSequence generateCoverageReport(Set coveredEvents, Pro // TODO: Can we have events with source information but without oid? .filter(e -> e.hasMetadata(SourceLocation.class) && e.hasMetadata(OriginalId.class)) .collect(Collectors.toSet()); - + // Track (covered) events and branches via oId final Set branches = new HashSet<>(); final Set coveredBranches = new HashSet<>(); // Events not executed in any violating execution final Set messageSet = new TreeSet<>(); // TreeSet to keep strings in order - + final SyntacticContextAnalysis synContext = SyntacticContextAnalysis.newInstance(program); for (Event e : programEvents) { @@ -862,13 +878,13 @@ private static CharSequence generateCoverageReport(Set coveredEvents, Pro OriginalId branchRepId = cf.getRepresentative(symmRep).getMetadata(OriginalId.class); assert branchRepId != null; - if(coveredEvents.contains(e)) { + if (coveredEvents.contains(e)) { coveredBranches.add(branchRepId); } else { final String threads = clazz.stream().map(t -> "T" + t.getId()) .collect(Collectors.joining(" / ")); final String callStack = makeContextString( - synContext.getContextInfo(e).getContextOfType(CallContext.class), " -> "); + synContext.getContextInfo(e).getContextOfType(CallContext.class), " -> "); messageSet.add(String.format("%s: %s%s", threads, callStack.isEmpty() ? callStack : callStack + " -> ", getSourceLocationString(symmRep))); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphml/WitnessBuilder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphml/WitnessBuilder.java index 64b5c92929..dab3a6f52d 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphml/WitnessBuilder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphml/WitnessBuilder.java @@ -46,9 +46,9 @@ public class WitnessBuilder { // =========================== Configurables =========================== @Option( - name=WITNESS_ORIGINAL_PROGRAM_PATH, - description="Path to the original C file (for which to create a witness).", - secure=true) + name = WITNESS_ORIGINAL_PROGRAM_PATH, + description = "Path to the original C file (for which to create a witness).", + secure = true) private String originalProgramFilePath; public boolean canBeBuilt() { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphviz/ExecutionGraphVisualizer.java b/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphviz/ExecutionGraphVisualizer.java index 20f55d5cb5..beaeb4002c 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphviz/ExecutionGraphVisualizer.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/witness/graphviz/ExecutionGraphVisualizer.java @@ -47,9 +47,9 @@ public class ExecutionGraphVisualizer { private final List sortedMemoryObjects = new ArrayList<>(); private List relsToShow; - @Option(name=WITNESS_SHOW, - description="Names of relations to show in the witness graph.", - secure=true) + @Option(name = WITNESS_SHOW, + description = "Names of relations to show in the witness graph.", + secure = true) private String relsToShowStr = String.format("%s,%s,%s,%s", PO, SI, CO, RF); public ExecutionGraphVisualizer() { @@ -88,8 +88,8 @@ private BiPredicate getFilter(String relationName) { private void computeAddressMap(ExecutionModelNext model) { model.getMemoryLayoutMap().entrySet().stream() - .sorted(Comparator.comparing(entry -> (BigInteger) entry.getValue().address().value())) - .forEach(entry -> sortedMemoryObjects.add(entry.getValue())); + .sorted(Comparator.comparing(entry -> (BigInteger) entry.getValue().address().value())) + .forEach(entry -> sortedMemoryObjects.add(entry.getValue())); } private List> getEventModelsToShow(ThreadModel tm) { @@ -157,8 +157,8 @@ private Optional tryParseInt(String s) { private RelationModel getRelationModelByName(ExecutionModelNext model, String name) { return model.getRelationModels().stream() - .filter(rm -> rm.getRelation().hasName(name)) - .findFirst().orElse(null); + .filter(rm -> rm.getRelation().hasName(name)) + .findFirst().orElse(null); } // Getting the correct relation to show is tricky. @@ -177,13 +177,15 @@ private RelationModel getRelationModel(ExecutionModelNext model, String name) { for (String n : rm.getRelation().getNames()) { if (n.startsWith(name + "#")) { defIndex = tryParseInt(n).orElse(-1); - if (defIndex > -1) { break; } + if (defIndex > -1) { + break; + } } } maxId = Math.max(maxId, defIndex); } return maxId != -1 ? getRelationModelByName(model, name + "#" + maxId) - : getRelationModelByName(model, name); + : getRelationModelByName(model, name); } private void addRelations(ExecutionModelNext model) { @@ -222,7 +224,9 @@ private void addProgramOrder(ExecutionModelNext model, String name) { final BiPredicate filter = getFilter(PO); for (ThreadModel tm : model.getThreadModels()) { final List> instructions = getEventModelsToShow(tm); - if (instructions.size() <= 1) { continue; } + if (instructions.size() <= 1) { + continue; + } for (int i = 1; i < instructions.size(); i++) { final List fromList = instructions.get(i - 1); final List toList = instructions.get(i); @@ -273,7 +277,9 @@ private void addSameInstruction(ExecutionModelNext model, String name) { final BiPredicate filter = getFilter(name); for (ThreadModel tm : model.getThreadModels()) { final List> instructions = getEventModelsToShow(tm); - if (instructions.size() <= 1) { continue; } + if (instructions.size() <= 1) { + continue; + } for (List instruction : instructions) { int end = instruction.size() - 1; for (int i = 0; i < end; i++) { @@ -322,25 +328,25 @@ private String nodeLabel(EventModel e) { String.format("%s = R(%s%s)", value, address, moString); } else if (e instanceof LocalModel lm) { tag = String.format("%s(%s) <- %s", - lm.getEvent().getResultRegister(), - lm.getValue(), - lm.getEvent().getExpr() + lm.getEvent().getResultRegister(), + lm.getValue(), + lm.getEvent().getExpr() ); } else if (e instanceof AssertModel am) { tag = String.format("Assertion(%s)", am.getResult()); } final Thread thread = e.getThreadModel().getThread(); final String callStack = makeContextString( - synContext.getContextInfo(e.getEvent()).getContextOfType(CallContext.class), " -> \\n"); + synContext.getContextInfo(e.getEvent()).getContextOfType(CallContext.class), " -> \\n"); final String scope = thread.hasScope() ? "@" + thread.getScopeHierarchy() : ""; final String nodeString = String.format("%s:T%s%s\\nE%s %s%s\\n%s", - e.getThreadModel().getName(), - e.getThreadModel().getId(), - scope, - e.getEvent().getGlobalId(), - callStack.isEmpty() ? callStack : callStack + " -> \\n", - getSourceLocationString(e.getEvent()), - tag) + e.getThreadModel().getName(), + e.getThreadModel().getId(), + scope, + e.getEvent().getGlobalId(), + callStack.isEmpty() ? callStack : callStack + " -> \\n", + getSourceLocationString(e.getEvent()), + tag) .replace("%", "\\%") .replace("\"", "\\\""); // We need to escape quotes inside the string return "label=\"" + nodeString + "\""; @@ -370,11 +376,13 @@ public static File generateGraphvizFile(ExecutionModelNext model, try (FileWriter writer = new FileWriter(fileVio)) { // Create .dot file ExecutionGraphVisualizer visualizer = new ExecutionGraphVisualizer(); - if (config != null) { visualizer.setRelationsToShow(config); } + if (config != null) { + visualizer.setRelationsToShow(config); + } visualizer.setSyntacticContext(synContext) - .setFilter(RF, rfFilter) - .setFilter(CO, coFilter) - .generateGraphOfExecutionModel(writer, "Iteration " + iterationCount, model); + .setFilter(RF, rfFilter) + .setFilter(CO, coFilter) + .generateGraphOfExecutionModel(writer, "Iteration " + iterationCount, model); writer.flush(); if (convert) { @@ -397,13 +405,13 @@ public static void generateGraphvizFile(ExecutionModelNext model, String fileNameBase, SyntacticContextAnalysis synContext) { generateGraphvizFile(model, - iterationCount, - rfFilter, - coFilter, - directoryName, - fileNameBase, - synContext, - true, - null); + iterationCount, + rfFilter, + coFilter, + directoryName, + fileNameBase, + synContext, + true, + null); } } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/Wmm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/Wmm.java index 3d5fa98ba1..f09d953402 100755 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/Wmm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/Wmm.java @@ -35,7 +35,9 @@ public static class Config { secure = true) private boolean reduceAcyclicityEncoding = true; - public boolean isReduceAcyclicityEncoding() { return reduceAcyclicityEncoding; } + public boolean isReduceAcyclicityEncoding() { + return reduceAcyclicityEncoding; + } } private static final Logger logger = LoggerFactory.getLogger(Wmm.class); @@ -55,7 +57,9 @@ public Wmm() { ANARCHIC_CORE_RELATIONS.forEach(this::getOrCreatePredefinedRelation); } - public Config getConfig() { return this.config; } + public Config getConfig() { + return this.config; + } public List getConstraints() { return Stream.concat(constraints.stream(), relations.stream().map(Relation::getDefinition)).toList(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/analysis/NativeRelationAnalysis.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/analysis/NativeRelationAnalysis.java index 1d920c6571..30676c4f9f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/analysis/NativeRelationAnalysis.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/analysis/NativeRelationAnalysis.java @@ -776,7 +776,7 @@ public MutableKnowledge visitLXSXPairs(LXSXPairs lxsx) { } private void addLXSX(MutableEventGraph may, MutableEventGraph must, List loads, List stores, - boolean noIntermediaries, boolean requiresMatchingAddresses) { + boolean noIntermediaries, boolean requiresMatchingAddresses) { final boolean sameType = sameType(loads, stores); for (int i = 0; i < loads.size(); i++) { final MemoryCoreEvent ld = (MemoryCoreEvent) loads.get(i); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/axiom/Acyclicity.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/axiom/Acyclicity.java index e4c959d8d1..0e309b28e1 100755 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/axiom/Acyclicity.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/axiom/Acyclicity.java @@ -234,10 +234,10 @@ private List inconsistentSAT(EventGraph toBeEncoded, EncodingCon // edge and at least one outgoing edge that are also in the cycle. enc.add(bmgr.implication(cycleVar(e, fmgr), bmgr.and(bmgr.or(inMap.get(e)), bmgr.or(outMap.get(e))))); toBeEncoded.apply((e1, e2) -> - // If an edge is guessed to be in a cycle, the edge must belong to relation, - // and both events must also be guessed to be on the cycle. - enc.add(bmgr.implication(getSMTCycleVar(e1, e2, fmgr), - bmgr.and(edge.encode(e1, e2), cycleVar(e1, fmgr), cycleVar(e2, fmgr))))); + // If an edge is guessed to be in a cycle, the edge must belong to relation, + // and both events must also be guessed to be on the cycle. + enc.add(bmgr.implication(getSMTCycleVar(e1, e2, fmgr), + bmgr.and(edge.encode(e1, e2), cycleVar(e1, fmgr), cycleVar(e2, fmgr))))); } // A cycle exists if there is an event in the cycle. enc.add(bmgr.or(eventsInCycle)); @@ -252,10 +252,10 @@ private List consistentIDL(EventGraph toBeEncoded, EncodingConte List enc = new ArrayList<>(); final EncodingContext.EdgeEncoder edge = context.edge(rel); toBeEncoded.apply((e1, e2) -> - enc.add(bmgr.implication(edge.encode(e1, e2), - imgr.lessThan( - context.clockVariable(clockVarName, e1), - context.clockVariable(clockVarName,e2)))) + enc.add(bmgr.implication(edge.encode(e1, e2), + imgr.lessThan( + context.clockVariable(clockVarName, e1), + context.clockVariable(clockVarName, e2)))) ); return enc; } @@ -358,7 +358,7 @@ private List consistentSAT(EventGraph toBeEncoded, EncodingConte for (int i = 0; i < varOrderings.size(); i++) { Event e1 = varOrderings.get(i); Set out = vertEleOutEdges.get(e1); - for (Event e2: out) { + for (Event e2 : out) { if (varOrderings.indexOf(e2) > i && vertEleInEdges.get(e2).contains(e1)) { BooleanFormula cond = minSet.contains(e1, e2) ? bmgr.makeTrue() : getSMTCycleVar(e1, e2, fmgr); enc.add(bmgr.implication(cond, bmgr.not(getSMTCycleVar(e2, e1, fmgr)))); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/processing/MergeEquivalentRelations.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/processing/MergeEquivalentRelations.java index a2be1c72c1..749b14c6ec 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/processing/MergeEquivalentRelations.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/processing/MergeEquivalentRelations.java @@ -60,7 +60,7 @@ private Map computeEquivalenceClasses(Wmm wmm) { } private boolean areEquivalent(Relation r1, Relation r2) { - if (r1 == r2) { + if (r1 == r2) { return true; } final Definition def1 = r1.getDefinition(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Cut.java b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Cut.java index 57cadc3622..2d63b95fd5 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Cut.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/wmm/utils/Cut.java @@ -50,9 +50,17 @@ private Cut(Wmm memoryModel, Set lower, Set upper) { this.upper = upper; } - public Wmm getMemoryModel() { return memoryModel; } - public Set getLower() { return lower; } - public Set getUpper() { return upper; } + public Wmm getMemoryModel() { + return memoryModel; + } + + public Set getLower() { + return lower; + } + + public Set getUpper() { + return upper; + } public Set getLowerRelations() { return lower.stream().flatMap(c -> c.getConstrainedRelations().stream()).collect(Collectors.toSet()); From 7797f288daa44c66c1d5df5fb50339e1671758ec Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 10 Feb 2026 14:33:49 +0100 Subject: [PATCH 102/109] Fixed some litmus c tests --- .../dartagnan/expression/ExpressionFactory.java | 10 ---------- .../parsers/program/visitors/VisitorLitmusC.java | 12 +++++++++++- .../program/event/lang/linux/LKMMAddUnless.java | 1 + 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index e10ef48807..859f165318 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -615,16 +615,6 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Equality not supported on type: " + type); } - public Expression makeBitwiseEQ(Expression leftOperand, Expression rightOperand) { - - if (leftOperand.getType() instanceof PointerType) { - return makeBitwiseEQ(makePtrToIntCast(leftOperand, archType), rightOperand); - } - if (rightOperand.getType() instanceof PointerType) { - return makeBitwiseEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); - } - return makeEQ(leftOperand, rightOperand); - } public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { final Type type = leftOperand.getType(); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index b891481275..20e7e20cce 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -6,7 +6,9 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntBinaryOp; +import com.dat3m.dartagnan.expression.integers.IntCmpOp; import com.dat3m.dartagnan.expression.integers.IntLiteral; +import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.BooleanType; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; @@ -467,7 +469,15 @@ public Expression visitReOpCompare(LitmusCParser.ReOpCompareContext ctx) { Register register = getOptionalReturnRegister(); Expression v1 = (Expression) ctx.re(0).accept(this); Expression v2 = (Expression) ctx.re(1).accept(this); - Expression result = expressions.makeIntCmp(v1, ctx.opCompare().op, v2); + Expression result; + if ((v1.getType() instanceof PointerType || v2.getType() instanceof PointerType) && (ctx.opCompare().op == IntCmpOp.EQ || ctx.opCompare().op == IntCmpOp.NEQ) ) { + var op = ctx.opCompare().op == IntCmpOp.EQ ? PtrCmpOp.EQ:PtrCmpOp.NEQ; + result = expressions.makeCompare(v1,op,v2); + }else if(!(v1.getType().equals(v2.getType()))){ + result = expressions.makeCompare(expressions.makeCast(v1, archType), ctx.opCompare().op, expressions.makeCast(v2, archType)); + }else{ + result = expressions.makeCompare(v1, ctx.opCompare().op, v2); + } return assignToReturnRegister(register, result); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/lang/linux/LKMMAddUnless.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/lang/linux/LKMMAddUnless.java index d5fbb15cd7..c1f0378df3 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/lang/linux/LKMMAddUnless.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/event/lang/linux/LKMMAddUnless.java @@ -2,6 +2,7 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionVisitor; +import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.EventVisitor; import com.dat3m.dartagnan.program.event.MemoryAccess; From 7d69fa4cb35a68283a773e78816b85a2370d6ef5 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 10 Feb 2026 15:34:23 +0100 Subject: [PATCH 103/109] Removed forced cast in intcmp --- .../expression/ExpressionFactory.java | 21 ------------------- .../parsers/program/visitors/VisitorLlvm.java | 16 +++++++------- .../program/processing/Intrinsics.java | 8 +++++-- 3 files changed, 13 insertions(+), 32 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 859f165318..bc2d885679 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -136,30 +136,18 @@ public IntLiteral makeValue(int value, int bitwidth) { } public Expression makeLT(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType) { - return makeIntCmpfromInts(leftOperand, IntCmpOp.ULT, rightOperand); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.LT : IntCmpOp.ULT, rightOperand); } public Expression makeGT(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType) { - return makeIntCmpfromInts(leftOperand, IntCmpOp.UGT, rightOperand); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.GT : IntCmpOp.UGT, rightOperand); } public Expression makeLTE(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType) { - return makeIntCmpfromInts(leftOperand, IntCmpOp.ULTE, rightOperand); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.LTE : IntCmpOp.ULTE, rightOperand); } public Expression makeGTE(Expression leftOperand, Expression rightOperand, boolean signed) { - if (leftOperand.getType() instanceof PointerType) { - return makeIntCmpfromInts(leftOperand, IntCmpOp.UGTE, rightOperand); - } return makeIntCmp(leftOperand, signed ? IntCmpOp.GTE : IntCmpOp.UGTE, rightOperand); } @@ -231,15 +219,6 @@ public Expression makeIntCmp(Expression leftOperand, IntCmpOp operator, Expressi return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); } - public Expression makeIntCmpfromInts(Expression leftOperand, IntCmpOp operator, Expression rightOperand) { - if (leftOperand.getType() instanceof PointerType) { - return makeIntCmpfromInts(makePtrToIntCast(leftOperand, archType), operator, rightOperand); - } - if (rightOperand.getType() instanceof PointerType) { - return makeIntCmpfromInts(leftOperand, operator, makePtrToIntCast(rightOperand, archType)); - } - return new IntCmpExpr(types.getBooleanType(), leftOperand, operator, rightOperand); - } public Expression makeIntBinary(Expression leftOperand, IntBinaryOp operator, Expression rightOperand) { return new IntBinaryExpr(leftOperand, operator, rightOperand); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java index ab02dfdbde..58b35bb526 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLlvm.java @@ -582,19 +582,17 @@ public Expression visitPhiInst(PhiInstContext ctx) { @Override public Expression visitICmpInst(ICmpInstContext ctx) { - final Expression left = visitTypeValue(ctx.typeValue()); - final Expression right = checkExpression(left.getType(), ctx.value()); + Expression left = visitTypeValue(ctx.typeValue()); + Expression right = checkExpression(left.getType(), ctx.value()); final String operator = ctx.iPred().getText(); + assert left.getType() == right.getType(); // llvm requires this + if (left.getType() instanceof PointerType p) { + left = expressions.makeCast(left,types.getIntegerType(p.getBitWidth())); + right = expressions.makeCast(right,types.getIntegerType(p.getBitWidth())); + } final Expression compared = switch (operator) { case "eq" -> expressions.makeEQ(left, right); case "ne" -> expressions.makeNEQ(left, right); - - - // fixme : - // The two arguments must be integer, pointer ,or integer vector typed. They must also be of identical types. - // llvm doc: If the operands are pointer typed, the pointer values are compared as if they were integers. - // cmp should cast directly to int if both are pointers else normal int cmp - case "slt", "ult" -> expressions.makeLT(left, right, operator.startsWith("s")); case "sle", "ule" -> expressions.makeLTE(left, right, operator.startsWith("s")); case "sgt", "ugt" -> expressions.makeGT(left, right, operator.startsWith("s")); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java index d9c4749498..94512bd5d7 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/Intrinsics.java @@ -1679,8 +1679,12 @@ private List inlineMemCpyS(FunctionCall call) { final Expression countGtdestszExpr = expressions.makeGT(castCountExpr, castDestszExpr, false); final Expression invalidCount = expressions.makeOr(countGtMax, countGtdestszExpr); final Expression overlap = expressions.makeAnd( - expressions.makeGT(expressions.makePtrAdd(src, castCountExpr), dest, false), - expressions.makeGT(expressions.makePtrAdd(dest, castCountExpr), src, false)); + expressions.makeGT( + expressions.makeCast(expressions.makePtrAdd(src, castCountExpr), archType) + , expressions.makeCast(dest, archType), false), + expressions.makeGT( + expressions.makeCast(expressions.makePtrAdd(dest, castCountExpr), archType) + , expressions.makeCast(src, archType), false)); final List replacement = new ArrayList<>(); From 4cb213b3eb6dde1acfa08c14a0c5bb1ec4800f7f Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 10 Feb 2026 15:40:26 +0100 Subject: [PATCH 104/109] fix --- .../dartagnan/parsers/program/visitors/VisitorLitmusC.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java index 20e7e20cce..6c97c5c01e 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorLitmusC.java @@ -470,7 +470,7 @@ public Expression visitReOpCompare(LitmusCParser.ReOpCompareContext ctx) { Expression v1 = (Expression) ctx.re(0).accept(this); Expression v2 = (Expression) ctx.re(1).accept(this); Expression result; - if ((v1.getType() instanceof PointerType || v2.getType() instanceof PointerType) && (ctx.opCompare().op == IntCmpOp.EQ || ctx.opCompare().op == IntCmpOp.NEQ) ) { + if (v1.getType() instanceof PointerType && v2.getType() instanceof PointerType && (ctx.opCompare().op == IntCmpOp.EQ || ctx.opCompare().op == IntCmpOp.NEQ) ) { var op = ctx.opCompare().op == IntCmpOp.EQ ? PtrCmpOp.EQ:PtrCmpOp.NEQ; result = expressions.makeCompare(v1,op,v2); }else if(!(v1.getType().equals(v2.getType()))){ From 0b9d9eb4e7eb937fcb203b2b3644a0da0df68873 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 10 Feb 2026 16:27:11 +0100 Subject: [PATCH 105/109] fix --- .../dartagnan/expression/ExpressionFactory.java | 14 ++------------ .../processing/compilation/VisitorArm8.java | 4 ++-- .../processing/compilation/VisitorRISCV.java | 2 +- 3 files changed, 5 insertions(+), 15 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index bc2d885679..53a2289d71 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -575,6 +575,7 @@ public Expression makeITE(Expression condition, Expression ifTrue, Expression if } public Expression makeEQ(Expression leftOperand, Expression rightOperand) { + assert leftOperand.getType().equals(rightOperand.getType()); final Type type = leftOperand.getType(); if (type instanceof BooleanType) { return makeBoolBinary(leftOperand, BoolBinaryOp.IFF, rightOperand); @@ -596,6 +597,7 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { + assert leftOperand.getType().equals(rightOperand.getType()); final Type type = leftOperand.getType(); if (type instanceof BooleanType) { return makeNot(makeBoolBinary(leftOperand, BoolBinaryOp.IFF, rightOperand)); @@ -613,18 +615,6 @@ public Expression makeNEQ(Expression leftOperand, Expression rightOperand) { throw new UnsupportedOperationException("Disequality not supported on type: " + type); } - - public Expression makeBitwiseNEQ(Expression leftOperand, Expression rightOperand) { - // casts both operands to archtype and compares them - if (leftOperand.getType() instanceof PointerType) { - return makeBitwiseNEQ(makePtrToIntCast(leftOperand, archType), rightOperand); - } - if (rightOperand.getType() instanceof PointerType) { - return makeBitwiseNEQ(leftOperand, makePtrToIntCast(rightOperand, archType)); - } - return makeNEQ(leftOperand, rightOperand); - } - public Expression makeUnary(ExpressionKind op, Expression expr) { if (op instanceof BoolUnaryOp boolOp) { return makeBoolUnary(boolOp, expr); diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java index 5979bb48e5..8822ed5211 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorArm8.java @@ -380,7 +380,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Label casEnd = newLabel("CAS_end"); // The real scheme uses XOR instead of comparison, but both are semantically // equivalent and XOR harms performance substantially. - CondJump branchOnCasCmpResult = newJump(expressions.makeBitwiseNEQ(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusiveWithMo(dummy, address, ARMv8.extractLoadMoFromLKMo(mo)); Store store = newRMWStoreExclusiveWithMo(address, e.getStoreValue(), true, ARMv8.extractStoreMoFromLKMo(mo)); @@ -537,7 +537,7 @@ public List visitLKMMAddUnless(LKMMAddUnless e) { return eventSequence( load, - newLocal(dummy, expressions.makeCast(expressions.makeBitwiseNEQ(regValue, unless), dummy.getType())), + newLocal(dummy, expressions.makeCast(expressions.makeNEQ(regValue, unless), dummy.getType())), branchOnCauCmpResult, store, fakeCtrlDep, diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java index e9e3cebfd5..e5ea678fa1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/program/processing/compilation/VisitorRISCV.java @@ -396,7 +396,7 @@ public List visitLKMMCmpXchg(LKMMCmpXchg e) { Register dummy = e.getFunction().newRegister(e.getResultRegister().getType()); Register statusReg = e.getFunction().newRegister(types.getBooleanType()); Label casEnd = newLabel("CAS_end"); - CondJump branchOnCasCmpResult = newJump(expressions.makeBitwiseNEQ(dummy, e.getExpectedValue()), casEnd); + CondJump branchOnCasCmpResult = newJump(expressions.makeNEQ(dummy, e.getExpectedValue()), casEnd); Load load = newRMWLoadExclusive(dummy, address); // TODO: No mo on the load? Store store = RISCV.newRMWStoreConditional(address, e.getStoreValue(), mo.equals(Tag.Linux.MO_MB) ? Tag.RISCV.MO_REL : "", true); From 4dbea5cda8b7a59c5d0ee364576dc28e7c74c797 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Tue, 10 Feb 2026 17:27:26 +0100 Subject: [PATCH 106/109] clarity and removed unused imports --- .../com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java | 6 +++++- .../dartagnan/parsers/program/visitors/VisitorAsmArm.java | 2 -- .../dartagnan/parsers/program/visitors/VisitorAsmPPC.java | 3 --- 3 files changed, 5 insertions(+), 6 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java index 7811a7cd55..d8df482fcc 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrCmpOp.java @@ -1,7 +1,11 @@ package com.dat3m.dartagnan.expression.pointers; import com.dat3m.dartagnan.expression.ExpressionKind; - +/* This operation is not recognised by the parsers. +* IntCmpOp is transformed into ptrCmpOp in the visitors if the two operands are pointers and the operators are either EQ or NEQ. +* If Operator is GTE, LTE, GT or LT, both operators are cast to integers and the operation remains IntCmpOp. +* Otherwise, when an integer and a pointer are compared, the pointer gets cast to integer. +*/ public enum PtrCmpOp implements ExpressionKind { EQ, NEQ //, GTE, LTE, GT, LT diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java index a991a5d663..789c7b7fd1 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmArm.java @@ -10,7 +10,6 @@ import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; import com.dat3m.dartagnan.expression.integers.IntCmpOp; -import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; @@ -25,7 +24,6 @@ import com.dat3m.dartagnan.program.event.core.Label; import com.dat3m.dartagnan.program.event.core.Local; -import static com.google.common.base.Preconditions.checkState; // The trickiest part of handling inline assembly is matching input and output registers on the LLVM side with the registers in the assembly. // The matching depends on what is specified in the constraints. diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java index e11843e794..e85eae9508 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/parsers/program/visitors/VisitorAsmPPC.java @@ -9,15 +9,12 @@ import com.dat3m.dartagnan.expression.Expression; import com.dat3m.dartagnan.expression.ExpressionFactory; import com.dat3m.dartagnan.expression.Type; -import com.dat3m.dartagnan.expression.integers.IntCmpOp; -import com.dat3m.dartagnan.expression.pointers.PtrCmpOp; import com.dat3m.dartagnan.expression.type.IntegerType; import com.dat3m.dartagnan.expression.type.PointerType; import com.dat3m.dartagnan.expression.type.TypeFactory; import com.dat3m.dartagnan.parsers.AsmPPCBaseVisitor; import com.dat3m.dartagnan.parsers.AsmPPCParser; import com.dat3m.dartagnan.parsers.program.utils.AsmUtils; -import com.dat3m.dartagnan.parsers.program.utils.ProgramBuilder; import com.dat3m.dartagnan.program.Function; import com.dat3m.dartagnan.program.Register; import com.dat3m.dartagnan.program.event.Event; From ee961a3772e16756dbd37b2895d2e4b1614e2eb7 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 12 Feb 2026 11:36:41 +0100 Subject: [PATCH 107/109] added comments --- .../com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java | 5 ++++- .../com/dat3m/dartagnan/expression/pointers/PtrConcat.java | 1 + .../com/dat3m/dartagnan/expression/pointers/PtrExtract.java | 2 ++ 3 files changed, 7 insertions(+), 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java index ad921f0cef..b983aeb683 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrAddExpr.java @@ -8,7 +8,10 @@ import com.dat3m.dartagnan.expression.type.PointerType; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; - +/* This expression has only one operation and therefore does not need an operation class. + * Similar to the compare operation, ptrAdd expression is not recognised by the parsers. + * IntAddOp is transformed into the ptrAdd expression in the visitors if Ptr + Int or Int + Ptr. + */ public class PtrAddExpr extends ExpressionBase { private final Expression base; diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java index bed5198e1a..4bd23ff07f 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrConcat.java @@ -11,6 +11,7 @@ import java.util.List; +/* Now that we have a memory type that supports tearing, this class is redundant */ public class PtrConcat extends NaryExpressionBase { public PtrConcat(List operands) { diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java index b01663ace6..21c9bd7d87 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/pointers/PtrExtract.java @@ -9,6 +9,8 @@ import com.dat3m.dartagnan.expression.utils.ExpressionHelper; import com.google.common.base.Preconditions; +/* Now that we have a memory type that supports tearing, this class is redundant */ + public class PtrExtract extends UnaryExpressionBase { private final int lowBit; From 382cf81297531bc89acc22f80800767cceea73c7 Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 12 Feb 2026 12:11:27 +0100 Subject: [PATCH 108/109] added import --- .../java/com/dat3m/dartagnan/expression/ExpressionFactory.java | 1 - 1 file changed, 1 deletion(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index 5b609c01b4..f831fa6bb9 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -653,7 +653,6 @@ public Expression makeEQ(Expression leftOperand, Expression rightOperand) { return makeFloatCmp(leftOperand, FloatCmpOp.OEQ, rightOperand); } else if (type instanceof MemoryType) { return new MemoryEqualExpr(booleanType, leftOperand, rightOperand); - return makeFloatCmp(leftOperand, FloatCmpOp.EQ, rightOperand); } else if (ExpressionHelper.isAggregateLike(type)) { return makeAggregateCmp(leftOperand, AggregateCmpOp.EQ, rightOperand); } From 059c6ec5aa35fe193681fda8ab3a4bfe00a5e37c Mon Sep 17 00:00:00 2001 From: Mahdhaoui Date: Thu, 12 Feb 2026 14:16:14 +0100 Subject: [PATCH 109/109] type fixes --- .../java/com/dat3m/dartagnan/encoding/PropertyEncoder.java | 5 +++-- .../com/dat3m/dartagnan/expression/ExpressionFactory.java | 3 +++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java index 0d928b0913..390b00edfe 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/encoding/PropertyEncoder.java @@ -518,8 +518,9 @@ private BooleanFormula referencesObject(List stores, boolean isValue, Mem return bmgr.makeTrue(); } final Expression objectEnd = expressions.makePtrAdd(object, object.size()); - final Expression overLowerBound = expressions.makeLTE(object, pointer, false); - final Expression underUpperBound = expressions.makeLT(pointer, objectEnd, false); + final Expression ptrAddr = expressions.makePtrToIntCast(pointer); + final Expression overLowerBound = expressions.makeLTE(expressions.makePtrToIntCast(object), ptrAddr, false); + final Expression underUpperBound = expressions.makeLT(ptrAddr, expressions.makePtrToIntCast(objectEnd), false); final Expression withinBounds = expressions.makeAnd(overLowerBound, underUpperBound); return context.getExpressionEncoder().encodeBooleanAt(withinBounds, stores.get(0)).formula(); } diff --git a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java index f831fa6bb9..27aed456d2 100644 --- a/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java +++ b/dartagnan/src/main/java/com/dat3m/dartagnan/expression/ExpressionFactory.java @@ -492,6 +492,9 @@ public Expression makePtrCast(Expression base, PointerType type) { public Expression makePtrToIntCast(Expression pointer, IntegerType type) { return new PtrToIntCast(type, pointer); } + public Expression makePtrToIntCast(Expression pointer) { + return makePtrToIntCast(pointer, archType); + } public Expression makeIntToPtrCast(Expression integer, PointerType pointerType) {