[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