RFR: 8340009: Improve the output from assert_different_registers

Stefan Karlsson stefank at openjdk.org
Fri Sep 13 12:54:05 UTC 2024


On Thu, 12 Sep 2024 13:03:15 GMT, Axel Boldt-Christmas <aboldtch at openjdk.org> wrote:

>> `assert_different_registers` is a mechanism we use to ensure that we don't use the same register in different variables. When the assert triggers it is not immediately clear where and why the assert failed.
>> 
>> For example, if I introduce an intentional violation:
>> 
>> diff --git a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
>> index fde868a64b3..551878ac09d 100644
>> --- a/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
>> +++ b/src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp
>> @@ -1188,7 +1188,8 @@ void MacroAssembler::lookup_interface_method(Register recv_klass,
>>                                               Register scan_temp,
>>                                               Label& L_no_such_interface,
>>                           bool return_method) {
>> -  assert_different_registers(recv_klass, intf_klass, scan_temp);
>> +  Register joker = intf_klass;
>> +  assert_different_registers(recv_klass, intf_klass, scan_temp, joker);
>>    assert_different_registers(method_result, intf_klass, scan_temp);
>>    assert(recv_klass != method_result || !return_method,
>>       "recv_klass can be destroyed when method isn't needed");
>> 
>> I get this error message:
>> 
>> #  Internal Error (src/hotspot/share/asm/register.hpp:287), pid=42568, tid=9731
>> #  assert(!regs[i]->is_valid() || regs[i] != regs[j]) failed: Multiple uses of register: c_rarg0
>> 
>> The indicated file and line number refers to the `assert_different_registers` implementation and not the offending call site. More over, it's unclear from the assert which of the four variables contain the same register.
>> 
>> I'd like to propose a few changes:
>> 1) That we report the indices of the conflicting registers
>> 2) That we report the correct file and line number
>> 3) That we hide the is_valid() check to lower the noise in the output. Not strictly necessary, but I think it looks nicer.
>> 
>> After these suggestions we'll get error messages that look like this:
>> 
>> #  Internal Error (src/hotspot/cpu/aarch64/macroAssembler_aarch64.cpp:1187), pid=59065, tid=8963
>> #  assert(regs[i] != regs[j]) failed: regs[1] and regs[3] are both: c_rarg0
>> 
>> Which makes it easy to see that variables 1 and 3 are conflicting and by looking at the indicated file and line, it is clear that it is `intf_klass` and `joker` that are the offending variables.
>> 
>> There might be a way to use more macros to propagate the variable names, but I propose that we start with this incre...
>
> A nice improvement.

Thanks for reviewing! @xmas92 has a prototype that prints the "actual" source names, but it uses large macro expansions, so I'm not sure we would take that in. Maybe he can show it as a curiosity. :)

-------------

PR Comment: https://git.openjdk.org/jdk/pull/20965#issuecomment-2348887162


More information about the hotspot-dev mailing list