comparison src/share/vm/c1/c1_GraphBuilder.cpp @ 3844:ce3e1d4dc416

7060619: C1 should respect inline and dontinline directives from CompilerOracle Reviewed-by: kvn, iveresov
author never
date Thu, 28 Jul 2011 13:03:39 -0700
parents 2c359f27615c
children de847cac9235
comparison
equal deleted inserted replaced
3843:d17bd0b18663 3844:ce3e1d4dc416
3031 clear_inline_bailout(); 3031 clear_inline_bailout();
3032 3032
3033 if (callee->should_exclude()) { 3033 if (callee->should_exclude()) {
3034 // callee is excluded 3034 // callee is excluded
3035 INLINE_BAILOUT("excluded by CompilerOracle") 3035 INLINE_BAILOUT("excluded by CompilerOracle")
3036 } else if (callee->should_not_inline()) {
3037 // callee is excluded
3038 INLINE_BAILOUT("disallowed by CompilerOracle")
3036 } else if (!callee->can_be_compiled()) { 3039 } else if (!callee->can_be_compiled()) {
3037 // callee is not compilable (prob. has breakpoints) 3040 // callee is not compilable (prob. has breakpoints)
3038 INLINE_BAILOUT("not compilable") 3041 INLINE_BAILOUT("not compilable")
3039 } else if (callee->intrinsic_id() != vmIntrinsics::_none && try_inline_intrinsics(callee)) { 3042 } else if (callee->intrinsic_id() != vmIntrinsics::_none && try_inline_intrinsics(callee)) {
3040 // intrinsics can be native or not 3043 // intrinsics can be native or not
3408 if (!callee->has_balanced_monitors()) INLINE_BAILOUT("callee's monitors do not match"); 3411 if (!callee->has_balanced_monitors()) INLINE_BAILOUT("callee's monitors do not match");
3409 3412
3410 // Proper inlining of methods with jsrs requires a little more work. 3413 // Proper inlining of methods with jsrs requires a little more work.
3411 if (callee->has_jsrs() ) INLINE_BAILOUT("jsrs not handled properly by inliner yet"); 3414 if (callee->has_jsrs() ) INLINE_BAILOUT("jsrs not handled properly by inliner yet");
3412 3415
3413 // now perform tests that are based on flag settings
3414 if (inline_level() > MaxInlineLevel ) INLINE_BAILOUT("too-deep inlining");
3415 if (recursive_inline_level(callee) > MaxRecursiveInlineLevel) INLINE_BAILOUT("too-deep recursive inlining");
3416 if (callee->code_size() > max_inline_size() ) INLINE_BAILOUT("callee is too large");
3417
3418 // don't inline throwable methods unless the inlining tree is rooted in a throwable class
3419 if (callee->name() == ciSymbol::object_initializer_name() &&
3420 callee->holder()->is_subclass_of(ciEnv::current()->Throwable_klass())) {
3421 // Throwable constructor call
3422 IRScope* top = scope();
3423 while (top->caller() != NULL) {
3424 top = top->caller();
3425 }
3426 if (!top->method()->holder()->is_subclass_of(ciEnv::current()->Throwable_klass())) {
3427 INLINE_BAILOUT("don't inline Throwable constructors");
3428 }
3429 }
3430
3431 // When SSE2 is used on intel, then no special handling is needed 3416 // When SSE2 is used on intel, then no special handling is needed
3432 // for strictfp because the enum-constant is fixed at compile time, 3417 // for strictfp because the enum-constant is fixed at compile time,
3433 // the check for UseSSE2 is needed here 3418 // the check for UseSSE2 is needed here
3434 if (strict_fp_requires_explicit_rounding && UseSSE < 2 && method()->is_strict() != callee->is_strict()) { 3419 if (strict_fp_requires_explicit_rounding && UseSSE < 2 && method()->is_strict() != callee->is_strict()) {
3435 INLINE_BAILOUT("caller and callee have different strict fp requirements"); 3420 INLINE_BAILOUT("caller and callee have different strict fp requirements");
3436 } 3421 }
3437 3422
3438 if (compilation()->env()->num_inlined_bytecodes() > DesiredMethodLimit) {
3439 INLINE_BAILOUT("total inlining greater than DesiredMethodLimit");
3440 }
3441
3442 if (is_profiling() && !callee->ensure_method_data()) { 3423 if (is_profiling() && !callee->ensure_method_data()) {
3443 INLINE_BAILOUT("mdo allocation failed"); 3424 INLINE_BAILOUT("mdo allocation failed");
3444 } 3425 }
3426
3427 // now perform tests that are based on flag settings
3428 if (callee->should_inline()) {
3429 // ignore heuristic controls on inlining
3430 } else {
3431 if (inline_level() > MaxInlineLevel ) INLINE_BAILOUT("too-deep inlining");
3432 if (recursive_inline_level(callee) > MaxRecursiveInlineLevel) INLINE_BAILOUT("too-deep recursive inlining");
3433 if (callee->code_size() > max_inline_size() ) INLINE_BAILOUT("callee is too large");
3434
3435 // don't inline throwable methods unless the inlining tree is rooted in a throwable class
3436 if (callee->name() == ciSymbol::object_initializer_name() &&
3437 callee->holder()->is_subclass_of(ciEnv::current()->Throwable_klass())) {
3438 // Throwable constructor call
3439 IRScope* top = scope();
3440 while (top->caller() != NULL) {
3441 top = top->caller();
3442 }
3443 if (!top->method()->holder()->is_subclass_of(ciEnv::current()->Throwable_klass())) {
3444 INLINE_BAILOUT("don't inline Throwable constructors");
3445 }
3446 }
3447
3448 if (compilation()->env()->num_inlined_bytecodes() > DesiredMethodLimit) {
3449 INLINE_BAILOUT("total inlining greater than DesiredMethodLimit");
3450 }
3451 }
3452
3445 #ifndef PRODUCT 3453 #ifndef PRODUCT
3446 // printing 3454 // printing
3447 if (PrintInlining) { 3455 if (PrintInlining) {
3448 print_inline_result(callee, true); 3456 print_inline_result(callee, true);
3449 } 3457 }