Mercurial > hg > truffle
comparison src/share/vm/opto/library_call.cpp @ 12966:b2ee5dc63353
8024070: C2 needs some form of type speculation
Summary: record unused type profile information with type system, propagate and use it.
Reviewed-by: kvn, twisti
author | roland |
---|---|
date | Wed, 23 Oct 2013 12:40:23 +0200 |
parents | 3213ba4d3dff |
children | 59e8ad757e19 |
comparison
equal
deleted
inserted
replaced
12965:8b4bbba322d3 | 12966:b2ee5dc63353 |
---|---|
3351 // Side-effects region with the control path if the klass is null. | 3351 // Side-effects region with the control path if the klass is null. |
3352 Node* kls = load_klass_from_mirror(mirror, never_see_null, region, _prim_path); | 3352 Node* kls = load_klass_from_mirror(mirror, never_see_null, region, _prim_path); |
3353 // If kls is null, we have a primitive mirror. | 3353 // If kls is null, we have a primitive mirror. |
3354 phi->init_req(_prim_path, prim_return_value); | 3354 phi->init_req(_prim_path, prim_return_value); |
3355 if (stopped()) { set_result(region, phi); return true; } | 3355 if (stopped()) { set_result(region, phi); return true; } |
3356 bool safe_for_replace = (region->in(_prim_path) == top()); | |
3356 | 3357 |
3357 Node* p; // handy temp | 3358 Node* p; // handy temp |
3358 Node* null_ctl; | 3359 Node* null_ctl; |
3359 | 3360 |
3360 // Now that we have the non-null klass, we can perform the real query. | 3361 // Now that we have the non-null klass, we can perform the real query. |
3361 // For constant classes, the query will constant-fold in LoadNode::Value. | 3362 // For constant classes, the query will constant-fold in LoadNode::Value. |
3362 Node* query_value = top(); | 3363 Node* query_value = top(); |
3363 switch (id) { | 3364 switch (id) { |
3364 case vmIntrinsics::_isInstance: | 3365 case vmIntrinsics::_isInstance: |
3365 // nothing is an instance of a primitive type | 3366 // nothing is an instance of a primitive type |
3366 query_value = gen_instanceof(obj, kls); | 3367 query_value = gen_instanceof(obj, kls, safe_for_replace); |
3367 break; | 3368 break; |
3368 | 3369 |
3369 case vmIntrinsics::_getModifiers: | 3370 case vmIntrinsics::_getModifiers: |
3370 p = basic_plus_adr(kls, in_bytes(Klass::modifier_flags_offset())); | 3371 p = basic_plus_adr(kls, in_bytes(Klass::modifier_flags_offset())); |
3371 query_value = make_load(NULL, p, TypeInt::INT, T_INT); | 3372 query_value = make_load(NULL, p, TypeInt::INT, T_INT); |
4551 // (1) src and dest are arrays. | 4552 // (1) src and dest are arrays. |
4552 const Type* src_type = src->Value(&_gvn); | 4553 const Type* src_type = src->Value(&_gvn); |
4553 const Type* dest_type = dest->Value(&_gvn); | 4554 const Type* dest_type = dest->Value(&_gvn); |
4554 const TypeAryPtr* top_src = src_type->isa_aryptr(); | 4555 const TypeAryPtr* top_src = src_type->isa_aryptr(); |
4555 const TypeAryPtr* top_dest = dest_type->isa_aryptr(); | 4556 const TypeAryPtr* top_dest = dest_type->isa_aryptr(); |
4556 if (top_src == NULL || top_src->klass() == NULL || | 4557 |
4557 top_dest == NULL || top_dest->klass() == NULL) { | 4558 // Do we have the type of src? |
4559 bool has_src = (top_src != NULL && top_src->klass() != NULL); | |
4560 // Do we have the type of dest? | |
4561 bool has_dest = (top_dest != NULL && top_dest->klass() != NULL); | |
4562 // Is the type for src from speculation? | |
4563 bool src_spec = false; | |
4564 // Is the type for dest from speculation? | |
4565 bool dest_spec = false; | |
4566 | |
4567 if (!has_src || !has_dest) { | |
4568 // We don't have sufficient type information, let's see if | |
4569 // speculative types can help. We need to have types for both src | |
4570 // and dest so that it pays off. | |
4571 | |
4572 // Do we already have or could we have type information for src | |
4573 bool could_have_src = has_src; | |
4574 // Do we already have or could we have type information for dest | |
4575 bool could_have_dest = has_dest; | |
4576 | |
4577 ciKlass* src_k = NULL; | |
4578 if (!has_src) { | |
4579 src_k = src_type->speculative_type(); | |
4580 if (src_k != NULL && src_k->is_array_klass()) { | |
4581 could_have_src = true; | |
4582 } | |
4583 } | |
4584 | |
4585 ciKlass* dest_k = NULL; | |
4586 if (!has_dest) { | |
4587 dest_k = dest_type->speculative_type(); | |
4588 if (dest_k != NULL && dest_k->is_array_klass()) { | |
4589 could_have_dest = true; | |
4590 } | |
4591 } | |
4592 | |
4593 if (could_have_src && could_have_dest) { | |
4594 // This is going to pay off so emit the required guards | |
4595 if (!has_src) { | |
4596 src = maybe_cast_profiled_obj(src, src_k); | |
4597 src_type = _gvn.type(src); | |
4598 top_src = src_type->isa_aryptr(); | |
4599 has_src = (top_src != NULL && top_src->klass() != NULL); | |
4600 src_spec = true; | |
4601 } | |
4602 if (!has_dest) { | |
4603 dest = maybe_cast_profiled_obj(dest, dest_k); | |
4604 dest_type = _gvn.type(dest); | |
4605 top_dest = dest_type->isa_aryptr(); | |
4606 has_dest = (top_dest != NULL && top_dest->klass() != NULL); | |
4607 dest_spec = true; | |
4608 } | |
4609 } | |
4610 } | |
4611 | |
4612 if (!has_src || !has_dest) { | |
4558 // Conservatively insert a memory barrier on all memory slices. | 4613 // Conservatively insert a memory barrier on all memory slices. |
4559 // Do not let writes into the source float below the arraycopy. | 4614 // Do not let writes into the source float below the arraycopy. |
4560 insert_mem_bar(Op_MemBarCPUOrder); | 4615 insert_mem_bar(Op_MemBarCPUOrder); |
4561 | 4616 |
4562 // Call StubRoutines::generic_arraycopy stub. | 4617 // Call StubRoutines::generic_arraycopy stub. |
4585 // (But, avoid the native method wrapper to JVM_ArrayCopy.) | 4640 // (But, avoid the native method wrapper to JVM_ArrayCopy.) |
4586 generate_slow_arraycopy(TypePtr::BOTTOM, | 4641 generate_slow_arraycopy(TypePtr::BOTTOM, |
4587 src, src_offset, dest, dest_offset, length, | 4642 src, src_offset, dest, dest_offset, length, |
4588 /*dest_uninitialized*/false); | 4643 /*dest_uninitialized*/false); |
4589 return true; | 4644 return true; |
4645 } | |
4646 | |
4647 if (src_elem == T_OBJECT) { | |
4648 // If both arrays are object arrays then having the exact types | |
4649 // for both will remove the need for a subtype check at runtime | |
4650 // before the call and may make it possible to pick a faster copy | |
4651 // routine (without a subtype check on every element) | |
4652 // Do we have the exact type of src? | |
4653 bool could_have_src = src_spec; | |
4654 // Do we have the exact type of dest? | |
4655 bool could_have_dest = dest_spec; | |
4656 ciKlass* src_k = top_src->klass(); | |
4657 ciKlass* dest_k = top_dest->klass(); | |
4658 if (!src_spec) { | |
4659 src_k = src_type->speculative_type(); | |
4660 if (src_k != NULL && src_k->is_array_klass()) { | |
4661 could_have_src = true; | |
4662 } | |
4663 } | |
4664 if (!dest_spec) { | |
4665 dest_k = dest_type->speculative_type(); | |
4666 if (dest_k != NULL && dest_k->is_array_klass()) { | |
4667 could_have_dest = true; | |
4668 } | |
4669 } | |
4670 if (could_have_src && could_have_dest) { | |
4671 // If we can have both exact types, emit the missing guards | |
4672 if (could_have_src && !src_spec) { | |
4673 src = maybe_cast_profiled_obj(src, src_k); | |
4674 } | |
4675 if (could_have_dest && !dest_spec) { | |
4676 dest = maybe_cast_profiled_obj(dest, dest_k); | |
4677 } | |
4678 } | |
4590 } | 4679 } |
4591 | 4680 |
4592 //--------------------------------------------------------------------------- | 4681 //--------------------------------------------------------------------------- |
4593 // We will make a fast path for this call to arraycopy. | 4682 // We will make a fast path for this call to arraycopy. |
4594 | 4683 |