A leaf runtime functions may not have safepoints.
But server compiler doesn't separate leaf calls from
regular calls and doesn't generate safepoints in any
loops will dominated calls.
So we can have an infinite loop with leaf calls.
% cat Test1.java
public class Test1 {
private static double test(double d, long limit) {
for (long i = 0; i < limit; i++) { // 'long' - not-countable loop
d = Math.sin(d);
}
return d;
}
public static void main(String args[]) {
double d = 0.3;
d = test(d, 10000); // warmup
d = test(d, 100000000);
}
}
% /export/home2/work/jdk1.5.0/bin/java_g -server -Xbatch -XX:+PrintCompilation -XX:+PrintOptoAssembly -XX:CompileOnly=.test Test1
VM option '+PrintCompilation'
VM option '+PrintOptoAssembly'
VM option 'CompileOnly=.test'
1 b Test1::test (26 bytes)
{method}
- klass: {other class}
- method holder: 'Test1'
...
abababab N1: # B1 <- B5 Freq: 0.00133333
abababab
000 B1: # B5 B2 <- BLOCK HEAD IS JUNK Freq: 0.00133333
000 SAVE R_SP,-120,R_SP
004 STX R_G1,[R_SP + #112]
008 + CMP R_G1,#0 ! long
00c BPle xcc_L,B5 P=0.000149 C=4.468000
00c
014 B2: # B3 <- B1 Freq: 4.46733
014 + CLR R_G1 ! long
018 STDF R_F0,[R_SP + #96]
01c + STX R_G1,[R_SP + #104]
01c
020 B3: # B5 B4 <- B2 B4 Loop: B3-B4 inner Freq: 8.934
# Lrgs use/def'd in loop: {2-3,8-11,15,17,20-24,26}
020 + LDUW [R_SP + #96],R_O0
LDUW [R_SP + #100],R_O1
028 + CALL,runtime leaf SIN
No JVM State Info
#
05c + LDX [R_SP + #104],R_G1
060 + ADD R_G1,#1,R_G1
064 LDX [R_SP + #112],R_G3
068 + STX R_G1,[R_SP + #104]
06c + CMP R_G1,R_G3 ! long
070 BPge xcc_L,B5 P=0.000149 C=4.467333
070
078 B4: # B3 <- B3 Loop: B3-B4 inner Freq: 4.46667
078 + STDF R_F0,[R_SP + #96]
07c + BA B3
07c
084 B5: # N1 <- B3 B1 Freq: 0.00133307
084 SETHI #PollAddr,L0 ! Load Polling address
LDUW [L0],G0 !Poll for Safepointing
RET
RESTORE
094 + ! return
094
###@###.### 2005-1-12 20:26:51 GMT
But server compiler doesn't separate leaf calls from
regular calls and doesn't generate safepoints in any
loops will dominated calls.
So we can have an infinite loop with leaf calls.
% cat Test1.java
public class Test1 {
private static double test(double d, long limit) {
for (long i = 0; i < limit; i++) { // 'long' - not-countable loop
d = Math.sin(d);
}
return d;
}
public static void main(String args[]) {
double d = 0.3;
d = test(d, 10000); // warmup
d = test(d, 100000000);
}
}
% /export/home2/work/jdk1.5.0/bin/java_g -server -Xbatch -XX:+PrintCompilation -XX:+PrintOptoAssembly -XX:CompileOnly=.test Test1
VM option '+PrintCompilation'
VM option '+PrintOptoAssembly'
VM option 'CompileOnly=.test'
1 b Test1::test (26 bytes)
{method}
- klass: {other class}
- method holder: 'Test1'
...
abababab N1: # B1 <- B5 Freq: 0.00133333
abababab
000 B1: # B5 B2 <- BLOCK HEAD IS JUNK Freq: 0.00133333
000 SAVE R_SP,-120,R_SP
004 STX R_G1,[R_SP + #112]
008 + CMP R_G1,#0 ! long
00c BPle xcc_L,B5 P=0.000149 C=4.468000
00c
014 B2: # B3 <- B1 Freq: 4.46733
014 + CLR R_G1 ! long
018 STDF R_F0,[R_SP + #96]
01c + STX R_G1,[R_SP + #104]
01c
020 B3: # B5 B4 <- B2 B4 Loop: B3-B4 inner Freq: 8.934
# Lrgs use/def'd in loop: {2-3,8-11,15,17,20-24,26}
020 + LDUW [R_SP + #96],R_O0
LDUW [R_SP + #100],R_O1
028 + CALL,runtime leaf SIN
No JVM State Info
#
05c + LDX [R_SP + #104],R_G1
060 + ADD R_G1,#1,R_G1
064 LDX [R_SP + #112],R_G3
068 + STX R_G1,[R_SP + #104]
06c + CMP R_G1,R_G3 ! long
070 BPge xcc_L,B5 P=0.000149 C=4.467333
070
078 B4: # B3 <- B3 Loop: B3-B4 inner Freq: 4.46667
078 + STDF R_F0,[R_SP + #96]
07c + BA B3
07c
084 B5: # N1 <- B3 B1 Freq: 0.00133307
084 SETHI #PollAddr,L0 ! Load Polling address
LDUW [L0],G0 !Poll for Safepointing
RET
RESTORE
094 + ! return
094
###@###.### 2005-1-12 20:26:51 GMT