< prev index next >

src/hotspot/share/opto/vector.cpp

Print this page
*** 203,13 ***
        PhaseGVN& gvn = kit.gvn();
  
        // Adjust JVMS from post-call to pre-call state: put args on stack
        uint nargs = call->method()->arg_size();
        kit.ensure_stack(kit.sp() + nargs);
!       for (uint i = TypeFunc::Parms; i < call->tf()->domain()->cnt(); i++) {
!         kit.push(call->in(i));
        }
        jvms = kit.sync_jvms();
  
        Node* new_vbox = nullptr;
        {
          Node* vect = vec_box->in(VectorBoxNode::Value);
--- 203,29 ---
        PhaseGVN& gvn = kit.gvn();
  
        // Adjust JVMS from post-call to pre-call state: put args on stack
        uint nargs = call->method()->arg_size();
        kit.ensure_stack(kit.sp() + nargs);
!       uint in_idx = TypeFunc::Parms;  // The index of the call input, using scalarized calling convention.
!       int parm_idx = 0;  // The index of the Java parameter: double/long take one slot
+       for (uint i = 0; i < nargs; i++) {  // The index of the argument on the JVM stack: double/long take two slots
+         const Type* arg_type = call->tf()->domain_sig()->field_at(TypeFunc::Parms + i);
+         if (arg_type->is_inlinetypeptr() && !call->method()->mismatch() && call->method()->is_scalarized_arg(parm_idx)) {
+           bool nullable = arg_type->maybe_null();
+           ciInlineKlass* vk = arg_type->inline_klass();
+           InlineTypeNode* it = InlineTypeNode::make_from_multi(&kit, call, vk, in_idx, true, !nullable);
+           kit.push(gvn.transform(it));
+         } else {
+           kit.push(call->in(in_idx));
+           in_idx++;
+         }
+         if (arg_type != Type::HALF) {
+           parm_idx++;
+         }
        }
+       assert(in_idx == call->tf()->domain_cc()->cnt(), "should have processed exactly as many input as the scalarized calling convention; %d vs %d", in_idx, call->tf()->domain_cc()->cnt());
+       assert(parm_idx == (call->method()->is_static() ? 0 : 1) + call->method()->signature()->count(), "should have processed all the parameters; %d vs %d", parm_idx, (call->method()->is_static() ? 0 : 1) + call->method()->signature()->count());
        jvms = kit.sync_jvms();
  
        Node* new_vbox = nullptr;
        {
          Node* vect = vec_box->in(VectorBoxNode::Value);
< prev index next >