review for 7145024: Crashes in ucrypto related to C2
Vladimir Kozlov
vladimir.kozlov at oracle.com
Mon Feb 27 17:16:24 PST 2012
Actually assembler from JNITest::nativeTest3 should be enough since first array
copied as rsi -> rdi:rsi, the same as in nativeTest1.
Vladimir
Vladimir Kozlov wrote:
> First, can you show assembler moves code for an array?
>
> For example, in next example you move "rsi -> rdi:rsi". I assume that
> destination registers contains length in rdi and ptr to array base in
> rsi. Correct?
>
> rsi, rdx, rcx, r8, r9, rdi, [0], [8]
> rdi, rsi, rdx, rcx, r8, r9, [0], [8], [16]
> [8] -> [16], [0] -> [8], rdi -> [0], r9 -> r9, r8 -> r8, rcx -> rcx, rdx
> -> rdx, rsi -> rdi:rsi
> 1744 16 n 0 JNITest::nativeTest1([BIIIIIII)V (0 bytes)
> (static)
>
> In next example first register is matched for second array : rdx ->
> rdx:rcx. So what is assembler for it again?
>
> rsi, rdx, rcx, r8, r9, rdi, [0], [8]
> rdi, rsi, rdx, rcx, r8, r9, [0], [8], [16], [24]
> [8] -> [24], [0] -> [16], rdi -> [8], r9 -> [0], r8 -> r9, rcx -> r8,
> rdx -> rdx:rcx, rsi -> rdi:rsi
> 1746 18 n 0 JNITest::nativeTest3([B[BIIIIII)V (0 bytes)
> (static)
>
> Thanks,
> Vladimir
>
>
> Tom Rodriguez wrote:
>> On Feb 24, 2012, at 4:21 PM, Tom Rodriguez wrote:
>>
>>> On Feb 24, 2012, at 12:14 PM, Vladimir Kozlov wrote:
>>>
>>>> Tom,
>>>>
>>>> I don't get T_ARRAY argument processing in ComputeMoveOrder().
>>>> T_ARRAY has two out arguments length and array pointer so two moves
>>>> are involved. I don't see how code handles it.
>>> Yes it's a little odd. I had convinced myself that because the
>>> arguments locations and just rotated relative to each other that only
>>> one argument could collide any testing indicated that it worked
>>> without killing anything. Now I'm not so sure. I'm going to think
>>> through it a bit more and maybe expand my test a bit.
>>
>> So the main part of the deals with partial overlap between the source
>> register and destinations. For single moves if the source and dest
>> are the same then no edge is created but the array moves have to do
>> something different. Because of the argument ordering in almost all
>> cases there is partial overlap between s and d1,d2. In the partial
>> overlap case picking the second register if the source and the first
>> are the same will accurately capture the dependence ordering. The
>> only case where they are fully disjoint occurs with an array argument
>> in rcx being moved into r8/r9 and in that case r8 and r9 are being
>> moved to the stack so they are free. I attached JVM output showing
>> the argument shuffle order for all the signatures generated by the test.
>>
>> It's not a completely general algorithm but it's adequate for the
>> usage. The moves assembly code actually validates that a register
>> isn't killed before being used it would have tripped assert is there
>> were any issues.
>>
>> I could do something different to be more general but I can't see an
>> easy way to represent this using the code I've written.
>>
>> tom
>>
>>
>>
>>
>> ------------------------------------------------------------------------
>>
>>
>>>> I think next code in break_cycle() could be simpler since it is
>>>> cycle chain:
>>>>
>>>> 1416 MoveOperation* p = prev();
>>>> 1417 if (p->_next != NULL) {
>>>> 1418 p->_next->_prev = NULL;
>>>> 1419 }
>>>>
>>>> as this:
>>>>
>>>> 1416 MoveOperation* p = prev();
>>>> 1417 assert(p->_next == this, "");
>>>> 1418 _prev = NULL;
>>> You're right. I had refactored the code so that the calling context
>>> changed but didn't simplify it in that way. I'll fix it.
>>>
>>>> Why you don't want new test to be executed during regular testing?
>>>> You used "manual" and double "##". Did you try to run it with jtreg.
>>> jtreg doesn't support compiling libraries as part of a test so it has
>>> to be run by hand. By default jtreg will run manual tests unless you
>>> specify -automatic. I kind of assumed that's how it's being run
>>> during nightlies but maybe that's not true. Maybe it's not
>>> appropriate for a jtreg test?
>>>
>>> tom
>>>
>>>> Thanks,
>>>> Vladimir
>>>>
>>>> Tom Rodriguez wrote:
>>>>> http://cr.openjdk.java.net/~never/7145024
>>>>> 489 lines changed: 451 ins; 22 del; 16 mod; 3645 unchg
>>>>> 7145024: Crashes in ucrypto related to C2
>>>>> Reviewed-by:
>>>>> There are two issues here. The first issue, that resulted in the
>>>>> asserts was incorrect incrementing of the slots when building the oop
>>>>> map. Fixing that exposed the second issue which is that different
>>>>> signatures may require very different orders for the move to avoid
>>>>> clobbering other arguments. There's no simple way to order them
>>>>> safely so I resurrected some old C1 code for computing a safe order
>>>>> for issuing stores and break any cycles in those stores. The code
>>>>> itself is fairly general but it's not necessary on the other platforms
>>>>> so I kept it in the platform dependent code instead of moving it into
>>>>> a shared file. Tested with a new manual test that exercises all
>>>>> permutations of 8 arguments that mix primtives and arrays on Solaris,
>>>>> Linux and Windows. Also tested with failing
>>>>> javasoft.sqe.tests.api.java.security.Signature.updateTests test.
>>
More information about the hotspot-compiler-dev
mailing list