< prev index next >

src/share/vm/opto/valuetypenode.hpp

Print this page

        

@@ -28,45 +28,60 @@
 #include "opto/node.hpp"
 #include "opto/connode.hpp"
 
 class GraphKit;
 
-// TODO add comment
+//------------------------------ValueTypeNode-------------------------------------
+// Node representing a value type in C2 IR
 class ValueTypeNode : public TypeNode {
 private:
   ValueTypeNode(const TypeValueType* t, Node* oop)
-    : TypeNode(t, Values + t->value_klass()->field_count()) {
+    : TypeNode(t, Values + t->value_klass()->param_count()) {
     init_class_id(Class_ValueType);
     init_req(Oop, oop);
   }
+
+  // Get the klass defining the field layout of the value type
   ciValueKlass* get_value_klass() const { return type()->is_valuetype()->value_klass(); }
+  // Initialize the value type by loading its field values from memory
+  void load_values(PhaseGVN& gvn, Node* mem, ciInstanceKlass* holder, Node* base, int base_offset = 0);
+  // Store the field values to memory
+  void store_values(GraphKit* kit, ciInstanceKlass* holder, Node* base, int base_offset = 0) const;
 
   enum { Control,   // Control input
          Oop,       // Oop of TypeValueTypePtr
          Values     // Nodes corresponding to field values
   };
 
 public:
   // Create a new ValueTypeNode with uninitialized values
   static Node* make(PhaseGVN& gvn, ciValueKlass* klass);
-  // Create a new ValueTypeNode and load its values from memory
+  // 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
+  static Node* make(PhaseGVN& gvn, ciValueKlass* klass, Node* mem, ciInstanceKlass* holder, Node* obj, int field_offset);
+
+  // Support for control flow merges
+  ValueTypeNode* clone_with_phis(PhaseGVN& gvn, Node* region);
+  Node* merge_with(GraphKit* kit, const ValueTypeNode* other, int pnum);
 
-  // Stores the value type to memory if not yet allocated and returns the oop
+  // Store the value type to memory if not yet allocated and returns the oop
   Node* store_to_memory(GraphKit* kit);
+  // Store the value type in a field of an object
+  void store_to_field(GraphKit* kit, ciInstanceKlass* holder, Node* obj, int field_offset) const;
 
   // Get oop for heap allocated value type (may be TypePtr::NULL_PTR)
   Node* get_oop() const    { return in(Oop); }
   void  set_oop(Node* oop) { set_req(Oop, oop); }
 
   // Value type fields
   uint      field_count() const { return req() - Values; }
   Node*     get_field_value(uint index) const;
-  Node*     get_field_value_by_offset(int field_offset) const;
+  Node*     get_field_value_by_offset(int offset, bool recursive = false) const;
   void      set_field_value(uint index, Node* value);
   int       get_field_offset(uint index) const;
-  BasicType get_field_type(uint index) const;
+  ciType*   get_field_type(uint index) const;
 
   // Replace ValueTypeNodes in debug info at safepoints with SafePointScalarObjectNodes
   void make_scalar_in_safepoints(Compile* C);
 
   virtual Node* Ideal(PhaseGVN* phase, bool can_reshape);
< prev index next >