Skip to content

Commit 1272e50

Browse files
authored
Misleading Expansions (#180)
1 parent 6963a61 commit 1272e50

File tree

3 files changed

+18
-12
lines changed

3 files changed

+18
-12
lines changed

liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ConstantFolding.java

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -172,18 +172,24 @@ private static ValDerivationNode foldUnary(ValDerivationNode node) {
172172
// !true => false, !false => true
173173
boolean value = operand.isBooleanTrue();
174174
Expression res = new LiteralBoolean(!value);
175-
return new ValDerivationNode(res, new UnaryDerivationNode(operandNode, operator));
175+
DerivationNode origin = operandNode.getOrigin() != null ? new UnaryDerivationNode(operandNode, operator)
176+
: null;
177+
return new ValDerivationNode(res, origin);
176178
}
177179
// unary minus
178180
if ("-".equals(operator)) {
179181
// -(x) => -x
180182
if (operand instanceof LiteralInt) {
181183
Expression res = new LiteralInt(-((LiteralInt) operand).getValue());
182-
return new ValDerivationNode(res, new UnaryDerivationNode(operandNode, operator));
184+
DerivationNode origin = operandNode.getOrigin() != null ? new UnaryDerivationNode(operandNode, operator)
185+
: null;
186+
return new ValDerivationNode(res, origin);
183187
}
184188
if (operand instanceof LiteralReal) {
185189
Expression res = new LiteralReal(-((LiteralReal) operand).getValue());
186-
return new ValDerivationNode(res, new UnaryDerivationNode(operandNode, operator));
190+
DerivationNode origin = operandNode.getOrigin() != null ? new UnaryDerivationNode(operandNode, operator)
191+
: null;
192+
return new ValDerivationNode(res, origin);
187193
}
188194
}
189195

liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ExpressionSimplifier.java

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -84,8 +84,12 @@ private static ValDerivationNode simplifyValDerivationNode(ValDerivationNode nod
8484

8585
// return the conjunction with simplified children
8686
Expression newValue = new BinaryExpression(leftSimplified.getValue(), "&&", rightSimplified.getValue());
87-
DerivationNode newOrigin = new BinaryDerivationNode(leftSimplified, rightSimplified, "&&");
88-
return new ValDerivationNode(newValue, newOrigin);
87+
// only create origin if at least one child has a meaningful origin
88+
if (leftSimplified.getOrigin() != null || rightSimplified.getOrigin() != null) {
89+
DerivationNode newOrigin = new BinaryDerivationNode(leftSimplified, rightSimplified, "&&");
90+
return new ValDerivationNode(newValue, newOrigin);
91+
}
92+
return new ValDerivationNode(newValue, null);
8993
}
9094
// no simplification
9195
return node;

liquidjava-verifier/src/test/java/liquidjava/rj_language/opt/ExpressionSimplifierTest.java

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -120,9 +120,7 @@ void testSimpleComparison() {
120120
ValDerivationNode trueFromOr = new ValDerivationNode(new LiteralBoolean(true), orFalseTrue);
121121

122122
// !true = false
123-
ValDerivationNode valTrue2 = new ValDerivationNode(new LiteralBoolean(true), null);
124-
UnaryDerivationNode notOp = new UnaryDerivationNode(valTrue2, "!");
125-
ValDerivationNode falseFromNot = new ValDerivationNode(new LiteralBoolean(false), notOp);
123+
ValDerivationNode falseFromNot = new ValDerivationNode(new LiteralBoolean(false), null);
126124

127125
// true && false = false
128126
BinaryDerivationNode andTrueFalse = new BinaryDerivationNode(trueFromOr, falseFromNot, "&&");
@@ -187,10 +185,8 @@ void testArithmeticWithConstants() {
187185
BinaryDerivationNode div6By2 = new BinaryDerivationNode(val6, val2, "/");
188186
ValDerivationNode val3 = new ValDerivationNode(new LiteralInt(3), div6By2);
189187

190-
// -5 from unary negation of 5
191-
ValDerivationNode val5 = new ValDerivationNode(new LiteralInt(5), null);
192-
UnaryDerivationNode unaryNeg5 = new UnaryDerivationNode(val5, "-");
193-
ValDerivationNode valNeg5 = new ValDerivationNode(new LiteralInt(-5), unaryNeg5);
188+
// -5 is a literal with no origin
189+
ValDerivationNode valNeg5 = new ValDerivationNode(new LiteralInt(-5), null);
194190

195191
// 3 + (-5) = -2
196192
BinaryDerivationNode add3AndNeg5 = new BinaryDerivationNode(val3, valNeg5, "+");

0 commit comments

Comments
 (0)