From 47cb0cde01bfe920f54522ea9c2b56065985a93d Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 5 May 2016 18:44:32 +0300 Subject: [PATCH] JS/Inlining: in temporary variable elimination improve moving of some expressions which are provably pure --- .../inline/clean/TemporaryVariableElimination.kt | 16 ++++++++++++++-- .../transitiveNotConsideredTrivial.optimized.js | 13 +++++++++++++ .../transitiveNotConsideredTrivial.original.js | 14 ++++++++++++++ 3 files changed, 41 insertions(+), 2 deletions(-) create mode 100644 js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.optimized.js create mode 100644 js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.original.js diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/TemporaryVariableElimination.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/TemporaryVariableElimination.kt index 322572813dc..36c78a44abd 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/TemporaryVariableElimination.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/TemporaryVariableElimination.kt @@ -17,8 +17,8 @@ package org.jetbrains.kotlin.js.inline.clean import com.google.dart.compiler.backend.js.ast.* -import com.google.dart.compiler.backend.js.ast.metadata.synthetic import com.google.dart.compiler.backend.js.ast.metadata.sideEffects +import com.google.dart.compiler.backend.js.ast.metadata.synthetic import org.jetbrains.kotlin.js.inline.util.collectDefinedNames import org.jetbrains.kotlin.js.inline.util.collectFreeVariables import org.jetbrains.kotlin.js.translate.utils.JsAstUtils @@ -545,13 +545,25 @@ internal class TemporaryVariableElimination(private val root: JsStatement) { is JsNameRef -> { val qualifier = expr.qualifier if (qualifier == null) { - !expr.sideEffects || (expr.name?.let { definitions[it] ?: 0 <= 1 } ?: false) + if (!expr.sideEffects) { + true + } + else { + val name = expr.name + name != null && when (definitions[name] ?: 0) { + 0 -> true + 1 -> name !in namesToSubstitute || definedValues[name]?.let { isTrivial(it) } ?: false + else -> false + } + } } else { !expr.sideEffects && isTrivial(qualifier) } } is JsLiteral.JsValueLiteral -> true + is JsInvocation -> !expr.sideEffects && isTrivial(expr.qualifier) && expr.arguments.all { isTrivial(it) } + is JsArrayAccess -> isTrivial(expr.arrayExpression) && isTrivial(expr.indexExpression) else -> false } } \ No newline at end of file diff --git a/js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.optimized.js b/js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.optimized.js new file mode 100644 index 00000000000..eee4961eec7 --- /dev/null +++ b/js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.optimized.js @@ -0,0 +1,13 @@ +var global = 1; + +function se() { + return global++; +} + +function box() { + var $b = se(); + var result = $b + $b; + if (result != 2) return "fail: " + result; + + return "OK"; +} \ No newline at end of file diff --git a/js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.original.js b/js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.original.js new file mode 100644 index 00000000000..81828254d2e --- /dev/null +++ b/js/js.translator/testData/js-optimizer/temporary-variable/transitiveNotConsideredTrivial.original.js @@ -0,0 +1,14 @@ +var global = 1; + +function se() { + return global++; +} + +function box() { + var $a = se(); + var $b = $a; + var result = $b + $b; + if (result != 2) return "fail: " + result; + + return "OK"; +} \ No newline at end of file