box and val (c2 crash)

Srikanth srikanth.adayapalam at oracle.com
Mon Jan 28 12:03:29 UTC 2019



On 07/01/19 3:07 PM, Srikanth wrote:
> Hi Remi,
>
> For the observation about javac, I will take a look and follow up.

Hi Remi,

The two issues reported in this mail are fixed via:

https://bugs.openjdk.java.net/browse/JDK-8217875 and
https://bugs.openjdk.java.net/browse/JDK-8217872

Let me know if you continue to see any problems with these constructs.

Thanks!
Srikanth

>
> Thanks!
> Srikanth
>
> On 03/01/19 8:44 PM, Remi Forax wrote:
>> Now, i've tried to play with the .box/.val trying to implement the 
>> clojure Cursor protocol,
>> which iterate like it's an abstract linked list, so at each step 
>> either you return a new Cursor (a value type) or null at the end 
>> (which seems to be a good test for a nullable value type).
>>
>> The following code compiles !
>> I had to had the fix method because the compier refuse to find any 
>> methods on Cursor.box and
>>    Cursor.box boxed = ...
>>    ((Cursor)boxed).next
>> doesn't compile too.
>>
>> If you try to execute the code, it crashes the VM (in the C2 compiler 
>> thread it seems)
>>
>> Current CompileTask:
>> C2:    338  119 fr.umlv.valuetype.perf.TupleLoopBenchMark::sum (46 
>> bytes)
>>
>> Stack: [0x00007ff4c0a37000,0x00007ff4c0b38000], 
>> sp=0x00007ff4c0b34700,  free space=1013k
>> Native frames: (J=compiled Java code, A=aot compiled Java code, 
>> j=interpreted, Vv=VM code, C=native code)
>> V  [libjvm.so+0xe19ed6]  VMError::report_and_die(int, char const*, 
>> char const*, __va_list_tag*, Thread*, unsigned char*, void*, void*, 
>> char const*, int, unsigned long)+0x186
>> V  [libjvm.so+0xe1ac87]  VMError::report_and_die(Thread*, void*, char 
>> const*, int, char const*, char const*, __va_list_tag*)+0x47
>> V  [libjvm.so+0x67a68e]  report_vm_error(char const*, int, char 
>> const*, char const*, ...) [clone .constprop.51]+0xee
>> V  [libjvm.so+0xdbc39e]  TypePtr::xmeet_helper(Type const*) const+0x5e
>> V  [libjvm.so+0xdb80e0]  TypePtr::xmeet(Type const*) const+0x10
>> V  [libjvm.so+0x5564c1]  PhiNode::Value(PhaseGVN*) const+0x131
>> V  [libjvm.so+0xc38986] PhaseGVN::transform_no_reclaim(Node*)+0x86
>> V  [libjvm.so+0xc00c2d]  Parse::do_exits()+0x4bd
>> V  [libjvm.so+0xc05c16]  Parse::Parse(JVMState*, ciMethod*, float)+0xab6
>> V  [libjvm.so+0x53da48] ParseGenerator::generate(JVMState*)+0x88
>> V  [libjvm.so+0x70f87d]  Parse::do_call()+0x2dd
>> V  [libjvm.so+0xc15998]  Parse::do_one_bytecode()+0x32e8
>> V  [libjvm.so+0xc03077]  Parse::do_one_block()+0x197
>> V  [libjvm.so+0xc034e2]  Parse::do_all_blocks()+0x102
>> V  [libjvm.so+0xc05bd0]  Parse::Parse(JVMState*, ciMethod*, float)+0xa70
>> V  [libjvm.so+0x53da48] ParseGenerator::generate(JVMState*)+0x88
>> V  [libjvm.so+0x61bab8]  Compile::Compile(ciEnv*, C2Compiler*, 
>> ciMethod*, int, bool, bool, bool, DirectiveSet*)+0xe98
>> V  [libjvm.so+0x53cf46]  C2Compiler::compile_method(ciEnv*, 
>> ciMethod*, int, DirectiveSet*)+0xe6
>> V  [libjvm.so+0x624182] 
>> CompileBroker::invoke_compiler_on_method(CompileTask*)+0x3a2
>> V  [libjvm.so+0x6255c8] CompileBroker::compiler_thread_loop()+0x608
>> V  [libjvm.so+0xda42f8]  JavaThread::thread_main_inner()+0xf8
>> V  [libjvm.so+0xda0fc1]  Thread::call_run()+0x171
>> V  [libjvm.so+0xbd5598]  thread_native_entry(Thread*)+0xf8
>>
>>
>> Rémi
>>
>> ---
>>    static value class Tuple {
>>      private final int index;
>>      private final int element;
>>                private Tuple(int index, int element) {
>>        this.index = index;
>>        this.element = element;
>>      }
>>    }
>>       static value class Cursor {
>>      private final int[] array;
>>      private final int index;
>>           private Cursor(int[] array, int index) {
>>        this.array = array;
>>        this.index = index;
>>      }
>>           Tuple current() {
>>        return new Tuple(index, array[index]);
>>      }
>>           Cursor.box next() {
>>        if (index + 1 == array.length) {
>>          return null;
>>        }
>>        return new Cursor(array, index + 1);
>>      }
>>    }
>>       private static Cursor.box indexedElements(int[] array) {
>>      if (array.length == 0) {
>>        return null;
>>      }
>>      return new Cursor(array, 0);
>>    }
>>       private static Cursor fix(Cursor.box cursor) {
>>      return cursor;
>>    }
>>       @Benchmark
>>    public int sum() {
>>      int sum = 0;
>>      for(Cursor.box cursor = indexedElements(ARRAY); cursor != null; 
>> cursor = fix(cursor).next()) {
>>        Tuple tuple = fix(cursor).current();
>>        sum += tuple.index + tuple.element;
>>      }
>>      return sum;
>>    }
>>
>



More information about the valhalla-dev mailing list