RFR(S): 8008211 : Some of WB tests on compiler fails

Igor Ignatyev igor.ignatyev at oracle.com
Wed Feb 20 08:03:52 PST 2013


On 02/20/2013 12:41 AM, Vladimir Kozlov wrote:
> On 2/19/13 12:12 PM, Igor Ignatyev wrote:
>> There are two different reasons for this failure:
>>
>>     1. with '-Xcomp':
>> CompilerWhiteBoxTest#method() is inlined into #compile() on first
>> invocation of #test(). so 'WHITE_BOX.setDontInlineMethod(METHOD, true)'
>> does nothing; #method() isn't compiled;
>
> You need to make method() more complex to avoid it. Currently it is
> treated as an "accessor" method and it is inlinined unconditionally. For
> example, pass argument and return increment (x+42).
> I don't see how moving WHITE_BOX.setDontInlineMethod() helps.

moving WHITE_BOX.setDontInlineMethod(METHOD, true) helps because it 
disallow inlining of METHOD.

cutting of PrintInlining/PrintCompilation output before moving:

    3716  615    b  3       DeoptimizeAllTest::test (35 bytes)
                               @ 7 
sun.hotspot.WhiteBox::setDontInlineMethod (0 bytes)   native method
                               @ 12   CompilerWhiteBoxTest::compile (26 
bytes)
                                 @ 13   CompilerWhiteBoxTest::method (3 
bytes)
                               @ 19 
CompilerWhiteBoxTest::checkCompiled (122 bytes)   callee is too large
                               @ 25 
sun.hotspot.WhiteBox::deoptimizeAll (0 bytes)   native method
                               @ 31 
CompilerWhiteBoxTest::checkNotCompiled (75 bytes)   callee is too large

and after moving:
    3983  616    b  3       DeoptimizeAllTest::test (24 bytes)
                               @ 1   CompilerWhiteBoxTest::compile (26 
bytes)
                                 @ 13   CompilerWhiteBoxTest::method (3 
bytes)   don't inline by annotation
                               @ 8   CompilerWhiteBoxTest::checkCompiled 
(122 bytes)   callee is too large
                               @ 14 
sun.hotspot.WhiteBox::deoptimizeAll (0 bytes)   native method

>>     2. with '-XX:+TieredCompilation' and certain relation between
>> 'CompileThreshold' and 'Tier*' values (e.g. -XX:CompileThreshold=100 and
>> default Tier* values):
>> since 'CompileThreshold' doesn't use in Tiered as threshold, but uses in
>> tests we have situation in which CompilerWhiteBoxTest#compile() invokes
>> #method() insufficient time for compilation;
>
>
> With Tiered the default threshold for first tier (C1) is 100. Yes, for
> C2 it is >10000 and depends on other staff. But COMPILE_THRESHOLD=10000
> should be enough for tier one compilation. So I don't understand what do
> you mean by "invokes insufficient time for compilation".

in current version of tests value of 'CompileThreshold' is used as limit 
in for-loop. In nightly it equals '100' and it isn't enough even for 
tier one, cuz with default values of Tier* flags we need to invoke 
method 256 times.
in attachment program that illustrates it:

$ java -XX:+PrintCompilation -XX:+TieredCompilation 
-XX:CompileThreshold=100 -XX:+PrintTieredEvents CompileThresholdTest 100 
| grep CompileThresholdTest

$ java -XX:+PrintCompilation -XX:+TieredCompilation 
-XX:CompileThreshold=100 -XX:+PrintTieredEvents CompileThresholdTest 256 
| grep CompileThresholdTest
0.049705: [call level: 0 [CompileThresholdTest.m1()I] @-1 queues: 0,0 
rate: n/a k: 1.00,1.00 total: 128,0 mdo: 0(0),0(0) max levels: 0,0 
compilable: c1, c2, osr status: idle]
0.049785: [call level: 0 [CompileThresholdTest.m1()I] @-1 queues: 0,0 
rate: n/a k: 1.00,1.00 total: 256,0 mdo: 0(0),0(0) max levels: 0,0 
compilable: c1, c2, osr status: idle]
0.049812: [compile level: 3 [CompileThresholdTest.m1()I] @-1 queues: 0,0 
rate: n/a k: 1.00,1.00]
      49    8       3       CompileThresholdTest::m1 (3 bytes)


> And I really don't like next code:
>
> !         int count = getCompileThreshold();
> !         int i = 0;
> !         do {
> !             for (; i < count; ++i) {
>                    result += method();
>                }
> +             count = getCompileThreshold();
> +         } while (i < count);
>
> You are using in getCompileThreshold() the knowledge of current tiered
> threashold implementation.  But it could be changed in a future.
>

I would like to pull out getting of tiered threshold to WB, but I could 
not find a way to do this, since we have only predicate to test + 
'Tier0InvokeNotifyFreqLog' determines how often predicate will be checked.

> Vladimir
>>
>> Best regards,
>> Igor Ignatyev
>>
>> On 02/19/2013 10:49 PM, Vladimir Kozlov wrote:
>>> Igor,
>>>
>>> Can you give mode details about the failure?
>>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 2/19/13 9:37 AM, Igor Ignatyev wrote:
>>>> Hi all,
>>>>
>>>> Please review the patch.
>>>>
>>>> 1. calls of WB.setDontInlineMethod() were moved into main()
>>>> 2. added estimation of threshold for tiered compilation
>>>>
>>>> webrev: http://cr.openjdk.java.net/~iignatyev/8008211/webrev.00/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: CompileThresholdTest.java
Type: text/x-java
Size: 307 bytes
Desc: not available
Url : http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20130220/175fe958/CompileThresholdTest.java 


More information about the hotspot-compiler-dev mailing list