summaryrefslogtreecommitdiff
path: root/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala
diff options
context:
space:
mode:
authorLukas Rytz <lukas.rytz@gmail.com>2016-01-24 10:19:25 +0100
committerLukas Rytz <lukas.rytz@gmail.com>2016-01-24 13:02:08 +0100
commit1a9e649e34cda4306537d74ab425c33d5f6a77db (patch)
tree389a254831541bd8a02a3b03642249d3691c5dd2 /test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala
parent790ed59d9fe5ca396984b8a5135b7a091e4224f7 (diff)
downloadscala-1a9e649e34cda4306537d74ab425c33d5f6a77db.tar.gz
scala-1a9e649e34cda4306537d74ab425c33d5f6a77db.tar.bz2
scala-1a9e649e34cda4306537d74ab425c33d5f6a77db.zip
Jump optimizations may enable more push-pop elimination
Jump optimization replaces an unnecessary conditional jump, e.g. `IFNULL l; l: ...` by `POP`, which enables further push-pop elimination. Also introduces a `-YoptTrace` flag that traces the progress of the bytecode as it goes through local optimizations.
Diffstat (limited to 'test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala')
-rw-r--r--test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala16
1 files changed, 16 insertions, 0 deletions
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala
index ec063c6cb3..46e1cebfc4 100644
--- a/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala
+++ b/test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala
@@ -543,4 +543,20 @@ class MethodLevelOptsTest extends ClearAfterClass {
assertSameCode(getSingleMethod(c, "t6").instructions.dropNonOp, List(Op(ACONST_NULL), Op(ARETURN)))
assertSameCode(getSingleMethod(c, "t7").instructions.dropNonOp, List(Op(ICONST_0), Op(IRETURN)))
}
+
+ @Test
+ def elimRedundantNullCheck(): Unit = {
+ val code =
+ """class C {
+ | def t(x: Object) = {
+ | val bool = x == null
+ | if (x != null) 1 else 0
+ | }
+ |}
+ """.stripMargin
+ val List(c) = compileClasses(methodOptCompiler)(code)
+ assertSameCode(
+ getSingleMethod(c, "t").instructions.dropNonOp,
+ List(VarOp(ALOAD, 1), Jump(IFNULL, Label(6)), Op(ICONST_1), Op(IRETURN), Label(6), Op(ICONST_0), Op(IRETURN)))
+ }
}