8066103: C2's range check smearing allows out of bound array accesses

John Rose john.r.rose at oracle.com
Mon Dec 8 16:58:55 UTC 2014


That's good; let's do it that way!

Final suggestion (really):  Add some more test cases, containing duplicate array indexes, to exercise the "local" logic. 

– John

> On Dec 8, 2014, at 5:30 AM, Roland Westrelin <roland.westrelin at oracle.com> wrote:
> 
> Hi John,
> 
> Thanks for the suggestions. They sound very reasonable to me. Here is a new webrev:
> 
> http://cr.openjdk.java.net/~roland/8066103/webrev.03/
> 
> In the patch below:
> 
>> Or better yet a purely local cutout.  (This sketch has a bad goto; the value of 'prev_dom' carried by the goto is what I called 'most_recent_prev_check' above.)
>> 
>> diff --git a/src/share/vm/opto/ifnode.cpp b/src/share/vm/opto/ifnode.cpp
>> --- a/src/share/vm/opto/ifnode.cpp
>> +++ b/src/share/vm/opto/ifnode.cpp
>> @@ -876,6 +876,7 @@
>>    // Low and high offsets seen so far
>>    jint off_lo = offset1;
>>    jint off_hi = offset1;
>> +    int nb_checks = 0;
>> 
>>    // Scan for the top 2 checks and collect range of offsets
>>    for( int dist = 0; dist < 999; dist++ ) { // Range-Check scan limit
>> @@ -890,6 +891,15 @@
>>        // the same array bounds.
>>        if( flip2 == flip1 && range2 == range1 && index2 == index1 &&
>>            dom->outcnt() == 2 ) {
>> +          if (nb_checks == 0 && dom->in(1) == in(1)) {
>> +            // Found an immediately dominating test at the same offset.
>> +            // This kind of back-to-back test can be eliminated locally,
>> +            // and there is no need to search further for dominating tests.
>> +            assert(offset2 == offset1, "");
>> +            prev_dom = dom;
>> +            goto got_prev_dom;  // FIXME: unstructured control flow
>> +          }
>> +          nb_checks++;
>>          // Gather expanded bounds
>>          off_lo = MIN2(off_lo,offset2);
>>          off_hi = MAX2(off_hi,offset2);
>> @@ -985,6 +995,7 @@
>> 
>>  } // End of Else scan for an equivalent test
>> 
>> + got_prev_dom:  // FIXME: unstructured control flow
>>  // Hit!  Remove this IF
>> #ifndef PRODUCT
>>  if( TraceIterativeGVN ) {
> 
> I don’t think you need prev_dom. prev_dom is the projection, dom is the If node. IfNode::dominated_by needs the projection as input.
> 
> Roland.
> 


More information about the hotspot-compiler-dev mailing list