RFR: 8360192: C2: Make the type of count leading/trailing zero nodes more precise

Qizheng Xing qxing at openjdk.org
Mon Jun 23 03:36:13 UTC 2025


The result of count leading/trailing zeros is always non-negative, and the maximum value is integer type's size in bits. In previous versions, when C2 can not know the operand value of a CLZ/CTZ node at compile time, it will generate a full-width integer type for its result. This can significantly affect the efficiency of code in some cases.

This patch makes the type of CLZ/CTZ nodes more precise, to make C2 generate better code. For example, the following implementation runs ~115% faster on x86-64 with this patch:


public static int numberOfNibbles(int i) {
  int mag = Integer.SIZE - Integer.numberOfLeadingZeros(i);
  return Math.max((mag + 3) / 4, 1);
}


Testing: tier1, IR test

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

Commit messages:
 - Make the type of count leading/trailing zero nodes more precise

Changes: https://git.openjdk.org/jdk/pull/25928/files
  Webrev: https://webrevs.openjdk.org/?repo=jdk&pr=25928&range=00
  Issue: https://bugs.openjdk.org/browse/JDK-8360192
  Stats: 127 lines in 3 files changed: 123 ins; 0 del; 4 mod
  Patch: https://git.openjdk.org/jdk/pull/25928.diff
  Fetch: git fetch https://git.openjdk.org/jdk.git pull/25928/head:pull/25928

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


More information about the hotspot-compiler-dev mailing list