Multiple copies of same code
Ulf Zibis
Ulf.Zibis at gmx.de
Tue Nov 24 13:56:27 PST 2009
I think, it's not only the code size that matters, but too the
performance lack from all these jumps.
In the method code below, you see a 2-line finally block. Looking at the
compile result, I can see, that this block is repeated 6 times and
consumes 1/3 of the whole assembly code for this method. Additionally,
there are plenty of range-check and null-check block which too seem to
be copy-and-pasted, so I guess, removing the redundant blocks from this
example would make the code half-sized.
On the other hand, the 1-length int [] dp could be optimized to a normal
int field and pushing the 6 parameters to stack could be saved, if
method decode() would be inlined, but isn't because of inline threshold,
which sadly isn't frequency-related. This would additionally increase
the performance.
private CoderResult decodeArrayLoop(ByteBuffer src, CharBuffer
dst) {
byte[] sa = src.array();
int sp = src.arrayOffset() + src.position();
int sl = sp + src.remaining();
char[] da = dst.array();
int [] dp = new int[1];
dp[0] = dst.arrayOffset() + dst.position();
int dl = dp[0] + dst.remaining();
try {
while (sp < sl) {
CoderResult result;
byte byte1 = sa[sp];
if (byte1 >= 0) { // ASCII G0
if (dp[0] == dl)
return CoderResult.OVERFLOW;
da[dp[0]++] = (char)(byte1 & 0xff);
sp++;
} else if (byte1 != SS2) { // Codeset 1 G1
if (sp + 1 == sl)
break;
result = decode(byte1, sa[sp+1], 0, da, dp, dl);
if (result != null)
return result;
sp += 2;
} else { // Codeset 2 G2
if (sp + 4 > sl)
break;
int cnsPlane = cnspToIndex[sa[sp+1] & 0xff];
if (cnsPlane < 0)
return CoderResult.malformedForLength(2);
result = decode(sa[sp+2], sa[sp+3], cnsPlane,
da, dp, dl);
if (result != null)
return result;
sp += 4;
}
}
return CoderResult.UNDERFLOW;
} finally {
src.position(sp - src.arrayOffset());
dst.position(dp[0] - dst.arrayOffset());
}
}
-Ulf
Am 22.11.2009 17:59, Chuck Rasbold schrieb:
> Sure. It would be great to merge redundant code paths. But I don't
> think the cost/benefit ratio is worth it.
>
> In the case you cite, there would be a savings of 4 bytes per path
> removed, which are projected to be very infrequent. In a JIT, you
> have to spend your compilation budget wisely.
>
> It's not that it can't be done. There are just better places to spend
> time.
>
> On Sat, Nov 21, 2009 at 5:54 AM, Ulf Zibis <Ulf.Zibis at gmx.de
> <mailto:Ulf.Zibis at gmx.de>> wrote:
>
> In output of PrintAssembly I frequently see :
>
> ...
> ... # more than 10 recurrences
> ...
> 726 B108: # B114 <- B10 Freq: 9.99898e-006
> 726 # exception oop is in EAX; no code emitted
> 726 MOV ECX,EAX
> 728 JMP,s B114
> 728
> 72a B109: # B114 <- B9 Freq: 9.99918e-006
> 72a # exception oop is in EAX; no code emitted
> 72a MOV ECX,EAX
> 72c JMP,s B114
> 72c
> 72e B110: # B114 <- B6 Freq: 9.99938e-006
> 72e # exception oop is in EAX; no code emitted
> 72e MOV ECX,EAX
> 730 JMP,s B114
> 730
> 732 B111: # B114 <- B4 Freq: 9.99959e-006
> 732 # exception oop is in EAX; no code emitted
> 732 MOV ECX,EAX
> 734 JMP,s B114
> 734
> 736 B112: # B114 <- B3 Freq: 9.99979e-006
> 736 # exception oop is in EAX; no code emitted
> 736 MOV ECX,EAX
> 738 JMP,s B114
> 738
> 73a B113: # B114 <- B2 Freq: 9.99999e-006
> 73a # exception oop is in EAX; no code emitted
> 73a MOV ECX,EAX
> 73a
> 73c B114: # N1132 <- B79 B113 B112 B111 B110 B109 B108
> B103 B102 B101 B100 B93 B92 B91 B90 B87 B86 B85 B84 B83 B82 B81
> B80 B107 B106 B105 B104 B78 B77 B76 B75 B99 Freq: 7.11172e-005
>
>
> Wouldn't it be better to have :
>
> ...
> ... # more than 10 recurrences
> ...
> 73a B108: # B114 <- B10 Freq: 9.99898e-006
> 73a B109: # B114 <- B9 Freq: 9.99918e-006
> 73a B110: # B114 <- B6 Freq: 9.99938e-006
> 73a B111: # B114 <- B4 Freq: 9.99959e-006
> 73a B112: # B114 <- B3 Freq: 9.99979e-006
> 73a B113: # B114 <- B2 Freq: 9.99999e-006
> 73a # exception oop is in EAX; no code emitted
> 73a MOV ECX,EAX
> 73a
> 73c B114: # N1132 <- B79 B113 B112 B111 B110 B109 B108
> B103 B102 B101 B100 B93 B92 B91 B90 B87 B86 B85 B84 B83 B82 B81
> B80 B107 B106 B105 B104 B78 B77 B76 B75 B99 Freq: 7.11172e-005
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20091124/ebb0e377/attachment.html
More information about the hotspot-compiler-dev
mailing list