[16] RFR(S): 8251093: Improve C1 register allocator logging and debugging support
Christian Hagedorn
christian.hagedorn at oracle.com
Tue Aug 18 13:16:12 UTC 2020
Hi Vladimir
On 17.08.20 19:36, Vladimir Kozlov wrote:
> On 8/17/20 12:44 AM, Christian Hagedorn wrote:
>> Hi Vladimir
>>
>> Yes, you're right, these should be changed into ASSERT and DEBUG().
>>
>> I'm wondering though if these ifdefs are even required for if-blocks
>> inside methods?
>>
>> Isn't, for example, this if-block:
>>
>> #ifndef PRODUCT
>> if (TraceLinearScanLevel >= 2) {
>> tty->print_cr("killing XMMs for trig");
>> }
>> #endif
>>
>> removed anyways when the flag is set to < 2 (which is statically known
>> and thus would allow this entire block to be removed)? Or does it make
>> a difference by explicitly guarding it with an ifdef?
>
> You are right. It could be statically removed. But we keep #ifdef
> sometimes to indicate that code is executed only in debug build because
> we don't always remember type of a flag.
I see, that makes sense. I updated my patch and left the ifdefs there
but changed them to ASSERT. I also updated other ifdefs belonging to
TraceLinearScanLevel appropriately.
http://cr.openjdk.java.net/~chagedorn/8251093/webrev.01/
Best regards,
Christian
>
> Thanks,
> Vladimir K
>
>>
>> Best regards,
>> Christian
>>
>> On 14.08.20 20:09, Vladimir Kozlov wrote:
>>> One note. Most of the code is guarded by #ifndef PRODUCT.
>>>
>>> But the flag is available only in DEBUG build:
>>> develop(intx, TraceLinearScanLevel, 0,
>>>
>>> Should we use #ifdef ASSERT and DEBUG() instead?
>>>
>>> Thanks,
>>> Vladimir
>>>
>>> On 8/14/20 5:10 AM, Christian Hagedorn wrote:
>>>> Hi
>>>>
>>>> Please review the following enhancement for C1:
>>>> https://bugs.openjdk.java.net/browse/JDK-8251093
>>>> http://cr.openjdk.java.net/~chagedorn/8251093/webrev.00/
>>>>
>>>> While I was working on JDK-8249603 [1], I added some additional
>>>> debugging and logging code which helped to figure out what was going
>>>> on. I think it would be useful to have this code around for the
>>>> analysis of future C1 register allocator bugs.
>>>>
>>>> This RFE adds (everything non-product code):
>>>> - find_interval(number): Can be called like that from gdb anywhere
>>>> to find an interval with the given number.
>>>> - Interval::print_children()/print_parent(): Useful when debugging
>>>> with gdb to quickly show the split children and parent.
>>>> - LinearScan::print_reg_num(number): Prints the register or stack
>>>> location for this register number. This is useful in some places
>>>> (logging with TraceLinearScanLevel set) where it just printed a
>>>> number which first had to be manually looked up in other logs.
>>>>
>>>> I additionally did some cleanup of the touched code.
>>>>
>>>> We could additionally split the TraceLinearScanLevel flag into
>>>> separate flags related to the different phases of the register
>>>> allocation algorithm. It currently just prints too much details on
>>>> the higher levels. You often find yourself being interested in a
>>>> specific part of the algorithm and only want to know more details
>>>> there. To achieve that you now you have to either handle all the
>>>> noise or manually disable/enable other logs. We could file an RFE to
>>>> clean this up if it's worth the effort - given that there are not
>>>> many new issues filed for C1 register allocation today.
>>>>
>>>> Thank you!
>>>>
>>>> Best regards,
>>>> Christian
>>>>
>>>>
>>>> [1] https://bugs.openjdk.java.net/browse/JDK-8251093
>>>>
More information about the hotspot-compiler-dev
mailing list