summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/compiler/scala/tools/nsc/backend/icode/GenICode.scala9
-rw-r--r--test/files/run/t7852.check22
2 files changed, 12 insertions, 19 deletions
diff --git a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
index 1413add240..a80fee876e 100644
--- a/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
+++ b/src/compiler/scala/tools/nsc/backend/icode/GenICode.scala
@@ -1320,6 +1320,7 @@ abstract class GenICode extends SubComponent {
*/
def isNull(t: Tree) = cond(t) { case Literal(Constant(null)) => true }
def isLiteral(t: Tree) = cond(t) { case Literal(_) => true }
+ def isNonNullExpr(t: Tree) = isLiteral(t) || ((t.symbol ne null) && t.symbol.isModule)
/* If l or r is constant null, returns the other ; otherwise null */
def ifOneIsNull(l: Tree, r: Tree) = if (isNull(l)) r else if (isNull(r)) l else null
@@ -1515,8 +1516,12 @@ abstract class GenICode extends SubComponent {
val branchesReachable = !ctx1.bb.ignore
ctx1.bb emitOnly CZJUMP(thenCtx.bb, elseCtx.bb, EQ, ObjectReference)
branchesReachable
- } else if (isLiteral(l)) {
- // "" == expr -> "".equals(expr) (no null check)
+ } else if (isNonNullExpr(l)) {
+ // Avoid null check if L is statically non-null.
+ //
+ // "" == expr -> "".equals(expr)
+ // Nil == expr -> Nil.equals(expr)
+ //
// Common enough (through pattern matching) to treat this specially here rather than
// hoping that -Yconst-opt is enabled. The impossible branches for null checks lead
// to spurious "branch not covered" warnings in Jacoco code coverage.
diff --git a/test/files/run/t7852.check b/test/files/run/t7852.check
index 648f464aa2..ec63f5378c 100644
--- a/test/files/run/t7852.check
+++ b/test/files/run/t7852.check
@@ -21,30 +21,18 @@ module
GETSTATIC scala/collection/immutable/Nil$.MODULE$ : Lscala/collection/immutable/Nil$;
ALOAD 0
INVOKEVIRTUAL java/lang/Object.toString ()Ljava/lang/String;
- ASTORE 1
- DUP
- IFNONNULL L0
- POP
- ALOAD 1
- IFNULL L1
- GOTO L2
- L0
- FRAME FULL [Lean java/lang/String] [scala/collection/immutable/Nil$]
- ALOAD 1
INVOKEVIRTUAL java/lang/Object.equals (Ljava/lang/Object;)Z
- IFEQ L2
- L1
- FRAME SAME
+ IFEQ L0
ICONST_1
- GOTO L3
- L2
+ GOTO L1
+ L0
FRAME SAME
ICONST_0
- L3
+ L1
FRAME SAME1 I
POP
RETURN
MAXSTACK = 2
- MAXLOCALS = 2
+ MAXLOCALS = 1