[FIR2IR] Fix generating of IINC instruction with FIR for inc/dec with constants
This commit is contained in:
committed by
TeamCityServer
parent
98596eaa08
commit
4bafa8628e
+31
-8
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.ir.types.*
|
|||||||
import org.jetbrains.kotlin.ir.util.isFunctionTypeOrSubtype
|
import org.jetbrains.kotlin.ir.util.isFunctionTypeOrSubtype
|
||||||
import org.jetbrains.kotlin.ir.util.isInterface
|
import org.jetbrains.kotlin.ir.util.isInterface
|
||||||
import org.jetbrains.kotlin.ir.util.render
|
import org.jetbrains.kotlin.ir.util.render
|
||||||
|
import org.jetbrains.kotlin.name.StandardClassIds
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects
|
import org.jetbrains.kotlin.psi2ir.generators.hasNoSideEffects
|
||||||
import org.jetbrains.kotlin.psi2ir.generators.isUnchanging
|
import org.jetbrains.kotlin.psi2ir.generators.isUnchanging
|
||||||
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
import org.jetbrains.kotlin.types.AbstractTypeChecker
|
||||||
@@ -316,14 +317,8 @@ class CallAndReferenceGenerator(
|
|||||||
val calleeReference = variableAssignment.calleeReference
|
val calleeReference = variableAssignment.calleeReference
|
||||||
val symbol =
|
val symbol =
|
||||||
calleeReference.toSymbolForCall(session, classifierStorage, declarationStorage, conversionScope, preferGetter = false)
|
calleeReference.toSymbolForCall(session, classifierStorage, declarationStorage, conversionScope, preferGetter = false)
|
||||||
val origin = if (variableAssignment.source?.kind is FirFakeSourceElementKind.DesugaredIncrementOrDecrement) {
|
val origin = getIrStatementOrigin(variableAssignment)
|
||||||
if ((variableAssignment.rValue as? FirFunctionCall)?.calleeReference?.name?.asString() == "inc")
|
|
||||||
IrStatementOrigin.PREFIX_INCR
|
|
||||||
else
|
|
||||||
IrStatementOrigin.PREFIX_DECR
|
|
||||||
} else {
|
|
||||||
IrStatementOrigin.EQ
|
|
||||||
}
|
|
||||||
return variableAssignment.convertWithOffsets { startOffset, endOffset ->
|
return variableAssignment.convertWithOffsets { startOffset, endOffset ->
|
||||||
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
|
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
|
||||||
when (symbol) {
|
when (symbol) {
|
||||||
@@ -391,6 +386,34 @@ class CallAndReferenceGenerator(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private fun getIrStatementOrigin(variableAssignment: FirVariableAssignment): IrStatementOriginImpl {
|
||||||
|
val rValue = variableAssignment.rValue
|
||||||
|
if (rValue is FirFunctionCall) {
|
||||||
|
val resolvedSymbol = rValue.calleeReference.toResolvedCallableSymbol()
|
||||||
|
val callableId = resolvedSymbol?.callableId
|
||||||
|
if (callableId?.classId == StandardClassIds.Int &&
|
||||||
|
variableAssignment.calleeReference.toResolvedCallableSymbol() == rValue.explicitReceiver?.toResolvedCallableSymbol()
|
||||||
|
) {
|
||||||
|
val callableName = callableId.callableName.asString()
|
||||||
|
if (callableName == "inc") {
|
||||||
|
return IrStatementOrigin.PREFIX_INCR
|
||||||
|
} else if (callableName == "dec") {
|
||||||
|
return IrStatementOrigin.PREFIX_DECR
|
||||||
|
} else {
|
||||||
|
val argument = ((rValue.arguments.singleOrNull() as? FirConstExpression<*>)?.value as? Long)
|
||||||
|
if (argument != null) {
|
||||||
|
if (callableName == "plus" && argument >= -128 && argument <= 127) {
|
||||||
|
return IrStatementOrigin.PREFIX_INCR
|
||||||
|
} else if (callableName == "minus" && argument >= -127 && argument <= 128) {
|
||||||
|
return IrStatementOrigin.PREFIX_DECR
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return IrStatementOrigin.EQ
|
||||||
|
}
|
||||||
|
|
||||||
fun convertToIrConstructorCall(annotation: FirAnnotation): IrExpression {
|
fun convertToIrConstructorCall(annotation: FirAnnotation): IrExpression {
|
||||||
val coneType = annotation.annotationTypeRef.coneTypeSafe<ConeLookupTagBasedType>()
|
val coneType = annotation.annotationTypeRef.coneTypeSafe<ConeLookupTagBasedType>()
|
||||||
val type = coneType?.toIrType()
|
val type = coneType?.toIrType()
|
||||||
|
|||||||
@@ -1,4 +1,3 @@
|
|||||||
// IGNORE_BACKEND_FIR: JVM_IR
|
|
||||||
fun main(args: Array<String>) {
|
fun main(args: Array<String>) {
|
||||||
var i = 10
|
var i = 10
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user