From 922adff890bbb0a1dfec9e78bf43f887aebf1324 Mon Sep 17 00:00:00 2001 From: Ricardo Costa Date: Fri, 22 May 2026 15:13:16 +0100 Subject: [PATCH] Preserve Origins in Ternary Simplifications --- .../rj_language/opt/ExpressionFolding.java | 16 +++++++++--- .../rj_language/opt/VariablePropagation.java | 26 ++++++++++++++++++- .../opt/ExpressionSimplifierTest.java | 16 ++++++++++++ 3 files changed, 54 insertions(+), 4 deletions(-) diff --git a/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ExpressionFolding.java b/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ExpressionFolding.java index 482a9948..a067f1e1 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ExpressionFolding.java +++ b/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/ExpressionFolding.java @@ -235,10 +235,20 @@ private static ValDerivationNode foldUnary(ValDerivationNode node) { */ private static ValDerivationNode foldIte(ValDerivationNode node) { Ite iteExp = (Ite) node.getValue(); + DerivationNode parent = node.getOrigin(); - ValDerivationNode condNode = fold(new ValDerivationNode(iteExp.getCondition(), null)); - ValDerivationNode thenNode = fold(new ValDerivationNode(iteExp.getThen(), null)); - ValDerivationNode elseNode = fold(new ValDerivationNode(iteExp.getElse(), null)); + ValDerivationNode condNode; + ValDerivationNode thenNode; + ValDerivationNode elseNode; + if (parent instanceof IteDerivationNode iteOrigin) { + condNode = fold(iteOrigin.getCondition()); + thenNode = fold(iteOrigin.getThenBranch()); + elseNode = fold(iteOrigin.getElseBranch()); + } else { + condNode = fold(new ValDerivationNode(iteExp.getCondition(), null)); + thenNode = fold(new ValDerivationNode(iteExp.getThen(), null)); + elseNode = fold(new ValDerivationNode(iteExp.getElse(), null)); + } Expression condition = condNode.getValue(); Expression thenExp = thenNode.getValue(); diff --git a/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/VariablePropagation.java b/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/VariablePropagation.java index 48b37e03..eb2d7675 100644 --- a/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/VariablePropagation.java +++ b/liquidjava-verifier/src/main/java/liquidjava/rj_language/opt/VariablePropagation.java @@ -4,6 +4,8 @@ import liquidjava.rj_language.ast.Enum; import liquidjava.rj_language.ast.Expression; import liquidjava.rj_language.ast.FunctionInvocation; +import liquidjava.rj_language.ast.GroupExpression; +import liquidjava.rj_language.ast.Ite; import liquidjava.rj_language.ast.UnaryExpression; import liquidjava.rj_language.ast.Var; import liquidjava.rj_language.opt.derivation_node.BinaryDerivationNode; @@ -101,6 +103,28 @@ private static ValDerivationNode propagateRecursive(Expression exp, Map