diff options
author | Lukas Rytz <lukas.rytz@gmail.com> | 2015-11-09 09:45:11 +0100 |
---|---|---|
committer | Lukas Rytz <lukas.rytz@gmail.com> | 2016-01-25 11:34:30 +0100 |
commit | 062109b51d0dba640933d749bf07f55d84f450d4 (patch) | |
tree | c7b00d187f49b777239f6ac1f3b8632e2e61c8b3 /test | |
parent | 9f7446450fec15d7563e5dcd0c12f56350951b7d (diff) | |
download | scala-062109b51d0dba640933d749bf07f55d84f450d4.tar.gz scala-062109b51d0dba640933d749bf07f55d84f450d4.tar.bz2 scala-062109b51d0dba640933d749bf07f55d84f450d4.zip |
Rewrite test for inlining higher-order functions
Diffstat (limited to 'test')
-rw-r--r-- | test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala | 20 | ||||
-rw-r--r-- | test/pending/pos/inliner2.flags | 35 | ||||
-rw-r--r-- | test/pending/pos/inliner2.scala | 57 |
3 files changed, 20 insertions, 92 deletions
diff --git a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala index 77133255f4..942b62b32c 100644 --- a/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala +++ b/test/junit/scala/tools/nsc/backend/jvm/opt/InlinerTest.scala @@ -1496,4 +1496,24 @@ class InlinerTest extends ClearAfterClass { IFNONNULL, ACONST_NULL, ATHROW, -1 /*label*/, ILOAD, ICONST_1, IADD, IRETURN)) } + + @Test // a test taken from the test suite for the 2.11 inliner + def oldInlineHigherOrderTest(): Unit = { + val code = + """class C { + | private var debug = false + | @inline private def ifelse[T](cond: => Boolean, ifPart: => T, elsePart: => T): T = if (cond) ifPart else elsePart + | final def t = ifelse(debug, 1, 2) + |} + """.stripMargin + val List(c) = compile(code) + val t = getSingleMethod(c, "t") + + // box-unbox will clean it up + assertEquals(getSingleMethod(c, "t").instructions.summary, + List( + ALOAD, "C$$$anonfun$1", IFEQ /*A*/, + "C$$$anonfun$2", IRETURN, + -1 /*A*/, "C$$$anonfun$3", IRETURN)) + } } diff --git a/test/pending/pos/inliner2.flags b/test/pending/pos/inliner2.flags deleted file mode 100644 index 4bf93a9c2a..0000000000 --- a/test/pending/pos/inliner2.flags +++ /dev/null @@ -1,35 +0,0 @@ --optimise -Ybackend:GenASM -Xfatal-warnings -/* -This is what we get with 2.11.2-M3 and -Yopt:l:project: - - public final int bob1(); - Code: - 0: aload_0 - 1: aload_0 - 2: astore 6 - 4: aload 6 - 6: invokedynamic #62, 0 // InvokeDynamic #0:apply$mcZ$sp:(LA;)Lscala/runtime/java8/JFunction0$mcZ$sp; - 11: checkcast #29 // class scala/Function0 - 14: invokedynamic #71, 0 // InvokeDynamic #1:apply$mcI$sp:()Lscala/runtime/java8/JFunction0$mcI$sp; - 19: checkcast #29 // class scala/Function0 - 22: invokedynamic #76, 0 // InvokeDynamic #2:apply$mcI$sp:()Lscala/runtime/java8/JFunction0$mcI$sp; - 27: checkcast #29 // class scala/Function0 - 30: astore 4 - 32: astore_3 - 33: astore_2 - 34: astore_1 - 35: aload_2 - 36: pop - 37: aload 6 - 39: invokevirtual #53 // Method A$$$anonfun$1:()Z - 42: ifeq 54 - 45: aload_3 - 46: invokeinterface #36, 1 // InterfaceMethod scala/Function0.apply:()Ljava/lang/Object; - 51: goto 61 - 54: aload 4 - 56: invokeinterface #36, 1 // InterfaceMethod scala/Function0.apply:()Ljava/lang/Object; - 61: astore 5 - 63: aload 5 - 65: invokestatic #82 // Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I - 68: ireturn -*/
\ No newline at end of file diff --git a/test/pending/pos/inliner2.scala b/test/pending/pos/inliner2.scala deleted file mode 100644 index bc83e04312..0000000000 --- a/test/pending/pos/inliner2.scala +++ /dev/null @@ -1,57 +0,0 @@ -// This isn't actually testing much, because no warning is emitted in versions -// before the fix which comes with this because the method isn't even considered -// for inlining due to the bug. -class A { - private var debug = false - @inline private def ifelse[T](cond: => Boolean, ifPart: => T, elsePart: => T): T = - if (cond) ifPart else elsePart - - final def bob1() = ifelse(debug, 1, 2) - final def bob2() = if (debug) 1 else 2 -} -// Cool: -// -// % ls -1 /tmp/2901/ -// A$$anonfun$bob1$1.class -// A$$anonfun$bob1$2.class -// A$$anonfun$bob1$3.class -// A.class -// % ls -1 /tmp/trunk -// A.class -// -// Observations: -// -// (1) The inlined version accesses the field: the explicit one calls the accessor. -// (2) The inlined version fails to eliminate boxing. With reference types it emits -// an unneeded checkcast. -// (3) The private var debug is mangled to A$$debug, but after inlining it is never accessed -// from outside of the class and doesn't need mangling. -// (4) We could forego emitting bytecode for ifelse entirely if it has been -// inlined at all sites. -// -// Generated bytecode for the above: -// -// public final int bob1(); -// Code: -// Stack=1, Locals=1, Args_size=1 -// 0: aload_0 -// 1: getfield #11; //Field A$$debug:Z -// 4: ifeq 14 -// 7: iconst_1 -// 8: invokestatic #41; //Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer; -// 11: goto 18 -// 14: iconst_2 -// 15: invokestatic #41; //Method scala/runtime/BoxesRunTime.boxToInteger:(I)Ljava/lang/Integer; -// 18: invokestatic #45; //Method scala/runtime/BoxesRunTime.unboxToInt:(Ljava/lang/Object;)I -// 21: ireturn -// -// public final int bob2(); -// Code: -// Stack=1, Locals=1, Args_size=1 -// 0: aload_0 -// 1: invokevirtual #48; //Method A$$debug:()Z -// 4: ifeq 11 -// 7: iconst_1 -// 8: goto 12 -// 11: iconst_2 -// 12: ireturn |