1177 return conn_graph->add_final_edges_unsafe_access(n, opcode);
1178 case Op_ShenandoahEnqueueBarrier:
1179 conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(1), NULL);
1180 return true;
1181 case Op_ShenandoahLoadReferenceBarrier:
1182 conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(ShenandoahLoadReferenceBarrierNode::ValueIn), NULL);
1183 return true;
1184 default:
1185 // Nothing
1186 break;
1187 }
1188 return false;
1189 }
1190
1191 bool ShenandoahBarrierSetC2::escape_has_out_with_unsafe_object(Node* n) const {
1192 return n->has_out_with(Op_ShenandoahCompareAndExchangeP) || n->has_out_with(Op_ShenandoahCompareAndExchangeN) ||
1193 n->has_out_with(Op_ShenandoahCompareAndSwapP, Op_ShenandoahCompareAndSwapN, Op_ShenandoahWeakCompareAndSwapP, Op_ShenandoahWeakCompareAndSwapN);
1194
1195 }
1196
1197 bool ShenandoahBarrierSetC2::escape_is_barrier_node(Node* n) const {
1198 return n->Opcode() == Op_ShenandoahLoadReferenceBarrier;
1199 }
1200
1201 bool ShenandoahBarrierSetC2::matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const {
1202 switch (opcode) {
1203 case Op_ShenandoahCompareAndExchangeP:
1204 case Op_ShenandoahCompareAndExchangeN:
1205 case Op_ShenandoahWeakCompareAndSwapP:
1206 case Op_ShenandoahWeakCompareAndSwapN:
1207 case Op_ShenandoahCompareAndSwapP:
1208 case Op_ShenandoahCompareAndSwapN: { // Convert trinary to binary-tree
1209 Node* newval = n->in(MemNode::ValueIn);
1210 Node* oldval = n->in(LoadStoreConditionalNode::ExpectedIn);
1211 Node* pair = new BinaryNode(oldval, newval);
1212 n->set_req(MemNode::ValueIn,pair);
1213 n->del_req(LoadStoreConditionalNode::ExpectedIn);
1214 return true;
1215 }
1216 default:
1217 break;
1218 }
1219 return false;
1220 }
|
1177 return conn_graph->add_final_edges_unsafe_access(n, opcode);
1178 case Op_ShenandoahEnqueueBarrier:
1179 conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(1), NULL);
1180 return true;
1181 case Op_ShenandoahLoadReferenceBarrier:
1182 conn_graph->add_local_var_and_edge(n, PointsToNode::NoEscape, n->in(ShenandoahLoadReferenceBarrierNode::ValueIn), NULL);
1183 return true;
1184 default:
1185 // Nothing
1186 break;
1187 }
1188 return false;
1189 }
1190
1191 bool ShenandoahBarrierSetC2::escape_has_out_with_unsafe_object(Node* n) const {
1192 return n->has_out_with(Op_ShenandoahCompareAndExchangeP) || n->has_out_with(Op_ShenandoahCompareAndExchangeN) ||
1193 n->has_out_with(Op_ShenandoahCompareAndSwapP, Op_ShenandoahCompareAndSwapN, Op_ShenandoahWeakCompareAndSwapP, Op_ShenandoahWeakCompareAndSwapN);
1194
1195 }
1196
1197 bool ShenandoahBarrierSetC2::matcher_find_shared_post_visit(Matcher* matcher, Node* n, uint opcode) const {
1198 switch (opcode) {
1199 case Op_ShenandoahCompareAndExchangeP:
1200 case Op_ShenandoahCompareAndExchangeN:
1201 case Op_ShenandoahWeakCompareAndSwapP:
1202 case Op_ShenandoahWeakCompareAndSwapN:
1203 case Op_ShenandoahCompareAndSwapP:
1204 case Op_ShenandoahCompareAndSwapN: { // Convert trinary to binary-tree
1205 Node* newval = n->in(MemNode::ValueIn);
1206 Node* oldval = n->in(LoadStoreConditionalNode::ExpectedIn);
1207 Node* pair = new BinaryNode(oldval, newval);
1208 n->set_req(MemNode::ValueIn,pair);
1209 n->del_req(LoadStoreConditionalNode::ExpectedIn);
1210 return true;
1211 }
1212 default:
1213 break;
1214 }
1215 return false;
1216 }
|