[16] RFR(S): 8251093: Improve C1 register allocator logging and debugging support
Vladimir Kozlov
vladimir.kozlov at oracle.com
Wed Aug 19 16:43:08 UTC 2020
Looks good.
Thanks,
Vladimir K
On 8/19/20 7:06 AM, Christian Hagedorn wrote:
> On 18.08.20 17:41, Vladimir Kozlov wrote:
>> c1_Compilation.hpp: looks like both versions of allocator() do the same thing.
>
> Right, I first wanted to have a public allocator() version in non-product only - but that might be over-engineered as
> they do the same thing. I changed it back to a single public version.
>
>> I suggest to build with configure --with-debug-level=optimized to check that NOT_PRODUCT can be built with these changes.
>
> That's a good idea! I indeed forgot about one NOT_PRODUCT -> DEBUG_ONLY change. I also found other build issues with the
> optimized build. I filed [1] and already sent an RFR for it. It builds successfully with this patch on top of it.
>
> http://cr.openjdk.java.net/~chagedorn/8251093/webrev.02/
>
> Best regards,
> Christian
>
> [1] https://bugs.openjdk.java.net/browse/JDK-8252037
>
>> Thanks,
>> Vladimir
>>
>> On 8/18/20 6:16 AM, Christian Hagedorn wrote:
>>> 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