< prev index next >

src/share/vm/opto/stringopts.cpp

Print this page
rev 10595 : [backport] clean up obsolete c2 code
 - barriers are never added on constant oops
 - write barriers are always expanded to IR


1368     }
1369 
1370     kit.set_control(final_merge);
1371     kit.set_memory(final_mem, char_adr_idx);
1372 
1373     C->record_for_igvn(final_merge);
1374     C->record_for_igvn(final_mem);
1375   }
1376 }
1377 
1378 
1379 Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* char_array, Node* start) {
1380   Node* string = str;
1381   Node* offset = kit.load_String_offset(kit.control(), string);
1382   Node* count  = kit.load_String_length(kit.control(), string);
1383   Node* value  = kit.load_String_value (kit.control(), string);
1384 
1385   value = kit.shenandoah_read_barrier(value);
1386 
1387   // copy the contents
1388   assert(!(ShenandoahBarrierNode::skip_through_barrier(value)->is_Con() && !value->is_Con()), "barrier prevents optimization");
1389   if (offset->is_Con() && count->is_Con() && value->is_Con() && count->get_int() < unroll_string_copy_length) {
1390     // For small constant strings just emit individual stores.
1391     // A length of 6 seems like a good space/speed tradeof.
1392     int c = count->get_int();
1393     int o = offset->get_int();
1394     const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr();
1395     ciTypeArray* value_array = t->const_oop()->as_type_array();
1396     for (int e = 0; e < c; e++) {
1397       __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR),
1398                          __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx,
1399                          MemNode::unordered);
1400       start = __ AddI(start, __ intcon(1));
1401     }
1402   } else {
1403     Node* src_ptr = kit.array_element_address(value, offset, T_CHAR);
1404     Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR);
1405     Node* c = count;
1406     Node* extra = NULL;
1407 #ifdef _LP64
1408     c = __ ConvI2L(c);




1368     }
1369 
1370     kit.set_control(final_merge);
1371     kit.set_memory(final_mem, char_adr_idx);
1372 
1373     C->record_for_igvn(final_merge);
1374     C->record_for_igvn(final_mem);
1375   }
1376 }
1377 
1378 
1379 Node* PhaseStringOpts::copy_string(GraphKit& kit, Node* str, Node* char_array, Node* start) {
1380   Node* string = str;
1381   Node* offset = kit.load_String_offset(kit.control(), string);
1382   Node* count  = kit.load_String_length(kit.control(), string);
1383   Node* value  = kit.load_String_value (kit.control(), string);
1384 
1385   value = kit.shenandoah_read_barrier(value);
1386 
1387   // copy the contents

1388   if (offset->is_Con() && count->is_Con() && value->is_Con() && count->get_int() < unroll_string_copy_length) {
1389     // For small constant strings just emit individual stores.
1390     // A length of 6 seems like a good space/speed tradeof.
1391     int c = count->get_int();
1392     int o = offset->get_int();
1393     const TypeOopPtr* t = kit.gvn().type(value)->isa_oopptr();
1394     ciTypeArray* value_array = t->const_oop()->as_type_array();
1395     for (int e = 0; e < c; e++) {
1396       __ store_to_memory(kit.control(), kit.array_element_address(char_array, start, T_CHAR),
1397                          __ intcon(value_array->char_at(o + e)), T_CHAR, char_adr_idx,
1398                          MemNode::unordered);
1399       start = __ AddI(start, __ intcon(1));
1400     }
1401   } else {
1402     Node* src_ptr = kit.array_element_address(value, offset, T_CHAR);
1403     Node* dst_ptr = kit.array_element_address(char_array, start, T_CHAR);
1404     Node* c = count;
1405     Node* extra = NULL;
1406 #ifdef _LP64
1407     c = __ ConvI2L(c);


< prev index next >