< prev index next >
src/share/vm/opto/valuetypenode.hpp
Print this page
@@ -46,10 +46,13 @@
virtual const TypeValueTypePtr* value_type_ptr() const = 0;
// Get the klass defining the field layout of the value type
virtual ciValueKlass* value_klass() const = 0;
int make_scalar_in_safepoint(SafePointNode* sfpt, Node* root, PhaseGVN* gvn);
+
+ static void make(PhaseGVN* gvn, Node* n, ValueTypeBaseNode* vt, ciValueKlass* base_vk, int base_offset, int base_input, bool in);
+
public:
// Support for control flow merges
bool has_phi_inputs(Node* region);
ValueTypeBaseNode* clone_with_phis(PhaseGVN* gvn, Node* region);
ValueTypeBaseNode* merge_with(PhaseGVN* gvn, const ValueTypeBaseNode* other, int pnum, bool transform);
@@ -66,10 +69,18 @@
int field_offset(uint index) const;
ciType* field_type(uint index) const;
// Replace ValueTypeNodes in debug info at safepoints with SafePointScalarObjectNodes
void make_scalar_in_safepoints(Node* root, PhaseGVN* gvn);
+
+ void store_flattened(PhaseGVN* gvn, Node* ctl, MergeMemNode* mem, Node* base, ciValueKlass* holder, int holder_offset) const;
+ void store(PhaseGVN* gvn, Node* ctl, MergeMemNode* mem, Node* base, ciValueKlass* holder = NULL, int holder_offset = 0) const;
+
+ // Initialize the value type by loading its field values from memory
+ void load(PhaseGVN& gvn, Node* mem, Node* base, Node* ptr, ciInstanceKlass* holder, int holder_offset = 0);
+
+ void replace_call_results(Node* call, Compile* C);
};
//------------------------------ValueTypeNode-------------------------------------
// Node representing a value type in C2 IR
class ValueTypeNode : public ValueTypeBaseNode {
@@ -85,12 +96,10 @@
: ValueTypeBaseNode(t, Values + field_count) {
init_class_id(Class_ValueType);
init_req(Oop, oop);
}
- // Initialize the value type by loading its field values from memory
- void load(PhaseGVN& gvn, Node* mem, Node* base, Node* ptr, ciInstanceKlass* holder, int holder_offset = 0);
// Checks if the value type is loaded from memory and if so returns the oop
Node* is_loaded(PhaseGVN* phase, const TypeValueType* t, Node* base = NULL, int holder_offset = 0);
const TypeValueTypePtr* value_type_ptr() const { return TypeValueTypePtr::make(bottom_type()->isa_valuetype()); }
// Get the klass defining the field layout of the value type
@@ -103,11 +112,12 @@
static Node* make_default(PhaseGVN& gvn, ciValueKlass* vk);
// Create a new ValueTypeNode and load its values from an oop
static Node* make(PhaseGVN& gvn, Node* mem, Node* oop);
// Create a new ValueTypeNode and load its values from a flattened value type field or array
static Node* make(PhaseGVN& gvn, ciValueKlass* vk, Node* mem, Node* obj, Node* ptr, ciInstanceKlass* holder = NULL, int holder_offset = 0);
-
+ // Create value type node from arguments at method entry and calls
+ static Node* make(PhaseGVN& gvn, Node* n, ciValueKlass* vk, int base_input, bool in);
// Store the value type as a flattened (headerless) representation
void store_flattened(GraphKit* kit, Node* base, Node* ptr, ciInstanceKlass* holder = NULL, int holder_offset = 0) const;
// Store the field values to memory
void store(GraphKit* kit, Node* base, Node* ptr, ciInstanceKlass* holder, int holder_offset = 0) const;
@@ -116,11 +126,10 @@
Node* allocate(GraphKit* kit);
bool is_allocated(PhaseGVN* phase) const;
void pass_klass(Node* n, uint pos, const GraphKit& kit);
uint pass_fields(Node* call, int base_input, const GraphKit& kit, ciValueKlass* base_vk = NULL, int base_offset = 0);
- void replace_call_results(Node* call, Compile* C);
// Allocation optimizations
void remove_redundant_allocations(PhaseIterGVN* igvn, PhaseIdealLoop* phase);
virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
@@ -135,10 +144,16 @@
// Node representing a value type as a pointer in C2 IR
class ValueTypePtrNode : public ValueTypeBaseNode {
private:
ciValueKlass* value_klass() const { return type()->is_valuetypeptr()->value_type()->value_klass(); }
const TypeValueTypePtr* value_type_ptr() const { return bottom_type()->isa_valuetypeptr(); }
+
+ ValueTypePtrNode(ciValueKlass* vk, Compile* C)
+ : ValueTypeBaseNode(TypeValueTypePtr::make(TypePtr::NotNull, vk), Values + vk->nof_declared_nonstatic_fields()) {
+ init_class_id(Class_ValueTypePtr);
+ C->add_value_type_ptr(this);
+ }
public:
ValueTypePtrNode(ValueTypeNode* vt, Node* oop, Compile* C)
: ValueTypeBaseNode(TypeValueTypePtr::make(vt->type()->is_valuetype())->cast_to_ptr_type(TypePtr::NotNull), vt->req()) {
init_class_id(Class_ValueTypePtr);
@@ -147,9 +162,11 @@
}
init_req(Oop, oop);
C->add_value_type_ptr(this);
}
+ static ValueTypePtrNode* make(PhaseGVN* gvn, CheckCastPPNode* cast);
+ static ValueTypePtrNode* make(PhaseGVN& gvn, Node* mem, Node* oop);
virtual int Opcode() const;
};
#endif // SHARE_VM_OPTO_VALUETYPENODE_HPP
< prev index next >