psi2ir: don't generate temporaries in dynamic array augmented assignment

In constructs such as 'd[i] += x', where both indexed get and indexed
set are dynamic calls, it's safe to generate augmented assignment body
directly, without temporary variables for array ('d') and index ('i').
Note that corresponding IntermediateValue's are OnceExpressionValue's,
which would throw an exception if this assumption is violated.
This commit is contained in:
Dmitry Petrov
2019-02-13 14:16:54 +03:00
parent 580eb6fcac
commit 77cbd10f9c
3 changed files with 76 additions and 96 deletions
@@ -3,42 +3,22 @@ FILE fqName:<root> fileName:/dynamicArrayIncrementDecrement.kt
VALUE_PARAMETER name:d index:0 type:dynamic flags:
BLOCK_BODY
VAR name:t1 type:dynamic flags:val
BLOCK type=dynamic origin=PREFIX_INCR
VAR IR_TEMPORARY_VARIABLE name:tmp0_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp1_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="prefixIncr"
DYN_OP operator=PREFIX_INCREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp0_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp1_index0: String' type=kotlin.String origin=null
DYN_OP operator=PREFIX_INCREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
0: CONST String type=kotlin.String value="prefixIncr"
VAR name:t2 type:dynamic flags:val
BLOCK type=dynamic origin=PREFIX_DECR
VAR IR_TEMPORARY_VARIABLE name:tmp2_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp3_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="prefixDecr"
DYN_OP operator=PREFIX_DECREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp2_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp3_index0: String' type=kotlin.String origin=null
DYN_OP operator=PREFIX_DECREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
0: CONST String type=kotlin.String value="prefixDecr"
VAR name:t3 type:dynamic flags:val
BLOCK type=dynamic origin=POSTFIX_INCR
VAR IR_TEMPORARY_VARIABLE name:tmp4_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp5_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="postfixIncr"
DYN_OP operator=POSTFIX_INCREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp4_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp5_index0: String' type=kotlin.String origin=null
DYN_OP operator=POSTFIX_INCREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
0: CONST String type=kotlin.String value="postfixIncr"
VAR name:t4 type:dynamic flags:val
BLOCK type=dynamic origin=POSTFIX_DECR
VAR IR_TEMPORARY_VARIABLE name:tmp6_array type:dynamic flags:val
GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
VAR IR_TEMPORARY_VARIABLE name:tmp7_index0 type:kotlin.String flags:val
CONST String type=kotlin.String value="postfixDecr"
DYN_OP operator=POSTFIX_DECREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'tmp6_array: dynamic' type=dynamic origin=null
0: GET_VAR 'tmp7_index0: String' type=kotlin.String origin=null
DYN_OP operator=POSTFIX_DECREMENT type=dynamic
receiver: DYN_OP operator=ARRAY_ACCESS type=dynamic
receiver: GET_VAR 'value-parameter d: dynamic' type=dynamic origin=null
0: CONST String type=kotlin.String value="postfixDecr"