122 BasicType type() const { return _type; } 123 bool is_oop() const { return _type == T_OBJECT || _type == T_VALUETYPE || _type == T_ARRAY; } 124 bool is_raw() const { return (_decorators & AS_RAW) != 0; } 125 Node* raw_access() const { return _raw_access; } 126 127 void set_raw_access(Node* raw_access) { _raw_access = raw_access; } 128 virtual void set_memory() {} // no-op for normal accesses, but not for atomic accesses. 129 130 MemNode::MemOrd mem_node_mo() const; 131 bool needs_cpu_membar() const; 132 133 virtual PhaseGVN& gvn() const = 0; 134 virtual bool is_parse_access() const { return false; } 135 virtual bool is_opt_access() const { return false; } 136 }; 137 138 // C2Access for parse time calls to the BarrierSetC2 backend. 139 class C2ParseAccess: public C2Access { 140 protected: 141 GraphKit* _kit; 142 143 void* barrier_set_state() const; 144 145 public: 146 C2ParseAccess(GraphKit* kit, DecoratorSet decorators, 147 BasicType type, Node* base, C2AccessValuePtr& addr) : 148 C2Access(decorators, type, base, addr), 149 _kit(kit) { 150 fixup_decorators(); 151 } 152 153 GraphKit* kit() const { return _kit; } 154 155 template <typename T> 156 T barrier_set_state_as() const { 157 return reinterpret_cast<T>(barrier_set_state()); 158 } 159 160 virtual PhaseGVN& gvn() const; 161 virtual bool is_parse_access() const { return true; } 162 }; 163 164 // This class wraps a bunch of context parameters thare are passed around in the 165 // BarrierSetC2 backend hierarchy, for atomic accesses, to reduce boiler plate. 166 class C2AtomicParseAccess: public C2ParseAccess { 167 Node* _memory; 168 uint _alias_idx; 169 bool _needs_pinning; 170 171 public: 172 C2AtomicParseAccess(GraphKit* kit, DecoratorSet decorators, BasicType type, 173 Node* base, C2AccessValuePtr& addr, uint alias_idx) : | 122 BasicType type() const { return _type; } 123 bool is_oop() const { return _type == T_OBJECT || _type == T_VALUETYPE || _type == T_ARRAY; } 124 bool is_raw() const { return (_decorators & AS_RAW) != 0; } 125 Node* raw_access() const { return _raw_access; } 126 127 void set_raw_access(Node* raw_access) { _raw_access = raw_access; } 128 virtual void set_memory() {} // no-op for normal accesses, but not for atomic accesses. 129 130 MemNode::MemOrd mem_node_mo() const; 131 bool needs_cpu_membar() const; 132 133 virtual PhaseGVN& gvn() const = 0; 134 virtual bool is_parse_access() const { return false; } 135 virtual bool is_opt_access() const { return false; } 136 }; 137 138 // C2Access for parse time calls to the BarrierSetC2 backend. 139 class C2ParseAccess: public C2Access { 140 protected: 141 GraphKit* _kit; 142 Node* _ctl; 143 144 void* barrier_set_state() const; 145 146 public: 147 C2ParseAccess(GraphKit* kit, DecoratorSet decorators, 148 BasicType type, Node* base, C2AccessValuePtr& addr, 149 Node* ctl = NULL) : 150 C2Access(decorators, type, base, addr), 151 _kit(kit), 152 _ctl(ctl) { 153 fixup_decorators(); 154 } 155 156 GraphKit* kit() const { return _kit; } 157 Node* control() const; 158 159 template <typename T> 160 T barrier_set_state_as() const { 161 return reinterpret_cast<T>(barrier_set_state()); 162 } 163 164 virtual PhaseGVN& gvn() const; 165 virtual bool is_parse_access() const { return true; } 166 }; 167 168 // This class wraps a bunch of context parameters thare are passed around in the 169 // BarrierSetC2 backend hierarchy, for atomic accesses, to reduce boiler plate. 170 class C2AtomicParseAccess: public C2ParseAccess { 171 Node* _memory; 172 uint _alias_idx; 173 bool _needs_pinning; 174 175 public: 176 C2AtomicParseAccess(GraphKit* kit, DecoratorSet decorators, BasicType type, 177 Node* base, C2AccessValuePtr& addr, uint alias_idx) : |