diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2016-01-24 10:19:25 +0100 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2016-01-24 13:02:08 +0100 |
commit | 1a9e649e34cda4306537d74ab425c33d5f6a77db (patch) | |
tree | 389a254831541bd8a02a3b03642249d3691c5dd2 /test/junit/scala/tools/nsc/backend/jvm/opt/MethodLevelOptsTest.scala | |
parent | 790ed59d9fe5ca396984b8a5135b7a091e4224f7 (diff) | |
download | scala-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.scala | 16 |
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))) + } } |