Optimization question

Krystal Mok rednaxelafx at gmail.com
Thu Dec 24 02:20:14 UTC 2015


Comments inline below:

On Wed, Dec 23, 2015 at 6:13 PM, Vitaly Davidovich <vitalyd at gmail.com>
wrote:

> Hi Vladimir,
>
> On Wednesday, December 23, 2015, Vladimir Kozlov <
> vladimir.kozlov at oracle.com> wrote:
>
>> Unfortunately whole loop unrolling happens after Escape analysis is done.
>> As result we can't eliminate allocations since we don't know which
>> element of arrays is referenced in loop:
>>
>> JavaObject NoEscape(NoEscape) NSR [ 397F 275F 276F 398F [ 197 202 ]]
>>  185      AllocateArray   ===  127  124  178  8  1 ( 111  99  20  98  1
>> 72  1  1  130  1
>>
>> NSR - Non Scalar Replaceable.
>>
>> After loop is unrolled the result is calculated but arrays are still
>> allocated.
>
>
> Ah ok, that's what Kris was saying as well.  But why does unrolling matter
> for this purpose? Even if loop is not unrolled is it not known which
> elements are accessed?
>

When the loop is fully unrolled, the indices of the elements in the array
becomes a compile-time constant.
That, in turn, can be recognized by EA, allowing the array to be scalar
replaceable -- if EA happens after loop unrolling, that is.


>
> Also, what do you mean by "result is calculated"? What result? :)
>

Vladimir is probably talking about the "sum" and "wsum" local variable in
your program is constant folded after loop unrolling.
But the array had to stay.

- Kris


>
>
>> We do remove NSR allocations for boxing objects but not regular
>> allocations:
>>
>>   // Eliminate boxing allocations which are not used
>>   // regardless scalar replaceable status.
>>   bool boxing_alloc = C->eliminate_boxing() &&
>>                       tklass->klass()->is_instance_klass()  &&
>>
>> tklass->klass()->as_instance_klass()->is_box_klass();
>>   if (!alloc->_is_scalar_replaceable && (!boxing_alloc || (res != NULL)))
>> {
>>     return false;
>>   }
>>
>> Only allocation followed by arraycopy skips zeroing, not by fill() call.
>> Arrays.fill() is implemented as loop.
>>
>>   if (init != NULL && init->is_complete_with_arraycopy() &&
>>       k->is_type_array_klass()) {
>>     // Don't zero type array during slow allocation in VM since
>>     // it will be initialized later by arraycopy in compiled code.
>>     slow_call_address = OptoRuntime::new_array_nozero_Java();
>
>
> Hmm, I'm pretty sure fill() following an allocation had the same zeroing
> elision applied to it.  Kris notes the opto is turned off due to
> implementation issues, which would explain why I still see zeroing.
>
> Thanks
>
>>
>> Regards,
>> Vladimir
>>
>> On 12/23/15 4:56 PM, Vitaly Davidovich wrote:
>>
>>> Hi guys,
>>>
>>> Consider code like this:
>>>
>>> static double mean(double[] array, double[] weights) {
>>>       if (array.length != weights.length) throw ...;
>>>       double sum = 0;
>>>       double wsum = 0;
>>>       for(int i = 0; i < array.length; i++) {
>>>            sum += array[i] * weights[i];
>>>            wsum += weights[i];
>>>        }
>>>        return sum / wsum;
>>> }
>>>
>>> static double mean(double[] array) {
>>>       return mean(array, allOnes(array.length));
>>> }
>>>
>>> static double[] allOnes(int n) {
>>>       double[] d = new double[n];
>>>       Arrays.fill(d, 1);
>>>       return d;
>>> }
>>>
>>> Now suppose I call mean(double[]) overload like this:
>>>
>>> double[] d = {1,2,3,4};
>>>
>>> Using 8u51 with C2 compiler:
>>>
>>> 1) it looks like the array allocation from allOnes isn't eliminated.
>>> 2) moreover it looked like array was zeroed (rep stosd with rax holding
>>> zero).  Unless I misread the asm, I thought an
>>> allocation followed by Arrays.fill skips the zeroing?
>>> 3) ideally, this case would reduce to code that just does a plain
>>> unweighted mean with no multiplication by the weight
>>> and no summation for the weighted sum (weight sum is just array
>>> length).  Is this simply too much analysis to ask for?
>>>
>>> Thanks
>>>
>>>
>>> --
>>> Sent from my phone
>>>
>>
>
> --
> Sent from my phone
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.openjdk.java.net/pipermail/hotspot-compiler-dev/attachments/20151223/b43f85f4/attachment-0001.html>


More information about the hotspot-compiler-dev mailing list