RFR: 8294366: RISC-V: Partially mark out incompressible regions [v2]

Fei Yang fyang at openjdk.org
Sat Oct 8 15:59:59 UTC 2022


On Sat, 8 Oct 2022 06:42:19 GMT, Xiaolin Zheng <xlinzheng at openjdk.org> wrote:

>> Shortly, the current RVC implementation in the RISC-V backend is a "whitelist mode", merely compressing instructions marked by "CompressibleRegion" that covers just part of C2 matching rules and stub code (only ~5% compression rate). Due to the originally existing large backend code base and to spread the coverage to nearly all instructions generated by the backend, we cannot modify them little by little, but should implement a "blacklist mode" (a compression rate to ~20% if complete), to exclude compressions from:
>> 1. relocations
>> 2. patchable instructions
>> 3. fixed length code slices whose code size is calculated
>> 
>> Please check the discussions in the riscv-port mailing list[1] to go in for more details.
>> 
>> This patch contains the first half of implementations which does not change the program behavior: it just introduces an "IncompressibleRegion" to indicate a piece of code "not compressible", marking out the patchable instructions and fixed-length code slices that are not able to compress by RVC.
>> 
>> Besides, this patch also temporarily removes some automatic compression logic of branch instructions like "jal"s and "beq"s, for MachBranchNodes' fake labels could hamper the automatic compression as well and for making code clean. Please also check the discussions in the thread[1].
>> 
>> Please check the unsquashed commits to have a better review of the patch.
>> 
>> 
>> Tested a hotspot tier1 and tier2 with the option UseRVC turning on.
>> 
>> [1] https://mail.openjdk.org/pipermail/riscv-port-dev/2022-September/000615.html
>> 
>> Thanks,
>> Xiaolin
>
> Xiaolin Zheng has updated the pull request with a new target base due to a merge or a rebase. The incremental webrev excludes the unrelated changes brought in by the merge/rebase. The pull request contains 10 additional commits since the last revision:
> 
>  - Plural form
>  - comment polishment
>  - patchable nop's code style
>  - Merge remote-tracking branch 'github-openjdk/master' into riscv-rvc-checkin-first-half-part
>  - Merge remote-tracking branch 'github-openjdk/master' into riscv-rvc-checkin-first-half-part
>  - [5] RVC: IncompressibleRegions for patchable labels
>  - [4] RVC: IncompressibleRegions for fixed length code slices
>  - [3] RVC: IncompressibleRegions for patchable nops
>  - [2] RVC: Disable auto transformations for branch instructions
>  - [1] RVC: Add the IncompressibleRegion

Updated change looks good. Thanks.

src/hotspot/cpu/riscv/assembler_riscv.hpp line 2113:

> 2111: //
> 2112: // 4. Using -XX:PrintAssemblyOptions=no-aliases could distinguish RVC instructions from
> 2113: //    normal ones.

One more suggestion for this code comment:

// ========================================
// RISC-V Compressed Instructions Extension
// ========================================
// Note:
// 1. Assembler functions encoding 16-bit compressed instructions always begin with a 'c_'
//    prefix, such as 'c_add'. Correspondingly, assembler functions encoding normal 32-bit
//    instructions with begin with a '_' prefix, such as "_add". Most of time users have no
//    need to explicitly emit these compressed instructions. Instead, they still use unified
//    wrappers such as 'add' which do the compressing work through 'c_add' depending on the
//    the operands of the instruction and availability of the RVC hardware extension.
//
// 2. 'CompressibleRegion' and 'IncompressibleRegion' are introduced to mark assembler scopes
//     within which instructions are qualified or unqualified to be compressed into their 16-bit
//     versions. An example:
//
//      CompressibleRegion cr(_masm);
//      __ add(...);       // this instruction will be compressed into 'c.and' when possible
//      {
//         IncompressibleRegion ir(_masm);
//         __ add(...);    // this instruction will not be compressed
//         {
//            CompressibleRegion cr(_masm);
//            __ add(...); // this instruction will be compressed into 'c.and' when possible
//         }
//      }
//
// 3. When printing JIT assembly code, using -XX:PrintAssemblyOptions=no-aliases could help
//    distinguish compressed 16-bit instructions from normal 32-bit ones.

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

Marked as reviewed by fyang (Reviewer).

PR: https://git.openjdk.org/jdk/pull/10421


More information about the hotspot-dev mailing list