comparison src/share/vm/opto/doCall.cpp @ 2405:3d58a4983660

7022998: JSR 292 recursive method handle calls inline themselves infinitely Reviewed-by: never, kvn
author twisti
date Mon, 28 Mar 2011 03:58:07 -0700
parents f95d63e2154a
children 4124a5a27707
comparison
equal deleted inserted replaced
2404:b40d4fa697bf 2405:3d58a4983660
1 /* 1 /*
2 * Copyright (c) 1998, 2010, Oracle and/or its affiliates. All rights reserved. 2 * Copyright (c) 1998, 2011, Oracle and/or its affiliates. All rights reserved.
3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. 3 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4 * 4 *
5 * This code is free software; you can redistribute it and/or modify it 5 * This code is free software; you can redistribute it and/or modify it
6 * under the terms of the GNU General Public License version 2 only, as 6 * under the terms of the GNU General Public License version 2 only, as
7 * published by the Free Software Foundation. 7 * published by the Free Software Foundation.
25 #include "precompiled.hpp" 25 #include "precompiled.hpp"
26 #include "ci/ciCPCache.hpp" 26 #include "ci/ciCPCache.hpp"
27 #include "ci/ciCallSite.hpp" 27 #include "ci/ciCallSite.hpp"
28 #include "ci/ciMethodHandle.hpp" 28 #include "ci/ciMethodHandle.hpp"
29 #include "classfile/vmSymbols.hpp" 29 #include "classfile/vmSymbols.hpp"
30 #include "compiler/compileBroker.hpp"
30 #include "compiler/compileLog.hpp" 31 #include "compiler/compileLog.hpp"
31 #include "interpreter/linkResolver.hpp" 32 #include "interpreter/linkResolver.hpp"
32 #include "opto/addnode.hpp" 33 #include "opto/addnode.hpp"
33 #include "opto/callGenerator.hpp" 34 #include "opto/callGenerator.hpp"
34 #include "opto/cfgnode.hpp" 35 #include "opto/cfgnode.hpp"
41 #include "runtime/sharedRuntime.hpp" 42 #include "runtime/sharedRuntime.hpp"
42 43
43 #ifndef PRODUCT 44 #ifndef PRODUCT
44 void trace_type_profile(ciMethod *method, int depth, int bci, ciMethod *prof_method, ciKlass *prof_klass, int site_count, int receiver_count) { 45 void trace_type_profile(ciMethod *method, int depth, int bci, ciMethod *prof_method, ciKlass *prof_klass, int site_count, int receiver_count) {
45 if (TraceTypeProfile || PrintInlining || PrintOptoInlining) { 46 if (TraceTypeProfile || PrintInlining || PrintOptoInlining) {
46 tty->print(" "); 47 if (!PrintInlining) {
47 for( int i = 0; i < depth; i++ ) tty->print(" "); 48 if (!PrintOpto && !PrintCompilation) {
48 if (!PrintOpto) { 49 method->print_short_name();
49 method->print_short_name(); 50 tty->cr();
50 tty->print(" ->"); 51 }
51 } 52 CompileTask::print_inlining(prof_method, depth, bci);
52 tty->print(" @ %d ", bci); 53 }
53 prof_method->print_short_name(); 54 CompileTask::print_inline_indent(depth);
54 tty->print(" >>TypeProfile (%d/%d counts) = ", receiver_count, site_count); 55 tty->print(" \\-> TypeProfile (%d/%d counts) = ", receiver_count, site_count);
55 prof_klass->name()->print_symbol(); 56 prof_klass->name()->print_symbol();
56 tty->print_cr(" (%d bytes)", prof_method->code_size()); 57 tty->cr();
57 } 58 }
58 } 59 }
59 #endif 60 #endif
60 61
61 CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual, 62 CallGenerator* Compile::call_generator(ciMethod* call_method, int vtable_index, bool call_is_virtual,
267 // in case of polymorphic virtual call site. 268 // in case of polymorphic virtual call site.
268 miss_cg = CallGenerator::for_virtual_call(call_method, vtable_index); 269 miss_cg = CallGenerator::for_virtual_call(call_method, vtable_index);
269 } 270 }
270 if (miss_cg != NULL) { 271 if (miss_cg != NULL) {
271 if (next_hit_cg != NULL) { 272 if (next_hit_cg != NULL) {
272 NOT_PRODUCT(trace_type_profile(jvms->method(), jvms->depth(), jvms->bci(), next_receiver_method, profile.receiver(1), site_count, profile.receiver_count(1))); 273 NOT_PRODUCT(trace_type_profile(jvms->method(), jvms->depth() - 1, jvms->bci(), next_receiver_method, profile.receiver(1), site_count, profile.receiver_count(1)));
273 // We don't need to record dependency on a receiver here and below. 274 // We don't need to record dependency on a receiver here and below.
274 // Whenever we inline, the dependency is added by Parse::Parse(). 275 // Whenever we inline, the dependency is added by Parse::Parse().
275 miss_cg = CallGenerator::for_predicted_call(profile.receiver(1), miss_cg, next_hit_cg, PROB_MAX); 276 miss_cg = CallGenerator::for_predicted_call(profile.receiver(1), miss_cg, next_hit_cg, PROB_MAX);
276 } 277 }
277 if (miss_cg != NULL) { 278 if (miss_cg != NULL) {
278 NOT_PRODUCT(trace_type_profile(jvms->method(), jvms->depth(), jvms->bci(), receiver_method, profile.receiver(0), site_count, receiver_count)); 279 NOT_PRODUCT(trace_type_profile(jvms->method(), jvms->depth() - 1, jvms->bci(), receiver_method, profile.receiver(0), site_count, receiver_count));
279 cg = CallGenerator::for_predicted_call(profile.receiver(0), miss_cg, hit_cg, profile.receiver_prob(0)); 280 cg = CallGenerator::for_predicted_call(profile.receiver(0), miss_cg, hit_cg, profile.receiver_prob(0));
280 if (cg != NULL) return cg; 281 if (cg != NULL) return cg;
281 } 282 }
282 } 283 }
283 } 284 }