C2 generates Safepoint polling in the counted loop in the next example. % cat Test.java class Test { static int val = 0; public static int foo(int val) { return val + 1000; } public static void test() { for (int i = 0; i < 100; i++) { val = i; if (val == 50) { val = foo(val); } } } public static void main(String argv[]) { for (int i=0; i < 15000; i++) test(); System.out.println("value = " + val); } } % java_g -server -version java version "1.5.0-beta3" Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0-beta3-b58) Java HotSpot(TM) Server VM (build 1.5.0-beta3-b58-debug, mixed mode) % javac Test.java % java_g -server -XX:+PrintCompilation -XX:CompileOnly=Test.test -XX:+PrintOptoAssembly -Xbatch -XX:-Inline -XX:CICompilerCount=1 Test VM option '+PrintCompilation' VM option 'CompileOnly=Test.test' VM option '+PrintOptoAssembly' VM option '-Inline' VM option 'CICompilerCount=1' 1 b Test::test (36 bytes) {method} - klass: {other class} - method holder: 'Test' - constants: 0xfec62020{constant pool} - access: 0xc1000009 public static - name: 'test' - signature: '()V' ... 020 B2: # B4 B3 <- B1 B7 Loop: B2-B7 inner Freq: 4.44445 # Lrgs use/def'd in loop: {1,3-9} 020 + CMP R_O0,#50 024 BPeq ccr,B4 P=0.009950 C=4.422000 024 STW R_O0,[R_L0 + #296] 024 02c B3: # B6 <- B2 Loop: B2-B7 inner Freq: 4.378 02c + BA B6 02c ADD R_O0,#1,R_O0 02c 034 B4: # B9 B5 <- B2 Loop: B2-B7 inner Freq: 0.0439999 034 CALL,static ; NOP ==> Test::foo # Test::test @ bci:23 L0=#50 # R_L0=Oop 03c 03c B5: # B6 <- B4 Loop: B2-B7 inner Freq: 0.043999 03c + STW R_O0,[R_L0 + #296] 040 MOV #51,R_O0 040 044 B6: # B8 B7 <- B5 B3 Loop: B2-B7 inner Freq: 4.422 044 + LDUW [R_L2],R_G0 ! Safepoint: poll for GC # Test::test @ bci:32 L0=R_O0 # R_L0=Oop 048 + CMP R_O0,#100 04c BPge ccr,B8 P=0.010000 C=4.422000 04c 054 B7: # B2 <- B6 Loop: B2-B7 inner Freq: 4.37778 054 + BA B2 054 05c B8: # N1 <- B6 Freq: 0.04422 05c SETHI #PollAddr,L0 ! Load Polling address LDUW [L0],G0 !Poll for Safepointing RET RESTORE 06c + RET NOP
|