Skip to content

Commit d295791

Browse files
Remove unnecessary store when generating "=="
1 parent 19a1477 commit d295791

File tree

2 files changed

+19
-24
lines changed

2 files changed

+19
-24
lines changed

compiler/src/dotty/tools/backend/jvm/BCodeBodyBuilder.scala

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1713,26 +1713,23 @@ trait BCodeBodyBuilder extends BCodeSkelBuilder {
17131713
genCZJUMP(success, failure, Primitives.NE, BOOL, targetIfNoJump)
17141714
} else {
17151715
// l == r -> if (l eq null) r eq null else l.equals(r)
1716-
val eqEqTempLocal = locals.makeLocal(ObjectRef, nme.EQEQ_LOCAL_VAR.mangledString, defn.ObjectType, r.span)
17171716
val lNull = new asm.Label
17181717
val lNonNull = new asm.Label
17191718

1720-
genLoad(l, ObjectRef)
1719+
genLoad(r, ObjectRef) // load rhs --> (r)
17211720
stack.push(ObjectRef)
1722-
genLoad(r, ObjectRef)
1721+
genLoad(l, ObjectRef) // load lhs --> (l,r)
17231722
stack.pop()
1724-
locals.store(eqEqTempLocal)
1725-
bc dup ObjectRef
1726-
genCZJUMP(lNull, lNonNull, Primitives.EQ, ObjectRef, targetIfNoJump = lNull)
1723+
bc dup ObjectRef // duplicate top stack variable --> (l,l,r)
1724+
genCZJUMP(lNull, lNonNull, Primitives.EQ, ObjectRef, targetIfNoJump = lNull) // compare lhs with NULL --> (l,r)
17271725

17281726
markProgramPoint(lNull)
1729-
bc drop ObjectRef
1730-
locals.load(eqEqTempLocal)
1731-
genCZJUMP(success, failure, Primitives.EQ, ObjectRef, targetIfNoJump = lNonNull)
1727+
bc drop ObjectRef // drop top stack variable --> (r)
1728+
genCZJUMP(success, failure, Primitives.EQ, ObjectRef, targetIfNoJump = lNonNull) // --> (-)
17321729

17331730
markProgramPoint(lNonNull)
1734-
locals.load(eqEqTempLocal)
1735-
genCallMethod(defn.Any_equals, InvokeStyle.Virtual)
1731+
emit(asm.Opcodes.SWAP) //swap l and r for correct .equals ordering --> (r,l)
1732+
genCallMethod(defn.Any_equals, InvokeStyle.Virtual) // --> (-)
17361733
genCZJUMP(success, failure, Primitives.NE, BOOL, targetIfNoJump)
17371734
}
17381735
}

compiler/test/dotty/tools/backend/jvm/DottyBytecodeTests.scala

Lines changed: 11 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1168,7 +1168,7 @@ class DottyBytecodeTests extends DottyBytecodeTest {
11681168

11691169
val m1Meth = getMethod(fooClass, "m1")
11701170

1171-
assertSameCode(m1Meth, List(
1171+
assertSameCode(m1Meth,List(
11721172
VarOp(ALOAD, 1),
11731173
VarOp(ASTORE, 2),
11741174
VarOp(ALOAD, 2),
@@ -1189,29 +1189,27 @@ class DottyBytecodeTests extends DottyBytecodeTest {
11891189
VarOp(ILOAD, 5),
11901190
Op(IRETURN),
11911191
Label(19),
1192+
VarOp(ALOAD, 2),
11921193
Field(GETSTATIC, "scala/package$", "MODULE$", "Lscala/package$;"),
11931194
Invoke(INVOKEVIRTUAL, "scala/package$", "Nil", "()Lscala/collection/immutable/Nil$;", false),
1194-
VarOp(ALOAD, 2),
1195-
VarOp(ASTORE, 7),
11961195
Op(DUP),
1197-
Jump(IFNONNULL, Label(31)),
1196+
Jump(IFNONNULL, Label(29)),
11981197
Op(POP),
1199-
VarOp(ALOAD, 7),
1200-
Jump(IFNULL, Label(36)),
1201-
Jump(GOTO, Label(40)),
1202-
Label(31),
1203-
VarOp(ALOAD, 7),
1198+
Jump(IFNULL, Label(34)),
1199+
Jump(GOTO, Label(38)),
1200+
Label(29),
1201+
Op(SWAP),
12041202
Invoke(INVOKEVIRTUAL, "java/lang/Object", "equals", "(Ljava/lang/Object;)Z", false),
1205-
Jump(IFEQ, Label(40)),
1206-
Label(36),
1203+
Jump(IFEQ, Label(38)),
1204+
Label(34),
12071205
IntOp(BIPUSH, 20),
12081206
Op(IRETURN),
1209-
Label(40),
1207+
Label(38),
12101208
TypeOp(NEW, "scala/MatchError"),
12111209
Op(DUP),
12121210
VarOp(ALOAD, 2),
12131211
Invoke(INVOKESPECIAL, "scala/MatchError", "<init>", "(Ljava/lang/Object;)V", false),
1214-
Op(ATHROW),
1212+
Op(ATHROW)
12151213
))
12161214

12171215
// ---------------

0 commit comments

Comments
 (0)