comparison src/share/vm/opto/stringopts.cpp @ 14429:2113136690bc

8024921: PPC64 (part 113): Extend Load and Store nodes to know about memory ordering Summary: Add a field to C2 LoadNode and StoreNode classes which indicates whether the load/store should do an acquire/release on platforms which support it. Reviewed-by: kvn
author goetz
date Fri, 15 Nov 2013 11:05:32 -0800
parents 90abdd727e64
children 4ca6dc0799b6
comparison
equal deleted inserted replaced
14427:eb178e97560c 14429:2113136690bc
1120 type = Type::get_const_basic_type(bt); 1120 type = Type::get_const_basic_type(bt);
1121 } 1121 }
1122 1122
1123 return kit.make_load(NULL, kit.basic_plus_adr(klass_node, field->offset_in_bytes()), 1123 return kit.make_load(NULL, kit.basic_plus_adr(klass_node, field->offset_in_bytes()),
1124 type, T_OBJECT, 1124 type, T_OBJECT,
1125 C->get_alias_index(mirror_type->add_offset(field->offset_in_bytes()))); 1125 C->get_alias_index(mirror_type->add_offset(field->offset_in_bytes())),
1126 MemNode::unordered);
1126 } 1127 }
1127 1128
1128 Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) { 1129 Node* PhaseStringOpts::int_stringSize(GraphKit& kit, Node* arg) {
1129 RegionNode *final_merge = new (C) RegionNode(3); 1130 RegionNode *final_merge = new (C) RegionNode(3);
1130 kit.gvn().set_type(final_merge, Type::CONTROL); 1131 kit.gvn().set_type(final_merge, Type::CONTROL);
1312 __ LShiftI(q, __ intcon(1)))); 1313 __ LShiftI(q, __ intcon(1))));
1313 Node* m1 = __ SubI(charPos, __ intcon(1)); 1314 Node* m1 = __ SubI(charPos, __ intcon(1));
1314 Node* ch = __ AddI(r, __ intcon('0')); 1315 Node* ch = __ AddI(r, __ intcon('0'));
1315 1316
1316 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), 1317 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR),
1317 ch, T_CHAR, char_adr_idx); 1318 ch, T_CHAR, char_adr_idx, MemNode::unordered);
1318 1319
1319 1320
1320 IfNode* iff = kit.create_and_map_if(head, __ Bool(__ CmpI(q, __ intcon(0)), BoolTest::ne), 1321 IfNode* iff = kit.create_and_map_if(head, __ Bool(__ CmpI(q, __ intcon(0)), BoolTest::ne),
1321 PROB_FAIR, COUNT_UNKNOWN); 1322 PROB_FAIR, COUNT_UNKNOWN);
1322 Node* ne = __ IfTrue(iff); 1323 Node* ne = __ IfTrue(iff);
1354 final_merge->init_req(1, C->top()); 1355 final_merge->init_req(1, C->top());
1355 final_mem->init_req(1, C->top()); 1356 final_mem->init_req(1, C->top());
1356 } else { 1357 } else {
1357 Node* m1 = __ SubI(charPos, __ intcon(1)); 1358 Node* m1 = __ SubI(charPos, __ intcon(1));
1358 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR), 1359 Node* st = __ store_to_memory(kit.control(), kit.array_element_address(char_array, m1, T_CHAR),
1359 sign, T_CHAR, char_adr_idx); 1360 sign, T_CHAR, char_adr_idx, MemNode::unordered);
1360 1361
1361 final_merge->init_req(1, kit.control()); 1362 final_merge->init_req(1, kit.control());
1362 final_mem->init_req(1, st); 1363 final_mem->init_req(1, st);
1363 } 1364 }
1364 1365
1385 int o = offset->get_int(); 1386 int o = offset->get_int();
1386 const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr(); 1387 const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr();
1387 ciTypeArray* value_array = t->const_oop()->as_type_array(); 1388 ciTypeArray* value_array = t->const_oop()->as_type_array();
1388 for (int e = 0; e < c; e++) { 1389 for (int e = 0; e < c; e++) {
1389 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), 1390 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR),
1390 __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx); 1391 __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx,
1392 MemNode::unordered);
1391 start = __ AddI(start, __ intcon(1)); 1393 start = __ AddI(start, __ intcon(1));
1392 } 1394 }
1393 } else { 1395 } else {
1394 Node* src_ptr = kit.array_element_address(value, offset, T_CHAR); 1396 Node* src_ptr = kit.array_element_address(value, offset, T_CHAR);
1395 Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR); 1397 Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR);
1605 start = copy_string(kit, arg, char_array, start); 1607 start = copy_string(kit, arg, char_array, start);
1606 break; 1608 break;
1607 } 1609 }
1608 case StringConcat::CharMode: { 1610 case StringConcat::CharMode: {
1609 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR), 1611 __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR),
1610 arg, T_CHAR, char_adr_idx); 1612 arg, T_CHAR, char_adr_idx, MemNode::unordered);
1611 start = __ AddI(start, __ intcon(1)); 1613 start = __ AddI(start, __ intcon(1));
1612 break; 1614 break;
1613 } 1615 }
1614 default: 1616 default:
1615 ShouldNotReachHere(); 1617 ShouldNotReachHere();