Mercurial > hg > graal-compiler
comparison src/share/vm/c1/c1_LIRGenerator.cpp @ 13078:e6ba215af802
8027631: "unexpected profiling mismatch" error with new type profiling
Summary: inlined method handle calls can call methods with different signatures
Reviewed-by: kvn, iveresov
author | roland |
---|---|
date | Wed, 13 Nov 2013 09:45:58 +0100 |
parents | 9acbfe04b5c3 |
children | 096c224171c4 8cdf3f43f63e |
comparison
equal
deleted
inserted
replaced
13075:144b23411b51 | 13078:e6ba215af802 |
---|---|
2572 move_to_phi(x->state()); | 2572 move_to_phi(x->state()); |
2573 | 2573 |
2574 __ jump(x->default_sux()); | 2574 __ jump(x->default_sux()); |
2575 } | 2575 } |
2576 | 2576 |
2577 | 2577 /** |
2578 ciKlass* LIRGenerator::profile_arg_type(ciMethodData* md, int md_base_offset, int md_offset, intptr_t profiled_k, Value arg, LIR_Opr& mdp, bool not_null, ciKlass* signature_k) { | 2578 * Emit profiling code if needed for arguments, parameters, return value types |
2579 * | |
2580 * @param md MDO the code will update at runtime | |
2581 * @param md_base_offset common offset in the MDO for this profile and subsequent ones | |
2582 * @param md_offset offset in the MDO (on top of md_base_offset) for this profile | |
2583 * @param profiled_k current profile | |
2584 * @param obj IR node for the object to be profiled | |
2585 * @param mdp register to hold the pointer inside the MDO (md + md_base_offset). | |
2586 * Set once we find an update to make and use for next ones. | |
2587 * @param not_null true if we know obj cannot be null | |
2588 * @param signature_at_call_k signature at call for obj | |
2589 * @param callee_signature_k signature of callee for obj | |
2590 * at call and callee signatures differ at method handle call | |
2591 * @return the only klass we know will ever be seen at this profile point | |
2592 */ | |
2593 ciKlass* LIRGenerator::profile_type(ciMethodData* md, int md_base_offset, int md_offset, intptr_t profiled_k, | |
2594 Value obj, LIR_Opr& mdp, bool not_null, ciKlass* signature_at_call_k, | |
2595 ciKlass* callee_signature_k) { | |
2579 ciKlass* result = NULL; | 2596 ciKlass* result = NULL; |
2580 bool do_null = !not_null && !TypeEntries::was_null_seen(profiled_k); | 2597 bool do_null = !not_null && !TypeEntries::was_null_seen(profiled_k); |
2581 bool do_update = !TypeEntries::is_type_unknown(profiled_k); | 2598 bool do_update = !TypeEntries::is_type_unknown(profiled_k); |
2582 // known not to be null or null bit already set and already set to | 2599 // known not to be null or null bit already set and already set to |
2583 // unknown: nothing we can do to improve profiling | 2600 // unknown: nothing we can do to improve profiling |
2588 ciKlass* exact_klass = NULL; | 2605 ciKlass* exact_klass = NULL; |
2589 Compilation* comp = Compilation::current(); | 2606 Compilation* comp = Compilation::current(); |
2590 if (do_update) { | 2607 if (do_update) { |
2591 // try to find exact type, using CHA if possible, so that loading | 2608 // try to find exact type, using CHA if possible, so that loading |
2592 // the klass from the object can be avoided | 2609 // the klass from the object can be avoided |
2593 ciType* type = arg->exact_type(); | 2610 ciType* type = obj->exact_type(); |
2594 if (type == NULL) { | 2611 if (type == NULL) { |
2595 type = arg->declared_type(); | 2612 type = obj->declared_type(); |
2596 type = comp->cha_exact_type(type); | 2613 type = comp->cha_exact_type(type); |
2597 } | 2614 } |
2598 assert(type == NULL || type->is_klass(), "type should be class"); | 2615 assert(type == NULL || type->is_klass(), "type should be class"); |
2599 exact_klass = (type != NULL && type->is_loaded()) ? (ciKlass*)type : NULL; | 2616 exact_klass = (type != NULL && type->is_loaded()) ? (ciKlass*)type : NULL; |
2600 | 2617 |
2606 } | 2623 } |
2607 | 2624 |
2608 ciKlass* exact_signature_k = NULL; | 2625 ciKlass* exact_signature_k = NULL; |
2609 if (do_update) { | 2626 if (do_update) { |
2610 // Is the type from the signature exact (the only one possible)? | 2627 // Is the type from the signature exact (the only one possible)? |
2611 exact_signature_k = signature_k->exact_klass(); | 2628 exact_signature_k = signature_at_call_k->exact_klass(); |
2612 if (exact_signature_k == NULL) { | 2629 if (exact_signature_k == NULL) { |
2613 exact_signature_k = comp->cha_exact_type(signature_k); | 2630 exact_signature_k = comp->cha_exact_type(signature_at_call_k); |
2614 } else { | 2631 } else { |
2615 result = exact_signature_k; | 2632 result = exact_signature_k; |
2616 do_update = false; | |
2617 // Known statically. No need to emit any code: prevent | 2633 // Known statically. No need to emit any code: prevent |
2618 // LIR_Assembler::emit_profile_type() from emitting useless code | 2634 // LIR_Assembler::emit_profile_type() from emitting useless code |
2619 profiled_k = ciTypeEntries::with_status(result, profiled_k); | 2635 profiled_k = ciTypeEntries::with_status(result, profiled_k); |
2620 } | 2636 } |
2621 if (exact_signature_k != NULL && exact_klass != exact_signature_k) { | 2637 if (exact_signature_k != NULL && exact_klass != exact_signature_k) { |
2622 assert(exact_klass == NULL, "arg and signature disagree?"); | 2638 assert(exact_klass == NULL, "obj and signature disagree?"); |
2623 // sometimes the type of the signature is better than the best type | 2639 // sometimes the type of the signature is better than the best type |
2624 // the compiler has | 2640 // the compiler has |
2625 exact_klass = exact_signature_k; | 2641 exact_klass = exact_signature_k; |
2626 do_update = exact_klass == NULL || ciTypeEntries::valid_ciklass(profiled_k) != exact_klass; | 2642 } |
2627 } | 2643 if (callee_signature_k != NULL && |
2644 callee_signature_k != signature_at_call_k) { | |
2645 ciKlass* improved_klass = callee_signature_k->exact_klass(); | |
2646 if (improved_klass == NULL) { | |
2647 improved_klass = comp->cha_exact_type(callee_signature_k); | |
2648 } | |
2649 if (improved_klass != NULL && exact_klass != improved_klass) { | |
2650 assert(exact_klass == NULL, "obj and signature disagree?"); | |
2651 exact_klass = exact_signature_k; | |
2652 } | |
2653 } | |
2654 do_update = exact_klass == NULL || ciTypeEntries::valid_ciklass(profiled_k) != exact_klass; | |
2628 } | 2655 } |
2629 | 2656 |
2630 if (!do_null && !do_update) { | 2657 if (!do_null && !do_update) { |
2631 return result; | 2658 return result; |
2632 } | 2659 } |
2638 LIR_Address* base_type_address = new LIR_Address(mdp, md_base_offset, T_ADDRESS); | 2665 LIR_Address* base_type_address = new LIR_Address(mdp, md_base_offset, T_ADDRESS); |
2639 mdp = new_pointer_register(); | 2666 mdp = new_pointer_register(); |
2640 __ leal(LIR_OprFact::address(base_type_address), mdp); | 2667 __ leal(LIR_OprFact::address(base_type_address), mdp); |
2641 } | 2668 } |
2642 } | 2669 } |
2643 LIRItem value(arg, this); | 2670 LIRItem value(obj, this); |
2644 value.load_item(); | 2671 value.load_item(); |
2645 __ profile_type(new LIR_Address(mdp, md_offset, T_METADATA), | 2672 __ profile_type(new LIR_Address(mdp, md_offset, T_METADATA), |
2646 value.result(), exact_klass, profiled_k, new_pointer_register(), not_null, exact_signature_k != NULL); | 2673 value.result(), exact_klass, profiled_k, new_pointer_register(), not_null, exact_signature_k != NULL); |
2647 return result; | 2674 return result; |
2648 } | 2675 } |
2663 assert(!src->is_illegal(), "check"); | 2690 assert(!src->is_illegal(), "check"); |
2664 BasicType t = src->type(); | 2691 BasicType t = src->type(); |
2665 if (t == T_OBJECT || t == T_ARRAY) { | 2692 if (t == T_OBJECT || t == T_ARRAY) { |
2666 intptr_t profiled_k = parameters->type(j); | 2693 intptr_t profiled_k = parameters->type(j); |
2667 Local* local = x->state()->local_at(java_index)->as_Local(); | 2694 Local* local = x->state()->local_at(java_index)->as_Local(); |
2668 ciKlass* exact = profile_arg_type(md, md->byte_offset_of_slot(parameters_type_data, ParametersTypeData::type_offset(0)), | 2695 ciKlass* exact = profile_type(md, md->byte_offset_of_slot(parameters_type_data, ParametersTypeData::type_offset(0)), |
2669 in_bytes(ParametersTypeData::type_offset(j)) - in_bytes(ParametersTypeData::type_offset(0)), | 2696 in_bytes(ParametersTypeData::type_offset(j)) - in_bytes(ParametersTypeData::type_offset(0)), |
2670 profiled_k, local, mdp, false, local->declared_type()->as_klass()); | 2697 profiled_k, local, mdp, false, local->declared_type()->as_klass(), NULL); |
2671 // If the profile is known statically set it once for all and do not emit any code | 2698 // If the profile is known statically set it once for all and do not emit any code |
2672 if (exact != NULL) { | 2699 if (exact != NULL) { |
2673 md->set_parameter_type(j, exact); | 2700 md->set_parameter_type(j, exact); |
2674 } | 2701 } |
2675 j++; | 2702 j++; |
3127 ciTypeStackSlotEntries* args = data->is_CallTypeData() ? ((ciCallTypeData*)data)->args() : ((ciVirtualCallTypeData*)data)->args(); | 3154 ciTypeStackSlotEntries* args = data->is_CallTypeData() ? ((ciCallTypeData*)data)->args() : ((ciVirtualCallTypeData*)data)->args(); |
3128 | 3155 |
3129 Bytecodes::Code bc = x->method()->java_code_at_bci(bci); | 3156 Bytecodes::Code bc = x->method()->java_code_at_bci(bci); |
3130 int start = 0; | 3157 int start = 0; |
3131 int stop = data->is_CallTypeData() ? ((ciCallTypeData*)data)->number_of_arguments() : ((ciVirtualCallTypeData*)data)->number_of_arguments(); | 3158 int stop = data->is_CallTypeData() ? ((ciCallTypeData*)data)->number_of_arguments() : ((ciVirtualCallTypeData*)data)->number_of_arguments(); |
3132 if (x->nb_profiled_args() < stop) { | 3159 if (x->inlined() && x->callee()->is_static() && Bytecodes::has_receiver(bc)) { |
3133 // if called through method handle invoke, some arguments may have been popped | 3160 // first argument is not profiled at call (method handle invoke) |
3134 stop = x->nb_profiled_args(); | 3161 assert(x->method()->raw_code_at_bci(bci) == Bytecodes::_invokehandle, "invokehandle expected"); |
3135 } | 3162 start = 1; |
3136 ciSignature* sig = x->callee()->signature(); | 3163 } |
3164 ciSignature* callee_signature = x->callee()->signature(); | |
3137 // method handle call to virtual method | 3165 // method handle call to virtual method |
3138 bool has_receiver = x->inlined() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc); | 3166 bool has_receiver = x->inlined() && !x->callee()->is_static() && !Bytecodes::has_receiver(bc); |
3139 ciSignatureStream sig_stream(sig, has_receiver ? x->callee()->holder() : NULL); | 3167 ciSignatureStream callee_signature_stream(callee_signature, has_receiver ? x->callee()->holder() : NULL); |
3140 for (int i = 0; i < stop; i++) { | 3168 |
3169 bool ignored_will_link; | |
3170 ciSignature* signature_at_call = NULL; | |
3171 x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); | |
3172 ciSignatureStream signature_at_call_stream(signature_at_call); | |
3173 | |
3174 // if called through method handle invoke, some arguments may have been popped | |
3175 for (int i = 0; i < stop && i+start < x->nb_profiled_args(); i++) { | |
3141 int off = in_bytes(TypeEntriesAtCall::argument_type_offset(i)) - in_bytes(TypeEntriesAtCall::args_data_offset()); | 3176 int off = in_bytes(TypeEntriesAtCall::argument_type_offset(i)) - in_bytes(TypeEntriesAtCall::args_data_offset()); |
3142 ciKlass* exact = profile_arg_type(md, base_offset, off, | 3177 ciKlass* exact = profile_type(md, base_offset, off, |
3143 args->type(i), x->profiled_arg_at(i+start), mdp, | 3178 args->type(i), x->profiled_arg_at(i+start), mdp, |
3144 !x->arg_needs_null_check(i+start), sig_stream.next_klass()); | 3179 !x->arg_needs_null_check(i+start), |
3180 signature_at_call_stream.next_klass(), callee_signature_stream.next_klass()); | |
3145 if (exact != NULL) { | 3181 if (exact != NULL) { |
3146 md->set_argument_type(bci, i, exact); | 3182 md->set_argument_type(bci, i, exact); |
3147 } | 3183 } |
3148 } | 3184 } |
3149 } else { | 3185 } else { |
3174 Value arg = x->recv(); | 3210 Value arg = x->recv(); |
3175 bool not_null = false; | 3211 bool not_null = false; |
3176 int bci = x->bci_of_invoke(); | 3212 int bci = x->bci_of_invoke(); |
3177 Bytecodes::Code bc = x->method()->java_code_at_bci(bci); | 3213 Bytecodes::Code bc = x->method()->java_code_at_bci(bci); |
3178 // The first parameter is the receiver so that's what we start | 3214 // The first parameter is the receiver so that's what we start |
3179 // with if it exists. On exception if method handle call to | 3215 // with if it exists. One exception is method handle call to |
3180 // virtual method has receiver in the args list | 3216 // virtual method: the receiver is in the args list |
3181 if (arg == NULL || !Bytecodes::has_receiver(bc)) { | 3217 if (arg == NULL || !Bytecodes::has_receiver(bc)) { |
3182 i = 1; | 3218 i = 1; |
3183 arg = x->profiled_arg_at(0); | 3219 arg = x->profiled_arg_at(0); |
3184 not_null = !x->arg_needs_null_check(0); | 3220 not_null = !x->arg_needs_null_check(0); |
3185 } | 3221 } |
3186 int k = 0; // to iterate on the profile data | 3222 int k = 0; // to iterate on the profile data |
3187 for (;;) { | 3223 for (;;) { |
3188 intptr_t profiled_k = parameters->type(k); | 3224 intptr_t profiled_k = parameters->type(k); |
3189 ciKlass* exact = profile_arg_type(md, md->byte_offset_of_slot(parameters_type_data, ParametersTypeData::type_offset(0)), | 3225 ciKlass* exact = profile_type(md, md->byte_offset_of_slot(parameters_type_data, ParametersTypeData::type_offset(0)), |
3190 in_bytes(ParametersTypeData::type_offset(k)) - in_bytes(ParametersTypeData::type_offset(0)), | 3226 in_bytes(ParametersTypeData::type_offset(k)) - in_bytes(ParametersTypeData::type_offset(0)), |
3191 profiled_k, arg, mdp, not_null, sig_stream.next_klass()); | 3227 profiled_k, arg, mdp, not_null, sig_stream.next_klass(), NULL); |
3192 // If the profile is known statically set it once for all and do not emit any code | 3228 // If the profile is known statically set it once for all and do not emit any code |
3193 if (exact != NULL) { | 3229 if (exact != NULL) { |
3194 md->set_parameter_type(k, exact); | 3230 md->set_parameter_type(k, exact); |
3195 } | 3231 } |
3196 k++; | 3232 k++; |
3245 ciMethodData* md = x->method()->method_data_or_null(); | 3281 ciMethodData* md = x->method()->method_data_or_null(); |
3246 ciProfileData* data = md->bci_to_data(bci); | 3282 ciProfileData* data = md->bci_to_data(bci); |
3247 assert(data->is_CallTypeData() || data->is_VirtualCallTypeData(), "wrong profile data type"); | 3283 assert(data->is_CallTypeData() || data->is_VirtualCallTypeData(), "wrong profile data type"); |
3248 ciReturnTypeEntry* ret = data->is_CallTypeData() ? ((ciCallTypeData*)data)->ret() : ((ciVirtualCallTypeData*)data)->ret(); | 3284 ciReturnTypeEntry* ret = data->is_CallTypeData() ? ((ciCallTypeData*)data)->ret() : ((ciVirtualCallTypeData*)data)->ret(); |
3249 LIR_Opr mdp = LIR_OprFact::illegalOpr; | 3285 LIR_Opr mdp = LIR_OprFact::illegalOpr; |
3250 ciKlass* exact = profile_arg_type(md, 0, md->byte_offset_of_slot(data, ret->type_offset()), | 3286 |
3251 ret->type(), x->ret(), mdp, | 3287 bool ignored_will_link; |
3252 !x->needs_null_check(), x->callee()->signature()->return_type()->as_klass()); | 3288 ciSignature* signature_at_call = NULL; |
3289 x->method()->get_method_at_bci(bci, ignored_will_link, &signature_at_call); | |
3290 | |
3291 ciKlass* exact = profile_type(md, 0, md->byte_offset_of_slot(data, ret->type_offset()), | |
3292 ret->type(), x->ret(), mdp, | |
3293 !x->needs_null_check(), | |
3294 signature_at_call->return_type()->as_klass(), | |
3295 x->callee()->signature()->return_type()->as_klass()); | |
3253 if (exact != NULL) { | 3296 if (exact != NULL) { |
3254 md->set_return_type(bci, exact); | 3297 md->set_return_type(bci, exact); |
3255 } | 3298 } |
3256 } | 3299 } |
3257 | 3300 |