Rewrite local var increment optimization
This commit is contained in:
@@ -54,19 +54,15 @@ public class Increment extends IntrinsicMethod {
|
|||||||
assert isPrimitive(returnType) : "Return type of Increment intrinsic should be of primitive type : " + returnType;
|
assert isPrimitive(returnType) : "Return type of Increment intrinsic should be of primitive type : " + returnType;
|
||||||
|
|
||||||
if (arguments.size() > 0) {
|
if (arguments.size() > 0) {
|
||||||
JetExpression operand = JetPsiUtil.deparenthesize(arguments.get(0));
|
JetExpression operand = arguments.get(0);
|
||||||
if (operand instanceof JetReferenceExpression && returnType == Type.INT_TYPE) {
|
StackValue stackValue = codegen.genQualified(receiver, operand);
|
||||||
int index = codegen.indexOfLocal((JetReferenceExpression) operand);
|
StackValue result;
|
||||||
if (index >= 0) {
|
if (stackValue instanceof StackValue.Local && Type.INT_TYPE.equals(stackValue.type)) {
|
||||||
JetType operandType = codegen.getBindingContext().get(EXPRESSION_TYPE, operand);
|
result = StackValue.preIncrementForLocalVar(((StackValue.Local) stackValue).index, myDelta);
|
||||||
if (operandType != null && KotlinBuiltIns.getInstance().isPrimitiveType(operandType)) {
|
} else {
|
||||||
StackValue.preIncrementForLocalVar(index, myDelta).put(returnType, v);
|
result = StackValue.preIncrement(returnType, stackValue, myDelta, this, null, codegen);
|
||||||
return returnType;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
StackValue value = StackValue.preIncrement(returnType, codegen.genQualified(receiver, operand), myDelta, this, null, codegen);
|
result.put(returnType, v);
|
||||||
value.put(returnType, v);
|
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
receiver.put(returnType, v);
|
receiver.put(returnType, v);
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
fun main(args: Array<String>) {
|
||||||
|
var i = 10
|
||||||
|
++i
|
||||||
|
++(@l i)
|
||||||
|
++(i: Int)
|
||||||
|
++(@l (i: Int))
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4 IINC
|
||||||
@@ -163,6 +163,12 @@ public class BytecodeTextTestGenerated extends AbstractBytecodeTextTest {
|
|||||||
doTest(fileName);
|
doTest(fileName);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("prefixIntVarIncrement.kt")
|
||||||
|
public void testPrefixIntVarIncrement() throws Exception {
|
||||||
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/prefixIntVarIncrement.kt");
|
||||||
|
doTest(fileName);
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("privateDefaultArgs.kt")
|
@TestMetadata("privateDefaultArgs.kt")
|
||||||
public void testPrivateDefaultArgs() throws Exception {
|
public void testPrivateDefaultArgs() throws Exception {
|
||||||
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/privateDefaultArgs.kt");
|
String fileName = JetTestUtils.navigationMetadata("compiler/testData/codegen/bytecodeText/privateDefaultArgs.kt");
|
||||||
|
|||||||
Reference in New Issue
Block a user