[FIR2IR] Fix generating of IINC instruction with FIR for inc/dec with constants

This commit is contained in:
Ivan Kochurkin
2021-10-11 22:34:55 +03:00
committed by TeamCityServer
parent 98596eaa08
commit 4bafa8628e
2 changed files with 31 additions and 9 deletions
@@ -46,6 +46,7 @@ import org.jetbrains.kotlin.ir.types.*
import org.jetbrains.kotlin.ir.util.isFunctionTypeOrSubtype
import org.jetbrains.kotlin.ir.util.isInterface
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.isUnchanging
import org.jetbrains.kotlin.types.AbstractTypeChecker
@@ -316,14 +317,8 @@ class CallAndReferenceGenerator(
val calleeReference = variableAssignment.calleeReference
val symbol =
calleeReference.toSymbolForCall(session, classifierStorage, declarationStorage, conversionScope, preferGetter = false)
val origin = if (variableAssignment.source?.kind is FirFakeSourceElementKind.DesugaredIncrementOrDecrement) {
if ((variableAssignment.rValue as? FirFunctionCall)?.calleeReference?.name?.asString() == "inc")
IrStatementOrigin.PREFIX_INCR
else
IrStatementOrigin.PREFIX_DECR
} else {
IrStatementOrigin.EQ
}
val origin = getIrStatementOrigin(variableAssignment)
return variableAssignment.convertWithOffsets { startOffset, endOffset ->
val assignedValue = visitor.convertToIrExpression(variableAssignment.rValue)
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 {
val coneType = annotation.annotationTypeRef.coneTypeSafe<ConeLookupTagBasedType>()
val type = coneType?.toIrType()
@@ -1,4 +1,3 @@
// IGNORE_BACKEND_FIR: JVM_IR
fun main(args: Array<String>) {
var i = 10