@@ -272,9 +272,23 @@ public void addRemove() {
272272 mv .visitInsn (Opcodes .ISUB );
273273 mv .visitFieldInsn (Opcodes .PUTFIELD , "java/util/IdentityHashMap" , "size" , "I" );
274274
275+ // Inlined nextKeyIndex()
275276 mv .visitVarInsn (Opcodes .ILOAD , 4 );
277+ mv .visitInsn (Opcodes .ICONST_2 );
278+ mv .visitInsn (Opcodes .IADD );
279+ mv .visitInsn (Opcodes .DUP );
276280 mv .visitVarInsn (Opcodes .ILOAD , 3 );
277- mv .visitMethodInsn (Opcodes .INVOKESTATIC , "java/util/IdentityHashMap" , "nextKeyIndex" , "(II)I" , false );
281+
282+ Label elseLabel = new Label ();
283+ Label endLabel = new Label ();
284+ mv .visitJumpInsn (Opcodes .IF_ICMPGE , elseLabel );
285+ mv .visitJumpInsn (Opcodes .GOTO , endLabel );
286+ mv .visitLabel (elseLabel );
287+ mv .visitFrame (Opcodes .F_SAME1 , 0 , null , 1 , new Object [] { Opcodes .INTEGER });
288+ mv .visitInsn (Opcodes .POP );
289+ mv .visitInsn (Opcodes .ICONST_0 );
290+ mv .visitLabel (endLabel );
291+ mv .visitFrame (Opcodes .F_SAME1 , 0 , null , 1 , new Object [] { Opcodes .INTEGER });
278292 mv .visitVarInsn (Opcodes .ISTORE , 6 ); // i in local var 6
279293
280294 Label loopStart = new Label ();
@@ -293,10 +307,20 @@ public void addRemove() {
293307 // Check if item==null
294308 mv .visitJumpInsn (Opcodes .IFNULL , loopEnd );
295309
296- // Compute hash
310+ // Compute hash by inlining hash(item, len): ((h << 1) - (h << 8)) & (length - 1)
297311 mv .visitVarInsn (Opcodes .ALOAD , 7 );
312+ mv .visitMethodInsn (Opcodes .INVOKESTATIC , "java/lang/System" , "identityHashCode" , "(Ljava/lang/Object;)I" , false );
313+ mv .visitInsn (Opcodes .DUP );
314+ mv .visitInsn (Opcodes .ICONST_1 );
315+ mv .visitInsn (Opcodes .ISHL ); // h << 1
316+ mv .visitInsn (Opcodes .SWAP );
317+ mv .visitIntInsn (Opcodes .BIPUSH , 8 );
318+ mv .visitInsn (Opcodes .ISHL );
319+ mv .visitInsn (Opcodes .ISUB );
298320 mv .visitVarInsn (Opcodes .ILOAD , 3 );
299- mv .visitMethodInsn (Opcodes .INVOKESTATIC , "java/util/IdentityHashMap" , "hash" , "(Ljava/lang/Object;I)I" , false );
321+ mv .visitInsn (Opcodes .ICONST_1 );
322+ mv .visitInsn (Opcodes .ISUB );
323+ mv .visitInsn (Opcodes .IAND );
300324 mv .visitVarInsn (Opcodes .ISTORE , 8 ); // r in local var 8
301325
302326 // Complex conditional: if ((i < r && (r <= d || d <= i)) || (r <= d && d <= i))
@@ -366,10 +390,23 @@ public void addRemove() {
366390 mv .visitVarInsn (Opcodes .ILOAD , 6 );
367391 mv .visitVarInsn (Opcodes .ISTORE , 4 );
368392
369- // Update i = nextKeyIndex(i, len);
393+ // Update i = nextKeyIndex(i, len), inlined
370394 mv .visitVarInsn (Opcodes .ILOAD , 6 );
395+ mv .visitInsn (Opcodes .ICONST_2 );
396+ mv .visitInsn (Opcodes .IADD );
397+ mv .visitInsn (Opcodes .DUP );
371398 mv .visitVarInsn (Opcodes .ILOAD , 3 );
372- mv .visitMethodInsn (Opcodes .INVOKESTATIC , "java/util/IdentityHashMap" , "nextKeyIndex" , "(II)I" , false );
399+
400+ Label elseLabel2 = new Label ();
401+ Label endLabel2 = new Label ();
402+ mv .visitJumpInsn (Opcodes .IF_ICMPGE , elseLabel2 );
403+ mv .visitJumpInsn (Opcodes .GOTO , endLabel2 );
404+ mv .visitLabel (elseLabel2 );
405+ mv .visitFrame (Opcodes .F_SAME1 , 0 , null , 1 , new Object [] { Opcodes .INTEGER });
406+ mv .visitInsn (Opcodes .POP );
407+ mv .visitInsn (Opcodes .ICONST_0 );
408+ mv .visitLabel (endLabel2 );
409+ mv .visitFrame (Opcodes .F_SAME1 , 0 , null , 1 , new Object [] { Opcodes .INTEGER });
373410 mv .visitVarInsn (Opcodes .ISTORE , 6 );
374411
375412 mv .visitJumpInsn (Opcodes .GOTO , loopStart );
0 commit comments