On Mon, 25 May 2026 21:58:09 GMT, Vladimir Ivanov <[email protected]> wrote:

>> On bytecode level booleans are represented as ints and HotSpot JVM 
>> normalizes boolean values on memory accesses. It unconditionally applies 
>> normalization on boolean stores, but trusts on-heap boolean locations to 
>> hold normalized values. Normalization is applied on loads for off-heap and 
>> mismatched unsafe accesses .  
>> 
>> There are 2 normalization procedures used: (1) cast int to byte and test it 
>> against zero; and (2) truncation to least-significant bit.  Truncation is 
>> preferred (due to performance considerations), but JNI mandates testing 
>> against zero and, historically, `#1` was used for off-heap unsafe accesses 
>> as well. It complicated the implementation (leading to subtle bugs) and 
>> introduced divergence in behavior at runtime (depending on execution mode 
>> and JIT-compilation peculiarities). 
>> 
>> The fix uses truncation uniformly across all execution modes. It simplifies 
>> implementation and eliminates possible divergence in behavior between 
>> execution modes. Also, it drastically simplifies future Unsafe API 
>> refactorings.
>> 
>> There's one scenario left when it's possible to observe non-normalized 
>> values: when mismatched access pollutes the Java heap with a bogus boolean 
>> value, but then the value is read with a well-typed boolean access.
>> 
>> Testing: hs-tier1 - hs-tier6
>>  
>> - [x] I confirm that I make this contribution in accordance with the 
>> [OpenJDK Interim AI Policy](https://openjdk.org/legal/ai).
>
> Vladimir Ivanov has updated the pull request incrementally with three 
> additional commits since the last revision:
> 
>  - Merge remote-tracking branch 'origin/boolean_normalize' into 
> boolean_normalize
>  - update
>  - Truncate boolean values

Thanks for the feedback, John.

> Request: Could you post FTR the output from the jtreg test, both before the 
> other changes are applied, and after?

I attached test output logs to the bug (`test_before.ctz.log`, 
`test_before.mixed.log`, and `test_after.lsb.log`).

> The MODE=MIXED has tricky expectations; maybe document in the switch on mode 
> (expected computation).

`Mode.MIXED` has the following comment: 

        MIXED("(x & 1) + (byte != 0)"); // Truncate to LSB on stores, compare 
to zero on loads


Is it what you are asking for?

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

PR Comment: https://git.openjdk.org/jdk/pull/31249#issuecomment-4548280131

Reply via email to