From 35ab41e90070d4313219a0d8f00d8ca07711f47c Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Wed, 21 Dec 2016 13:18:33 +0300 Subject: [PATCH] JS: when removing unused temporary variable, process its RHS value. Fix KT-15325 --- .../inline/clean/TemporaryVariableElimination.kt | 11 ++++------- .../TemporaryVariableEliminationTest.kt | 2 ++ .../removeUnusedAndSubstitute.optimized.js | 13 +++++++++++++ .../removeUnusedAndSubstitute.original.js | 16 ++++++++++++++++ 4 files changed, 35 insertions(+), 7 deletions(-) create mode 100644 js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.optimized.js create mode 100644 js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.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 7fd12c2a6ce..ded4e3b3e99 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 @@ -507,7 +507,7 @@ internal class TemporaryVariableElimination(private val function: JsFunction) { initializers.forEach { accept(it) } if (isRemoved) { for (initializer in initializers) { - ctx.addPrevious(JsExpressionStatement(initializer).apply { synthetic = x.synthetic }) + ctx.addPrevious(JsExpressionStatement(accept(initializer)).apply { synthetic = x.synthetic }) } } else { @@ -530,10 +530,7 @@ internal class TemporaryVariableElimination(private val function: JsFunction) { val (name, value) = assignment if (shouldConsiderUnused(name)) { hasChanges = true - ctx.replaceMe(JsExpressionStatement(value).run { - synthetic = true - accept(this) - }) + ctx.replaceMe(accept(JsExpressionStatement(value)).apply { synthetic = true }) return false } } @@ -552,7 +549,7 @@ internal class TemporaryVariableElimination(private val function: JsFunction) { val name = x.name if (name != null && x.qualifier == null && name in namesToSubstitute) { val replacement = accept(definedValues[name]!!) - ctx.replaceMe(replacement) + ctx.replaceMe(replacement.apply { synthetic = true }) return false } return super.visit(x, ctx) @@ -569,7 +566,7 @@ internal class TemporaryVariableElimination(private val function: JsFunction) { if (assignment != null) { val name = assignment.first if (shouldConsiderUnused(name)) { - ctx.replaceMe(x.arg2) + ctx.replaceMe(accept(x.arg2).apply { synthetic = true }) } } super.endVisit(x, ctx) diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/TemporaryVariableEliminationTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/TemporaryVariableEliminationTest.kt index cc4b1315d4b..8daae5e6b27 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/TemporaryVariableEliminationTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/TemporaryVariableEliminationTest.kt @@ -42,4 +42,6 @@ class TemporaryVariableEliminationTest : BasicOptimizerTest("temporary-variable" @Test fun transitiveNotConsideredTrivial() = box() @Test fun assignmentToNonLocal() = box() + + @Test fun removeUnusedAndSubstitute() = box() } \ No newline at end of file diff --git a/js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.optimized.js b/js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.optimized.js new file mode 100644 index 00000000000..451457763dd --- /dev/null +++ b/js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.optimized.js @@ -0,0 +1,13 @@ +var log = ""; + +function test(a) { + var $tmp1; + log += $tmp1 = 1; + return a; +} + +function box() { + if (test(3) != 3) return "fail1"; + if (log != 1) return "fail2"; + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.original.js b/js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.original.js new file mode 100644 index 00000000000..cafbd4f9dcc --- /dev/null +++ b/js/js.translator/testData/js-optimizer/temporary-variable/removeUnusedAndSubstitute.original.js @@ -0,0 +1,16 @@ +var log = ""; + +function test(a) { + var $tmp1; + log += $tmp1 = 1; + var $tmp2 = $tmp1; + var $tmp3; + var $tmp4 = $tmp2; + return a; +} + +function box() { + if (test(3) != 3) return "fail1"; + if (log != 1) return "fail2"; + return "OK" +} \ No newline at end of file