[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() }