Skip to content

Commit 7718394

Browse files
committed
Intern type descriptors for speed
1 parent 25887f2 commit 7718394

File tree

1 file changed

+34
-27
lines changed

1 file changed

+34
-27
lines changed

src/vm/jvm/runtime/org/perl6/nqp/jast2bc/AutosplitMethodWriter.java

Lines changed: 34 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ public String describe() {
409409

410410
public void thrown(String ex) {
411411
sp = sbase;
412-
stack[sp++] = 'L'+ex+';';
412+
stack[sp++] = ('L'+ex+';').intern();
413413
}
414414

415415
private void pushReturn(String s) {
@@ -445,7 +445,7 @@ public void execute(int index, AbstractInsnNode anode) {
445445
switch (anode.getType()) {
446446
case AbstractInsnNode.VAR_INSN:
447447
vi = (VarInsnNode) anode;
448-
if (vi.var != 0 && ("D".equals(stack[vi.var-1]) || "J".equals(stack[vi.var-1])))
448+
if (vi.var != 0 && ("D" == stack[vi.var-1] || "J" == stack[vi.var-1]))
449449
stack[vi.var-1] = "T";
450450
break;
451451
case AbstractInsnNode.TYPE_INSN:
@@ -475,13 +475,13 @@ public void execute(int index, AbstractInsnNode anode) {
475475
stack[sp++] = stack[vi.var];
476476
break;
477477
case Opcodes.ANEWARRAY:
478-
stack[sp-1] = "[" + tidesc;
478+
stack[sp-1] = ("[" + tidesc).intern();
479479
break;
480480
case Opcodes.ASTORE:
481481
stack[vi.var] = stack[--sp];
482482
break;
483483
case Opcodes.CHECKCAST:
484-
stack[sp-1] = tidesc;
484+
stack[sp-1] = tidesc.intern();
485485
break;
486486
case Opcodes.DSTORE:
487487
stack[vi.var] = "D";
@@ -491,7 +491,7 @@ public void execute(int index, AbstractInsnNode anode) {
491491
case Opcodes.DUP2:
492492
// [b] a -> [b] a [b] a
493493
a = stack[--sp];
494-
b = ("D".equals(a) || "J".equals(a)) ? "X" : stack[--sp];
494+
b = ("D" == a || "J" == a) ? "X" : stack[--sp];
495495

496496
if (!"X".equals(b)) stack[sp++] = b;
497497
stack[sp++] = a;
@@ -501,27 +501,27 @@ public void execute(int index, AbstractInsnNode anode) {
501501
case Opcodes.DUP2_X1:
502502
// c [b] a -> [b] a c [b] a
503503
a = stack[--sp];
504-
b = ("D".equals(a) || "J".equals(a)) ? "X" : stack[--sp];
504+
b = ("D" == a || "J" == a) ? "X" : stack[--sp];
505505
c = stack[--sp];
506506

507-
if (!"X".equals(b)) stack[sp++] = b;
507+
if ("X" != b) stack[sp++] = b;
508508
stack[sp++] = a;
509509
stack[sp++] = c;
510-
if (!"X".equals(b)) stack[sp++] = b;
510+
if ("X" != b) stack[sp++] = b;
511511
stack[sp++] = a;
512512
break;
513513
case Opcodes.DUP2_X2:
514514
// [d] c [b] a -> b a d c b a
515515
a = stack[--sp];
516-
b = ("D".equals(a) || "J".equals(a)) ? "X" : stack[--sp];
516+
b = ("D" == a || "J" == a) ? "X" : stack[--sp];
517517
c = stack[--sp];
518-
d = ("D".equals(c) || "J".equals(c)) ? "X" : stack[--sp];
518+
d = ("D" == c || "J" == c) ? "X" : stack[--sp];
519519

520-
if (!"X".equals(b)) stack[sp++] = b;
520+
if ("X" != b) stack[sp++] = b;
521521
stack[sp++] = a;
522-
if (!"X".equals(d)) stack[sp++] = d;
522+
if ("X" != d) stack[sp++] = d;
523523
stack[sp++] = c;
524-
if (!"X".equals(b)) stack[sp++] = b;
524+
if ("X" != b) stack[sp++] = b;
525525
stack[sp++] = a;
526526

527527
break;
@@ -544,10 +544,10 @@ public void execute(int index, AbstractInsnNode anode) {
544544
// [d] c a -> a [d] c a
545545
a = stack[--sp];
546546
c = stack[--sp];
547-
d = ("D".equals(c) || "J".equals(c)) ? "X" : stack[--sp];
547+
d = ("D" == c || "J" == c) ? "X" : stack[--sp];
548548

549549
stack[sp++] = a;
550-
if (!"X".equals(d)) stack[sp++] = d;
550+
if ("X" != d) stack[sp++] = d;
551551
stack[sp++] = c;
552552
stack[sp++] = a;
553553
break;
@@ -558,11 +558,11 @@ public void execute(int index, AbstractInsnNode anode) {
558558

559559
case Opcodes.GETFIELD:
560560
sp--;
561-
pushReturn(fi.desc);
561+
pushReturn(fi.desc.intern());
562562
break;
563563

564564
case Opcodes.GETSTATIC:
565-
pushReturn(fi.desc);
565+
pushReturn(fi.desc.intern());
566566
break;
567567

568568
case Opcodes.INVOKEINTERFACE:
@@ -577,10 +577,10 @@ public void execute(int index, AbstractInsnNode anode) {
577577
if (a.charAt(0) == 'U') {
578578
b = a.substring(a.indexOf(':')+1);
579579
for (int i = 0; i < stack.length; i++)
580-
if (a.equals(stack[i])) stack[i] = b;
580+
if (a == stack[i]) stack[i] = b;
581581
}
582582
}
583-
pushReturn(midesc.getReturnType().getDescriptor());
583+
pushReturn(midesc.getReturnType().getDescriptor().intern());
584584
break;
585585

586586
case Opcodes.ISTORE:
@@ -639,7 +639,7 @@ public void execute(int index, AbstractInsnNode anode) {
639639
}
640640

641641
case Opcodes.NEW:
642-
stack[sp++] = "U"+index+':'+tidesc;
642+
stack[sp++] = ("U"+index+':'+tidesc).intern();
643643
break;
644644

645645
case Opcodes.POP2:
@@ -702,7 +702,8 @@ public void merge(int index, Frame f) {
702702
String a = f.stack[i];
703703
String b = slot.stack[i];
704704
String c = lub(a,b);
705-
if (!b.equals(c)) {
705+
if (b != c) {
706+
//System.out.printf("%d.%d %s -> %s\n", index, i, b, c);
706707
slot.stack[i] = c;
707708
changed = true;
708709
}
@@ -715,13 +716,16 @@ public void merge(int index, Frame f) {
715716
void mark(int index) {
716717
if (changedVec[index]) return;
717718
changedVec[index] = true;
718-
changedStack[changedSp++] = index;
719+
changedQueue[changedHead++] = index;
720+
if (changedHead == changedQueue.length) changedHead = 0;
719721
}
720722

721723
// computes the least upper bound of two verification types; we use descriptors, but U44:Lbar; for uninitialized(44), 0 for null, and T for TOP
722724
String lub(String a,String b) {
723725
// same type? trivial
724-
if (a.equals(b)) return a;
726+
if (a == b) return a;
727+
if (a == "T") return a;
728+
if (b == "T") return b;
725729

726730
char a0 = a.charAt(0);
727731
char b0 = b.charAt(0);
@@ -742,7 +746,7 @@ String lub(String a,String b) {
742746
String cc = lub(a.substring(1), b.substring(1));
743747
if (cc.charAt(0) == 'T') // children are not compatible, but we know we have *some* array, which is an object
744748
return "Ljava/lang/Object;";
745-
return '['+cc;
749+
return ('['+cc).intern();
746750
} else {
747751
if (b0 != 'L') return "Ljava/lang/Object;";
748752

@@ -772,27 +776,30 @@ private void getTypes() {
772776
int locwp = 0;
773777

774778
if ((access & Opcodes.ACC_STATIC) == 0) {
775-
initial.stack[locwp++] = 'L'+tgtype+';';
779+
initial.stack[locwp++] = ('L'+tgtype+';').intern();
776780
}
777781
for (Type arg : Type.getArgumentTypes(desc)) {
778-
initial.stack[locwp] = arg.getDescriptor();
782+
initial.stack[locwp] = arg.getDescriptor().intern();
779783
locwp += arg.getSize();
780784
}
781785
initial.sp = initial.sbase = nlocal;
782786
state.merge(0, initial);
783787

784788
int insn;
789+
int step = 0;
785790
while ((insn = state.next()) >= 0) {
786791
Frame in = state.frames[insn].clone();
787792

788-
if (TYPE_TRACE) System.out.printf("INFERENCE STEP: insn=%d locals=[%s] stack=[%s]\n", insn, Arrays.toString(Arrays.copyOfRange(in.stack, 0, nlocal)), Arrays.toString(Arrays.copyOfRange(in.stack, in.sbase, in.sp)));
793+
if (TYPE_TRACE) System.out.printf("INFERENCE STEP: insn=%d [%d] locals=[%s] stack=[%s]\n", insn, insnList[insn].getOpcode(), Arrays.toString(Arrays.copyOfRange(in.stack, 0, nlocal)), Arrays.toString(Arrays.copyOfRange(in.stack, in.sbase, in.sp)));
789794
in.execute(insn, insnList[insn]);
790795

791796
for (ControlEdge ce : successors[insn]) {
792797
// assume exceptions follow non-exceptions
793798
if (ce.exn != null) in.thrown(ce.exn);
794799
state.merge(ce.to, in);
795800
}
801+
step++;
802+
if ((step % 10000) == 0) System.out.printf("Inference step %d\n", step);
796803
}
797804
types = state.frames;
798805
}

0 commit comments

Comments
 (0)