Assembler questions

Rémi Forax forax at univ-mlv.fr
Mon Apr 16 05:20:06 PDT 2012


Thinking a little more about that, I think it's a type propagation issue.

Neither obj.getClass() == A.class nor A.class.isInstance(obj) works.
I think it's because they are instrinsic and doesn't propagate the fact
that after them obj is an A.

Note that this is really really bad in loop, because you can see 3 or 4
of these tests consecutively after the loop unrolling/code motion opt.

Rémi

On 04/16/2012 01:53 PM, Rémi Forax wrote:
> On 04/16/2012 12:31 PM, Krystal Mok wrote:
>> Hi Remi,
>>
>> Apparently the original code was trying to do something like:
>>
>> if (obj.getClass() == A.class) {
>>   A a = (A) obj;
>>   // ...
>> }
>>
>> Right?
>
> yes.
> In fact, it's the equivalent code done using method handles.
>
>>
>> If the condition was
>>
>> if (obj instanceof A)
>>
>> then the checkcast would have been elided.
>
> yes, you're right. I've just tested :)
>
>>
>> Maybe this kind of code pattern should be recognized by C2 in a 
>> future enhancement?
>
> Yes, I think it should.
>>
>> Regards,
>> Kris
>
> regards,
> Rémi
>
>>
>> On Mon, Apr 16, 2012 at 5:59 PM, Rémi Forax <forax at univ-mlv.fr 
>> <mailto:forax at univ-mlv.fr>> wrote:
>>
>>     Hi guys,
>>     I'm trying to read some assembler dump printed by hsdis.
>>
>>     In the snippet below, I don't understand why there is a %r12 in
>>     the middle of the mov.
>>     Is some intermediary result stored in %r12 ?
>>     Is it equivalent to
>>      move 0x8(%r11), %r12
>>      move 0x78(%r12), %rbp ?
>>
>>     Another question more related to the layout of the class in hotspot.
>>     It seems there are two kinds of class pointer, the one with the
>>     type java/lang/Class
>>     and another one used by checkcast (oop('A')).
>>     I suppose it's the same object at two different offsets perhaps
>>     the Java one and the C++ one
>>     but  I don't understand why they both exist in the generated code.
>>
>>     And the last question is why the checkcast is not removed because
>>     the test getClass() == A.class is just above.
>>     Is the VM also lost with the double representation of a class ?
>>
>>     regards,
>>     Rémi
>>
>>     0x00007f67a46e326c: mov    0x8(%rsi),%r11d    ; implicit
>>     exception: dispatches to 0x00007f67a46e32ea
>>      ;; B2: #    B7 B3 <- B1  Freq: 0.999999
>>
>>      0x00007f67a46e3270: mov    0x78(%r12,%r11,8),%rbp
>>      ;*invokevirtual getClass
>>                                                    ; -
>>     RT::classCheck at 1 (line 102)
>>                                                    ; -
>>     java.lang.invoke.MethodHandle::invokeExact at 3
>>                                                    ; -
>>     java.lang.invoke.MethodHandle::invokeExact at 3
>>                                                    ; - IndyTest::test at 1
>>      0x00007f67a46e3275: mov    $0x7d6bb4228,%r10  ;   {oop(a
>>     'java/lang/Class' = 'A')}
>>      0x00007f67a46e327f: cmp    %r10,%rbp
>>      0x00007f67a46e3282: jne    0x00007f67a46e32c9  ;*if_acmpne
>>                                                    ; -
>>     RT::classCheck at 5 (line 102)
>>                                                    ; -
>>     java.lang.invoke.MethodHandle::invokeExact at 3
>>                                                    ; -
>>     java.lang.invoke.MethodHandle::invokeExact at 3
>>                                                    ; - IndyTest::test at 1
>>      ;; B3: #    B6 B4 <- B2  Freq: 0.999999
>>
>>      0x00007f67a46e3284: mov    0x40(%r12,%r11,8),%r10
>>      0x00007f67a46e3289: mov    $0x77f280d58,%r11  ;   {oop('A')}
>>      0x00007f67a46e3293: cmp    %r11,%r10
>>      0x00007f67a46e3296: jne    0x00007f67a46e32b4  ;*checkcast
>>                                                    ; -
>>     java.lang.invoke.MethodHandle::invokeExact at 1
>>                                                    ; -
>>     java.lang.invoke.MethodHandle::invokeExact at 21
>>                                                    ; - IndyTest::test at 1
>>
>>
>



More information about the hotspot-compiler-dev mailing list