From 6047746c90f1d26282126e724ffb26043a96c94b Mon Sep 17 00:00:00 2001 From: Alexey Andreev Date: Thu, 27 Apr 2017 17:32:27 +0300 Subject: [PATCH] Fix optimization in JS BE Don't apply while condition folding when corresponding break statement breaks outer loop. --- .../js/inline/clean/WhileConditionFolding.kt | 2 +- .../optimizer/WhileConditionFoldingTest.kt | 2 ++ .../labeledBreak.optimized.js | 19 +++++++++++++++++++ .../labeledBreak.original.js | 19 +++++++++++++++++++ 4 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.optimized.js create mode 100644 js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.original.js diff --git a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/WhileConditionFolding.kt b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/WhileConditionFolding.kt index 5a90ada6a93..c5b863b3006 100644 --- a/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/WhileConditionFolding.kt +++ b/js/js.inliner/src/org/jetbrains/kotlin/js/inline/clean/WhileConditionFolding.kt @@ -105,7 +105,7 @@ class WhileConditionFolding(val body: JsBlock) { // therefore for single `break` we should return `false`. is JsBreak -> { val target = statement.label?.name - if (label == null || label == target) JsLiteral.FALSE else null + if (label == target) JsLiteral.FALSE else null } // Code like this diff --git a/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/WhileConditionFoldingTest.kt b/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/WhileConditionFoldingTest.kt index c3f7fddd79e..86e5e6fa4b8 100644 --- a/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/WhileConditionFoldingTest.kt +++ b/js/js.tests/test/org/jetbrains/kotlin/js/test/optimizer/WhileConditionFoldingTest.kt @@ -40,4 +40,6 @@ class WhileConditionFoldingTest : BasicOptimizerTest("while-condition-folding") @Test fun doWhileWithNestedContinue() = box() @Test fun labeledContinueInNestedLoop() = box() + + @Test fun labeledBreak() = box() } \ No newline at end of file diff --git a/js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.optimized.js b/js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.optimized.js new file mode 100644 index 00000000000..b7c64c8cb39 --- /dev/null +++ b/js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.optimized.js @@ -0,0 +1,19 @@ +function box() { + var i = 0; + var j = 0; + var log = ""; + outer: while (i < 10) { + while (j < 10) { + if (i + j >= 3) { + break outer; + } + log += i + "," + j + ";"; + j++; + } + i++; + } + + if (log != "0,0;0,1;0,2;") return "fail: " + log; + + return "OK" +} \ No newline at end of file diff --git a/js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.original.js b/js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.original.js new file mode 100644 index 00000000000..b7c64c8cb39 --- /dev/null +++ b/js/js.translator/testData/js-optimizer/while-condition-folding/labeledBreak.original.js @@ -0,0 +1,19 @@ +function box() { + var i = 0; + var j = 0; + var log = ""; + outer: while (i < 10) { + while (j < 10) { + if (i + j >= 3) { + break outer; + } + log += i + "," + j + ";"; + j++; + } + i++; + } + + if (log != "0,0;0,1;0,2;") return "fail: " + log; + + return "OK" +} \ No newline at end of file