[foreign-memaccess+abi] RFR: 8266371: Memory segment bound check fails because of small segment optimizations
Maurizio Cimadamore
mcimadamore at openjdk.java.net
Fri Apr 30 14:24:22 UTC 2021
On Fri, 30 Apr 2021 14:14:57 GMT, Maurizio Cimadamore <mcimadamore at openjdk.org> wrote:
> The optimization for small memory segment bound check does not take into account numeric overflow. As a result, the bounds check does not detect big long values which, when casted back to int values appear to be within the segment's bounds.
>
> The fix is to avoid the optimized bound check routine if the offset/length at which the segment is accessed is bigger than Integer.MAX_VALUE.
>
> Benchmarks do not seem affected by this change (I'll post results in a separate comment).
Before:
Benchmark (polluteProfile) Mode Cnt Score Error Units
LoopOverNonConstant.segment_get N/A avgt 30 4.640 ? 0.048 ns/op
LoopOverNonConstant.segment_loop N/A avgt 30 0.230 ? 0.002 ms/op
LoopOverNonConstant.segment_loop_readonly N/A avgt 30 0.241 ? 0.002 ms/op
LoopOverNonConstant.segment_loop_slice N/A avgt 30 0.242 ? 0.004 ms/op
LoopOverNonConstant.segment_loop_static N/A avgt 30 0.228 ? 0.003 ms/op
LoopOverNonConstantFP.segment_loop N/A avgt 30 0.472 ? 0.008 ms/op
LoopOverNonConstantHeap.segment_get false avgt 27 4.339 ? 0.076 ns/op
LoopOverNonConstantHeap.segment_get true avgt 27 4.289 ? 0.077 ns/op
LoopOverNonConstantHeap.segment_loop false avgt 27 0.224 ? 0.004 ms/op
LoopOverNonConstantHeap.segment_loop true avgt 27 0.230 ? 0.004 ms/op
LoopOverNonConstantHeap.segment_loop_readonly false avgt 27 0.225 ? 0.003 ms/op
LoopOverNonConstantHeap.segment_loop_readonly true avgt 27 0.225 ? 0.003 ms/op
LoopOverNonConstantHeap.segment_loop_slice false avgt 27 0.230 ? 0.002 ms/op
LoopOverNonConstantHeap.segment_loop_slice true avgt 27 0.230 ? 0.002 ms/op
LoopOverNonConstantHeap.segment_loop_static false avgt 27 0.232 ? 0.001 ms/op
LoopOverNonConstantHeap.segment_loop_static true avgt 27 0.224 ? 0.002 ms/op
LoopOverNonConstantMapped.segment_get N/A avgt 30 4.599 ? 0.072 ns/op
LoopOverNonConstantMapped.segment_loop N/A avgt 30 0.229 ? 0.003 ms/op
LoopOverNonConstantMapped.segment_loop_readonly N/A avgt 30 0.236 ? 0.004 ms/op
LoopOverNonConstantMapped.segment_loop_slice N/A avgt 30 0.241 ? 0.002 ms/op
LoopOverNonConstantMapped.segment_loop_static N/A avgt 30 0.227 ? 0.003 ms/op
LoopOverNonConstantShared.segment_get N/A avgt 30 4.045 ? 0.045 ns/op
LoopOverNonConstantShared.segment_loop N/A avgt 30 0.229 ? 0.001 ms/op
LoopOverNonConstantShared.segment_loop_readonly N/A avgt 30 0.224 ? 0.004 ms/op
LoopOverNonConstantShared.segment_loop_slice N/A avgt 30 0.223 ? 0.003 ms/op
LoopOverNonConstantShared.segment_loop_static N/A avgt 30 0.227 ? 0.002 ms/op
After:
Benchmark (polluteProfile) Mode Cnt Score Error Units
LoopOverNonConstant.segment_get N/A avgt 30 4.530 ? 0.063 ns/op
LoopOverNonConstant.segment_loop N/A avgt 30 0.230 ? 0.004 ms/op
LoopOverNonConstant.segment_loop_readonly N/A avgt 30 0.242 ? 0.004 ms/op
LoopOverNonConstant.segment_loop_slice N/A avgt 30 0.234 ? 0.003 ms/op
LoopOverNonConstant.segment_loop_static N/A avgt 30 0.227 ? 0.003 ms/op
LoopOverNonConstantFP.segment_loop N/A avgt 30 0.471 ? 0.024 ms/op
LoopOverNonConstantFP.unsafe_loop N/A avgt 30 0.463 ? 0.010 ms/op
LoopOverNonConstantHeap.segment_get false avgt 30 4.354 ? 0.022 ns/op
LoopOverNonConstantHeap.segment_get true avgt 30 4.309 ? 0.071 ns/op
LoopOverNonConstantHeap.segment_loop false avgt 30 0.223 ? 0.004 ms/op
LoopOverNonConstantHeap.segment_loop true avgt 30 0.225 ? 0.003 ms/op
LoopOverNonConstantHeap.segment_loop_readonly false avgt 30 0.226 ? 0.003 ms/op
LoopOverNonConstantHeap.segment_loop_readonly true avgt 30 0.225 ? 0.004 ms/op
LoopOverNonConstantHeap.segment_loop_slice false avgt 30 0.225 ? 0.003 ms/op
LoopOverNonConstantHeap.segment_loop_slice true avgt 30 0.228 ? 0.002 ms/op
LoopOverNonConstantHeap.segment_loop_static false avgt 30 0.227 ? 0.003 ms/op
LoopOverNonConstantHeap.segment_loop_static true avgt 30 0.229 ? 0.003 ms/op
LoopOverNonConstantMapped.segment_get N/A avgt 30 4.612 ? 0.060 ns/op
LoopOverNonConstantMapped.segment_loop N/A avgt 30 0.227 ? 0.004 ms/op
LoopOverNonConstantMapped.segment_loop_readonly N/A avgt 30 0.236 ? 0.002 ms/op
LoopOverNonConstantMapped.segment_loop_slice N/A avgt 30 0.239 ? 0.003 ms/op
LoopOverNonConstantMapped.segment_loop_static N/A avgt 30 0.229 ? 0.002 ms/op
LoopOverNonConstantShared.segment_get N/A avgt 30 4.071 ? 0.054 ns/op
LoopOverNonConstantShared.segment_loop N/A avgt 30 0.224 ? 0.003 ms/op
LoopOverNonConstantShared.segment_loop_readonly N/A avgt 30 0.226 ? 0.002 ms/op
LoopOverNonConstantShared.segment_loop_slice N/A avgt 30 0.229 ? 0.002 ms/op
LoopOverNonConstantShared.segment_loop_static N/A avgt 30 0.220 ? 0.001 ms/op
test/micro/org/openjdk/bench/jdk/incubator/foreign/LoopOverNonConstantHeap.java line 100:
> 98: }
> 99:
> 100: @TearDown
This change fix an issue with the benchmark which was caused by the new ResourceScope API: heap segments are associated with the global scope, so they cannot be closed.
-------------
PR: https://git.openjdk.java.net/panama-foreign/pull/524
More information about the panama-dev
mailing list