counting down loop and unwanted test?

Peter Veentjer alarmnummer at gmail.com
Tue Jan 31 09:37:24 UTC 2017


Small correction.

It should be ZF and not NZ flag.

On Tue, Jan 31, 2017 at 11:30 AM, Peter Veentjer <alarmnummer at gmail.com>
wrote:

> I'm looking at some assembly generated for a very simple for loop:
>
> public class LoopCountDown {
>
>     public static void main(String[] args) {
>         int result = 0;
>         for (int k = 0; k < 100_000; k++) {
>             result += doMath(100);
>         }
>         System.out.println(result);
>     }
>
>     public static int doMath(int n) {
>         int result = n;
>         for (int k = n; k > 0; k--) {
>             result += 2 * result;
>         }
>         return result;
>     }
> }
>
> I'm not interested in the results of this program. I'm just curious about
> how the JIT optimized the actual loop-logic.
>
> When I output the assembler (full listing at the end), I get the following
> relevant part:
>
>  0x000000011049868c: test   esi,esi
>   0x000000011049868e: jle    0x00000001104986ad  ;*ifle
>                                                 ; -
> com.loop.LoopCountDown::doMath at 5 (line 15)
>
>   0x0000000110498690: mov    eax,esi            ;*iload_1
>                                                 ; -
> com.loop.LoopCountDown::doMath at 8 (line 16)
>
>   0x0000000110498692: mov    r10d,eax
>   0x0000000110498695: shl    r10d,1
>   0x0000000110498698: add    eax,r10d           ;*iadd
>                                                 ; -
> com.loop.LoopCountDown::doMath at 12 (line 16)
>
>   *0x000000011049869b: dec    esi                ;*iinc*
> *                                                ; -
> com.loop.LoopCountDown::doMath at 14 (line 15)*
>
> *  0x000000011049869d: test   esi,esi*
> *  0x000000011049869f: jg     0x0000000110498692  ;*ifle*
>
>
> My question is about the test at 0x000000011049869d. Why is it needed?
> Perhaps it is too much of an edge case to optimize?
>
> The dec instruction will set the NZ flag:
>
> http://x86.renejeschke.de/html/file_module_x86_id_71.html
>
> So if the jg at the end would be changed to a jnz, the jnz can make use of
> this NZ flag; no need for a test.
>
> For more information see page 90 of http://www.agner.org/
> optimize/optimizing_assembly.pdf
>
> My JVM arguments:
>
> -XX:+UnlockDiagnosticVMOptions -XX:PrintAssemblyOptions=intel
> -XX:-TieredCompilation -XX:-Inline -XX:-BackgroundCompilation
> -XX:CompileCommand=print,*LoopCountDown.doMath -XX:LoopUnrollLimit=0
>
> JVM version:
>
> java version "1.8.0_91"
>
> Java(TM) SE Runtime Environment (build 1.8.0_91-b14)
>
> Java HotSpot(TM) 64-Bit Server VM (build 25.91-b14, mixed mode)
>
>
> CompilerOracle: print *LoopCountDown.doMath
> Compiled method (c2)     174    8
> com.loop.LoopCountDown::doMath (22 bytes)
>  total in heap  [0x0000000110498550,0x0000000110498790] = 576
>  relocation     [0x0000000110498670,0x0000000110498678] = 8
>  main code      [0x0000000110498680,0x00000001104986c0] = 64
>  stub code      [0x00000001104986c0,0x00000001104986d8] = 24
>  oops           [0x00000001104986d8,0x00000001104986e0] = 8
>  metadata       [0x00000001104986e0,0x00000001104986e8] = 8
>  scopes data    [0x00000001104986e8,0x0000000110498708] = 32
>  scopes pcs     [0x0000000110498708,0x0000000110498788] = 128
>  dependencies   [0x0000000110498788,0x0000000110498790] = 8
> Loaded disassembler from /Library/Java/JavaVirtualMachines/jdk1.8.0.
> jdk/Contents/Home/jre/lib/hsdis-amd64.dylib
> Decoding compiled method 0x0000000110498550:
> Code:
> [Disassembling for mach='i386:x86-64']
> [Entry Point]
> [Verified Entry Point]
> [Constants]
>   # {method} {0x00000001d89df478} 'doMath' '(I)I' in
> 'com/loop/LoopCountDown'
>   # parm0:    rsi       = int
>   #           [sp+0x20]  (sp of caller)
>   0x0000000110498680: sub    rsp,0x18
>   0x0000000110498687: mov    QWORD PTR [rsp+0x10],rbp  ;*synchronization
> entry
>                                                 ; -
> com.loop.LoopCountDown::doMath at -1 (line 14)
>
>   0x000000011049868c: test   esi,esi
>   0x000000011049868e: jle    0x00000001104986ad  ;*ifle
>                                                 ; -
> com.loop.LoopCountDown::doMath at 5 (line 15)
>
>   0x0000000110498690: mov    eax,esi            ;*iload_1
>                                                 ; -
> com.loop.LoopCountDown::doMath at 8 (line 16)
>
>   0x0000000110498692: mov    r10d,eax
>   0x0000000110498695: shl    r10d,1
>   0x0000000110498698: add    eax,r10d           ;*iadd
>                                                 ; -
> com.loop.LoopCountDown::doMath at 12 (line 16)
>
>   0x000000011049869b: dec    esi                ;*iinc
>                                                 ; -
> com.loop.LoopCountDown::doMath at 14 (line 15)
>
>   0x000000011049869d: test   esi,esi
>   0x000000011049869f: jg     0x0000000110498692  ;*ifle
>                                                 ; -
> com.loop.LoopCountDown::doMath at 5 (line 15)
>
>   0x00000001104986a1: add    rsp,0x10
>   0x00000001104986a5: pop    rbp
>   0x00000001104986a6: test   DWORD PTR [rip+0xfffffffffff71954],eax
>  # 0x000000011040a000
>                                                 ;   {poll_return}
>   0x00000001104986ac: ret
>   0x00000001104986ad: mov    eax,esi
>   0x00000001104986af: jmp    0x00000001104986a1
>   0x00000001104986b1: hlt
>   0x00000001104986b2: hlt
>   0x00000001104986b3: hlt
>   0x00000001104986b4: hlt
>   0x00000001104986b5: hlt
>   0x00000001104986b6: hlt
>   0x00000001104986b7: hlt
>   0x00000001104986b8: hlt
>   0x00000001104986b9: hlt
>   0x00000001104986ba: hlt
>   0x00000001104986bb: hlt
>   0x00000001104986bc: hlt
>   0x00000001104986bd: hlt
>   0x00000001104986be: hlt
>   0x00000001104986bf: hlt
> [Exception Handler]
> [Stub Code]
>   0x00000001104986c0: jmp    0x0000000110488f60  ;   {no_reloc}
> [Deopt Handler Code]
>   0x00000001104986c5: call   0x00000001104986ca
>   0x00000001104986ca: sub    QWORD PTR [rsp],0x5
>   0x00000001104986cf: jmp    0x0000000110463d00  ;   {runtime_call}
>   0x00000001104986d4: hlt
>   0x00000001104986d5: hlt
>   0x00000001104986d6: hlt
>   0x00000001104986d7: hlt
> OopMapSet contains 0 OopMaps
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20170131/11c2a813/attachment-0001.html>


More information about the hotspot-compiler-dev mailing list