Uploaded image for project: 'JDK'
  1. JDK
  2. JDK-8210215

C2 should optimize trichotomy calculations

XMLWordPrintable

    • Icon: Enhancement Enhancement
    • Resolution: Fixed
    • Icon: P4 P4
    • 12
    • 9, 10, 11, 12
    • hotspot
    • b16

      C2 does not optimize expressions like the following:

          public static int compare1(int a, int b) {
              return (a < b) ? -1 : (a == b) ? 0 : 1;
          }

          public static boolean testGreater1(int a, int b) {
              return compare1(a, b) == 1;
          }

      The check in testGreater1 should be replaced by a simple a > b check but currently C2 emits two comparisons:

        # parm0: rsi = int
        # parm1: rdx = int
        # [sp+0x20] (sp of caller)
       ;; N1: # B1 <- B3 Freq: 1

       ;; B1: # B4 B2 <- BLOCK HEAD IS JUNK Freq: 1

        0x00007f56984da0c0: mov %eax,-0x16000(%rsp)
        0x00007f56984da0c7: push %rbp
        0x00007f56984da0c8: sub $0x10,%rsp ;*synchronization entry
                                                      ; - MyTest::testGreater1@-1 (line 228)

        0x00007f56984da0cc: cmp %edx,%esi
        0x00007f56984da0ce: jge 0x00007f56984da0e2 ;*if_icmpge {reexecute=0 rethrow=0 return_oop=0}
                                                      ; - MyTest::compare1@2 (line 19)
                                                      ; - MyTest::testGreater1@2 (line 228)

       ;; B2: # B3 <- B4 B1 Freq: 0,666659

        0x00007f56984da0d0: xor %eax,%eax ;*ireturn {reexecute=0 rethrow=0 return_oop=0}
                                                      ; - MyTest::testGreater1@14 (line 228)

       ;; B3: # N1 <- B2 B5 Freq: 1

        0x00007f56984da0d2: add $0x10,%rsp
        0x00007f56984da0d6: pop %rbp
        0x00007f56984da0d7: mov 0x120(%r15),%r10
        0x00007f56984da0de: test %eax,(%r10) ; {poll_return}
        0x00007f56984da0e1: retq
       ;; B4: # B2 B5 <- B1 Freq: 0,66667

        0x00007f56984da0e2: cmp %edx,%esi
        0x00007f56984da0e4: je 0x00007f56984da0d0 ;*if_icmpne {reexecute=0 rethrow=0 return_oop=0}
                                                      ; - MyTest::compare1@11 (line 19)
                                                      ; - MyTest::testGreater1@2 (line 228)

       ;; B5: # B3 <- B4 Freq: 0,333341

        0x00007f56984da0e6: mov $0x1,%eax
        0x00007f56984da0eb: jmp 0x00007f56984da0d2

      See discussion at:
      http://mail.openjdk.java.net/pipermail/valhalla-dev/2018-August/004883.html

            thartmann Tobias Hartmann
            thartmann Tobias Hartmann
            Votes:
            0 Vote for this issue
            Watchers:
            2 Start watching this issue

              Created:
              Updated:
              Resolved: