JVM: KT-40664 disable optimization for 'ULong in range of UInt' case

This commit is contained in:
Dmitry Petrov
2020-07-29 15:22:21 +03:00
parent f2493d0950
commit dae358c792
11 changed files with 66 additions and 17 deletions
@@ -29,7 +29,6 @@ import org.jetbrains.kotlin.codegen.range.inExpression.InExpressionGenerator
import org.jetbrains.kotlin.codegen.range.inExpression.InFloatingPointRangeLiteralExpressionGenerator
import org.jetbrains.kotlin.codegen.range.inExpression.InIntegralContinuousRangeExpressionGenerator
import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.isTopLevelInPackage
import org.jetbrains.kotlin.psi.KtExpression
import org.jetbrains.kotlin.psi.KtForExpression
import org.jetbrains.kotlin.psi.KtSimpleNameExpression
@@ -70,9 +69,10 @@ abstract class PrimitiveNumberRangeIntrinsicRangeValue(
?: throw AssertionError("Floating point intrinsic range value should be a range literal")
InFloatingPointRangeLiteralExpressionGenerator(operatorReference, rangeLiteral, comparisonGenerator, codegen.frameMap)
}
else -> InIntegralContinuousRangeExpressionGenerator(
operatorReference, rangeContainsTypeInfo, getBoundedValue(codegen), comparisonGenerator, codegen.frameMap
)
else ->
InIntegralContinuousRangeExpressionGenerator(
operatorReference, rangeContainsTypeInfo, getBoundedValue(codegen), comparisonGenerator, codegen.frameMap
)
}
}
@@ -87,7 +87,10 @@ fun getComparisonGeneratorForRangeContainsCall(
getComparisonGeneratorForKotlinType(elementType)
KotlinBuiltIns.isUInt(elementType) ->
UIntComparisonGenerator
if (KotlinBuiltIns.isULong(valueParameterType))
null
else
UIntComparisonGenerator
KotlinBuiltIns.isULong(elementType) ->
ULongComparisonGenerator
@@ -24361,6 +24361,11 @@ public class FirBlackBoxCodegenTestGenerated extends AbstractFirBlackBoxCodegenT
runTest("compiler/testData/codegen/box/ranges/unsigned/kt36953_continue.kt");
}
@TestMetadata("outOfBoundsInMixedContains.kt")
public void testOutOfBoundsInMixedContains() throws Exception {
runTest("compiler/testData/codegen/box/ranges/unsigned/outOfBoundsInMixedContains.kt");
}
@TestMetadata("compiler/testData/codegen/box/ranges/unsigned/expression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -0,0 +1,11 @@
// WITH_RUNTIME
// KJS_WITH_FULL_RUNTIME
fun testIn(x: ULong) =
x in UInt.MIN_VALUE..UInt.MAX_VALUE
fun box(): String =
if (testIn(UInt.MAX_VALUE.toULong() + 1UL))
"Failed"
else
"OK"
@@ -16,9 +16,9 @@ fun ui_us(x: UInt, a: UShort, b: UShort) = x in a..b
fun ui_ui(x: UInt, a: UInt, b: UInt) = x in a..b
fun ui_ul(x: UInt, a: ULong, b: ULong) = x in a..b
fun ul_ub(x: ULong, a: UByte, b: UByte) = x in a..b
fun ul_us(x: ULong, a: UShort, b: UShort) = x in a..b
fun ul_ui(x: ULong, a: UInt, b: UInt) = x in a..b
fun ul_ub(x: ULong, a: UByte, b: UByte) = x in a..b // ULong in range of UInt, uses non-intrinsic 'contains'
fun ul_us(x: ULong, a: UShort, b: UShort) = x in a..b // ULong in range of UInt, uses non-intrinsic 'contains'
fun ul_ui(x: ULong, a: UInt, b: UInt) = x in a..b // ULong in range of UInt, uses non-intrinsic 'contains'
fun ul_ul(x: ULong, a: ULong, b: ULong) = x in a..b
fun n_ub_ub(x: UByte, a: UByte, b: UByte) = x !in a..b
@@ -36,17 +36,17 @@ fun n_ui_us(x: UInt, a: UShort, b: UShort) = x !in a..b
fun n_ui_ui(x: UInt, a: UInt, b: UInt) = x !in a..b
fun n_ui_ul(x: UInt, a: ULong, b: ULong) = x !in a..b
fun n_ul_ub(x: ULong, a: UByte, b: UByte) = x !in a..b
fun n_ul_us(x: ULong, a: UShort, b: UShort) = x !in a..b
fun n_ul_ui(x: ULong, a: UInt, b: UInt) = x !in a..b
fun n_ul_ub(x: ULong, a: UByte, b: UByte) = x !in a..b // ULong in range of UInt, uses non-intrinsic 'contains'
fun n_ul_us(x: ULong, a: UShort, b: UShort) = x !in a..b // ULong in range of UInt, uses non-intrinsic 'contains'
fun n_ul_ui(x: ULong, a: UInt, b: UInt) = x !in a..b // ULong in range of UInt, uses non-intrinsic 'contains'
fun n_ul_ul(x: ULong, a: ULong, b: ULong) = x !in a..b
// 0 contains
// 16 IFLE
// 16 IFLT
// 16 IFGE
// 16 IFGT
// 6 L2I
// 6 contains
// 13 IFLE
// 13 IFLT
// 13 IFGE
// 13 IFGT
// 0 L2I
// 22 SIPUSH 255
// 24 LDC 65535
// 2 LDC 4294967295
@@ -25957,6 +25957,11 @@ public class BlackBoxCodegenTestGenerated extends AbstractBlackBoxCodegenTest {
runTest("compiler/testData/codegen/box/ranges/unsigned/kt36953_continue.kt");
}
@TestMetadata("outOfBoundsInMixedContains.kt")
public void testOutOfBoundsInMixedContains() throws Exception {
runTest("compiler/testData/codegen/box/ranges/unsigned/outOfBoundsInMixedContains.kt");
}
@TestMetadata("compiler/testData/codegen/box/ranges/unsigned/expression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -23591,6 +23591,11 @@ public class LightAnalysisModeTestGenerated extends AbstractLightAnalysisModeTes
runTest("compiler/testData/codegen/box/ranges/unsigned/kt36953_continue.kt");
}
@TestMetadata("outOfBoundsInMixedContains.kt")
public void testOutOfBoundsInMixedContains() throws Exception {
runTest("compiler/testData/codegen/box/ranges/unsigned/outOfBoundsInMixedContains.kt");
}
@TestMetadata("compiler/testData/codegen/box/ranges/unsigned/expression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -24361,6 +24361,11 @@ public class IrBlackBoxCodegenTestGenerated extends AbstractIrBlackBoxCodegenTes
runTest("compiler/testData/codegen/box/ranges/unsigned/kt36953_continue.kt");
}
@TestMetadata("outOfBoundsInMixedContains.kt")
public void testOutOfBoundsInMixedContains() throws Exception {
runTest("compiler/testData/codegen/box/ranges/unsigned/outOfBoundsInMixedContains.kt");
}
@TestMetadata("compiler/testData/codegen/box/ranges/unsigned/expression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -20727,6 +20727,11 @@ public class IrJsCodegenBoxES6TestGenerated extends AbstractIrJsCodegenBoxES6Tes
runTest("compiler/testData/codegen/box/ranges/unsigned/kt36953_continue.kt");
}
@TestMetadata("outOfBoundsInMixedContains.kt")
public void testOutOfBoundsInMixedContains() throws Exception {
runTest("compiler/testData/codegen/box/ranges/unsigned/outOfBoundsInMixedContains.kt");
}
@TestMetadata("compiler/testData/codegen/box/ranges/unsigned/expression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -20727,6 +20727,11 @@ public class IrJsCodegenBoxTestGenerated extends AbstractIrJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/ranges/unsigned/kt36953_continue.kt");
}
@TestMetadata("outOfBoundsInMixedContains.kt")
public void testOutOfBoundsInMixedContains() throws Exception {
runTest("compiler/testData/codegen/box/ranges/unsigned/outOfBoundsInMixedContains.kt");
}
@TestMetadata("compiler/testData/codegen/box/ranges/unsigned/expression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)
@@ -20742,6 +20742,11 @@ public class JsCodegenBoxTestGenerated extends AbstractJsCodegenBoxTest {
runTest("compiler/testData/codegen/box/ranges/unsigned/kt36953_continue.kt");
}
@TestMetadata("outOfBoundsInMixedContains.kt")
public void testOutOfBoundsInMixedContains() throws Exception {
runTest("compiler/testData/codegen/box/ranges/unsigned/outOfBoundsInMixedContains.kt");
}
@TestMetadata("compiler/testData/codegen/box/ranges/unsigned/expression")
@TestDataPath("$PROJECT_ROOT")
@RunWith(JUnit3RunnerWithInners.class)