895 896 // Process users 897 for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) { 898 Node* out = fast_out(i); 899 if (out->isa_ValueType() != NULL) { 900 // Recursively process value type users 901 out->as_ValueType()->remove_redundant_allocations(igvn, phase); 902 } else if (out->isa_Allocate() != NULL) { 903 // Allocate users should be linked 904 assert(out->in(AllocateNode::ValueNode) == this, "should be linked"); 905 } else { 906 #ifdef ASSERT 907 // The value type should not have any other users at this time 908 out->dump(); 909 assert(false, "unexpected user of value type"); 910 #endif 911 } 912 } 913 } 914 915 ValueTypePtrNode* ValueTypePtrNode::make_from_value_type(PhaseGVN& gvn, ValueTypeNode* vt) { 916 ValueTypePtrNode* vtptr = new ValueTypePtrNode(vt->value_klass(), vt->get_oop()); 917 for (uint i = Oop+1; i < vt->req(); i++) { 918 vtptr->init_req(i, vt->in(i)); 919 } 920 return gvn.transform(vtptr)->as_ValueTypePtr(); 921 } 922 923 ValueTypePtrNode* ValueTypePtrNode::make_from_call(GraphKit* kit, ciValueKlass* vk, CallNode* call) { 924 ValueTypePtrNode* vtptr = new ValueTypePtrNode(vk, kit->zerocon(T_VALUETYPE)); 925 vtptr->initialize(kit, call, vk); 926 return vtptr; 927 } 928 929 ValueTypePtrNode* ValueTypePtrNode::make_from_oop(GraphKit* kit, Node* oop) { 930 // Create and initialize a ValueTypePtrNode by loading all field 931 // values from a heap-allocated version and also save the oop. 932 ciValueKlass* vk = kit->gvn().type(oop)->value_klass(); 933 ValueTypePtrNode* vtptr = new ValueTypePtrNode(vk, oop); 934 vtptr->load(kit, oop, oop, vk); 935 return vtptr; 936 } | 895 896 // Process users 897 for (DUIterator_Fast imax, i = fast_outs(imax); i < imax; i++) { 898 Node* out = fast_out(i); 899 if (out->isa_ValueType() != NULL) { 900 // Recursively process value type users 901 out->as_ValueType()->remove_redundant_allocations(igvn, phase); 902 } else if (out->isa_Allocate() != NULL) { 903 // Allocate users should be linked 904 assert(out->in(AllocateNode::ValueNode) == this, "should be linked"); 905 } else { 906 #ifdef ASSERT 907 // The value type should not have any other users at this time 908 out->dump(); 909 assert(false, "unexpected user of value type"); 910 #endif 911 } 912 } 913 } 914 915 ValueTypePtrNode* ValueTypePtrNode::make_from_value_type(GraphKit* kit, ValueTypeNode* vt, bool deoptimize_on_exception) { 916 Node* oop = vt->allocate(kit, deoptimize_on_exception)->get_oop(); 917 ValueTypePtrNode* vtptr = new ValueTypePtrNode(vt->value_klass(), oop); 918 for (uint i = Oop+1; i < vt->req(); i++) { 919 vtptr->init_req(i, vt->in(i)); 920 } 921 return kit->gvn().transform(vtptr)->as_ValueTypePtr(); 922 } 923 924 ValueTypePtrNode* ValueTypePtrNode::make_from_call(GraphKit* kit, ciValueKlass* vk, CallNode* call) { 925 ValueTypePtrNode* vtptr = new ValueTypePtrNode(vk, kit->zerocon(T_VALUETYPE)); 926 vtptr->initialize(kit, call, vk); 927 return vtptr; 928 } 929 930 ValueTypePtrNode* ValueTypePtrNode::make_from_oop(GraphKit* kit, Node* oop) { 931 // Create and initialize a ValueTypePtrNode by loading all field 932 // values from a heap-allocated version and also save the oop. 933 ciValueKlass* vk = kit->gvn().type(oop)->value_klass(); 934 ValueTypePtrNode* vtptr = new ValueTypePtrNode(vk, oop); 935 vtptr->load(kit, oop, oop, vk); 936 return kit->gvn().transform(vtptr)->as_ValueTypePtr(); 937 } |