973
974 // Return true if allocation doesn't escape thread, its escape state
975 // needs be noEscape or ArgEscape. InitializeNode._does_not_escape
976 // is true when its allocation's escape state is noEscape or
977 // ArgEscape. In case allocation's InitializeNode is NULL, check
978 // AlllocateNode._is_non_escaping flag.
979 // AlllocateNode._is_non_escaping is true when its escape state is
980 // noEscape.
981 bool does_not_escape_thread() {
982 InitializeNode* init = NULL;
983 return _is_non_escaping || (((init = initialization()) != NULL) && init->does_not_escape());
984 }
985
986 // If object doesn't escape in <.init> method and there is memory barrier
987 // inserted at exit of its <.init>, memory barrier for new is not necessary.
988 // Inovke this method when MemBar at exit of initializer and post-dominate
989 // allocation node.
990 void compute_MemBar_redundancy(ciMethod* initializer);
991 bool is_allocation_MemBar_redundant() { return _is_allocation_MemBar_redundant; }
992
993 Node* make_ideal_mark(PhaseGVN *phase, Node* obj, Node* control, Node* mem);
994 };
995
996 //------------------------------AllocateArray---------------------------------
997 //
998 // High-level array allocation
999 //
1000 class AllocateArrayNode : public AllocateNode {
1001 public:
1002 AllocateArrayNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio,
1003 Node* size, Node* klass_node, Node* initial_test,
1004 Node* count_val, Node* default_value, Node* raw_default_value, Node* storage_properties)
1005 : AllocateNode(C, atype, ctrl, mem, abio, size, klass_node, initial_test)
1006 {
1007 init_class_id(Class_AllocateArray);
1008 set_req(AllocateNode::ALength, count_val);
1009 init_req(AllocateNode::DefaultValue, default_value);
1010 init_req(AllocateNode::RawDefaultValue, raw_default_value);
1011 init_req(AllocateNode::StorageProperties, storage_properties);
1012 }
1013 virtual int Opcode() const;
|
973
974 // Return true if allocation doesn't escape thread, its escape state
975 // needs be noEscape or ArgEscape. InitializeNode._does_not_escape
976 // is true when its allocation's escape state is noEscape or
977 // ArgEscape. In case allocation's InitializeNode is NULL, check
978 // AlllocateNode._is_non_escaping flag.
979 // AlllocateNode._is_non_escaping is true when its escape state is
980 // noEscape.
981 bool does_not_escape_thread() {
982 InitializeNode* init = NULL;
983 return _is_non_escaping || (((init = initialization()) != NULL) && init->does_not_escape());
984 }
985
986 // If object doesn't escape in <.init> method and there is memory barrier
987 // inserted at exit of its <.init>, memory barrier for new is not necessary.
988 // Inovke this method when MemBar at exit of initializer and post-dominate
989 // allocation node.
990 void compute_MemBar_redundancy(ciMethod* initializer);
991 bool is_allocation_MemBar_redundant() { return _is_allocation_MemBar_redundant; }
992
993 Node* make_ideal_mark(PhaseGVN* phase, Node* control, Node* mem);
994 };
995
996 //------------------------------AllocateArray---------------------------------
997 //
998 // High-level array allocation
999 //
1000 class AllocateArrayNode : public AllocateNode {
1001 public:
1002 AllocateArrayNode(Compile* C, const TypeFunc *atype, Node *ctrl, Node *mem, Node *abio,
1003 Node* size, Node* klass_node, Node* initial_test,
1004 Node* count_val, Node* default_value, Node* raw_default_value, Node* storage_properties)
1005 : AllocateNode(C, atype, ctrl, mem, abio, size, klass_node, initial_test)
1006 {
1007 init_class_id(Class_AllocateArray);
1008 set_req(AllocateNode::ALength, count_val);
1009 init_req(AllocateNode::DefaultValue, default_value);
1010 init_req(AllocateNode::RawDefaultValue, raw_default_value);
1011 init_req(AllocateNode::StorageProperties, storage_properties);
1012 }
1013 virtual int Opcode() const;
|