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