[Fir] Add extra implication in dfa for boolean operations
diff --git a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt index b20c3dd..b67d878 100644 --- a/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt +++ b/compiler/fir/resolve/src/org/jetbrains/kotlin/fir/resolve/dfa/FirDataFlowAnalyzer.kt
@@ -391,6 +391,9 @@ val constValue = const.value as Boolean val shouldInvert = isEq xor constValue + flow.addImplication((expressionVariable eq true) implies (operandVariable eq !shouldInvert)) + flow.addImplication((expressionVariable eq false) implies (operandVariable eq shouldInvert)) + logicSystem.translateVariableFromConditionInStatements( flow, operandVariable, @@ -968,6 +971,14 @@ val rightVariable = variableStorage.getOrCreateVariable(flow, binaryLogicExpression.rightOperand) val operatorVariable = variableStorage.getOrCreateVariable(flow, binaryLogicExpression) + if (isAnd) { + flow.addImplication((operatorVariable eq true) implies (leftVariable eq true)) + flow.addImplication((operatorVariable eq true) implies (rightVariable eq true)) + } else { + flow.addImplication((operatorVariable eq false) implies (leftVariable eq false)) + flow.addImplication((operatorVariable eq false) implies (rightVariable eq false)) + } + if (!node.leftOperandNode.isDead && node.rightOperandNode.isDead) { /* * If there was a jump from right argument then we know that we well exit from @@ -1026,8 +1037,13 @@ val previousFlow = node.previousFlow val booleanExpressionVariable = variableStorage.getOrCreateVariable(previousFlow, node.firstPreviousNode.fir) val variable = variableStorage.getOrCreateVariable(previousFlow, functionCall) + val flow = node.flow + + flow.addImplication((variable eq true) implies (booleanExpressionVariable eq false)) + flow.addImplication((variable eq false) implies (booleanExpressionVariable eq true)) + logicSystem.replaceVariableFromConditionInStatements( - node.flow, + flow, booleanExpressionVariable, variable, transform = { it.invertCondition() }