311 Type::Initialize(compile); |
311 Type::Initialize(compile); |
312 _compile->set_scratch_buffer_blob(NULL); |
312 _compile->set_scratch_buffer_blob(NULL); |
313 _compile->begin_method(); |
313 _compile->begin_method(); |
314 } |
314 } |
315 CompileWrapper::~CompileWrapper() { |
315 CompileWrapper::~CompileWrapper() { |
316 if (_compile->failing()) { |
|
317 _compile->print_method("Failed"); |
|
318 } |
|
319 _compile->end_method(); |
316 _compile->end_method(); |
320 if (_compile->scratch_buffer_blob() != NULL) |
317 if (_compile->scratch_buffer_blob() != NULL) |
321 BufferBlob::free(_compile->scratch_buffer_blob()); |
318 BufferBlob::free(_compile->scratch_buffer_blob()); |
322 _compile->env()->set_compiler_data(NULL); |
319 _compile->env()->set_compiler_data(NULL); |
323 } |
320 } |
601 } |
598 } |
602 // Now optimize |
599 // Now optimize |
603 Optimize(); |
600 Optimize(); |
604 if (failing()) return; |
601 if (failing()) return; |
605 NOT_PRODUCT( verify_graph_edges(); ) |
602 NOT_PRODUCT( verify_graph_edges(); ) |
|
603 |
|
604 print_method("Before Matching"); |
606 |
605 |
607 #ifndef PRODUCT |
606 #ifndef PRODUCT |
608 if (PrintIdeal) { |
607 if (PrintIdeal) { |
609 ttyLocker ttyl; // keep the following output all in one block |
608 ttyLocker ttyl; // keep the following output all in one block |
610 // This output goes directly to the tty, not the compiler log. |
609 // This output goes directly to the tty, not the compiler log. |
1068 if( to && _AliasLevel >= 2 && to != TypeOopPtr::BOTTOM ) { |
1067 if( to && _AliasLevel >= 2 && to != TypeOopPtr::BOTTOM ) { |
1069 if( ptr == TypePtr::Constant ) { |
1068 if( ptr == TypePtr::Constant ) { |
1070 // No constant oop pointers (such as Strings); they alias with |
1069 // No constant oop pointers (such as Strings); they alias with |
1071 // unknown strings. |
1070 // unknown strings. |
1072 tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset); |
1071 tj = to = TypeInstPtr::make(TypePtr::BotPTR,to->klass(),false,0,offset); |
1073 } else if( to->is_instance_field() ) { |
1072 } else if( to->is_known_instance_field() ) { |
1074 tj = to; // Keep NotNull and klass_is_exact for instance type |
1073 tj = to; // Keep NotNull and klass_is_exact for instance type |
1075 } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) { |
1074 } else if( ptr == TypePtr::NotNull || to->klass_is_exact() ) { |
1076 // During the 2nd round of IterGVN, NotNull castings are removed. |
1075 // During the 2nd round of IterGVN, NotNull castings are removed. |
1077 // Make sure the Bottom and NotNull variants alias the same. |
1076 // Make sure the Bottom and NotNull variants alias the same. |
1078 // Also, make sure exact and non-exact variants alias the same. |
1077 // Also, make sure exact and non-exact variants alias the same. |
1189 _index = i; |
1188 _index = i; |
1190 _adr_type = at; |
1189 _adr_type = at; |
1191 _field = NULL; |
1190 _field = NULL; |
1192 _is_rewritable = true; // default |
1191 _is_rewritable = true; // default |
1193 const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL; |
1192 const TypeOopPtr *atoop = (at != NULL) ? at->isa_oopptr() : NULL; |
1194 if (atoop != NULL && atoop->is_instance()) { |
1193 if (atoop != NULL && atoop->is_known_instance()) { |
1195 const TypeOopPtr *gt = atoop->cast_to_instance(TypeOopPtr::UNKNOWN_INSTANCE); |
1194 const TypeOopPtr *gt = atoop->cast_to_instance_id(TypeOopPtr::InstanceBot); |
1196 _general_index = Compile::current()->get_alias_index(gt); |
1195 _general_index = Compile::current()->get_alias_index(gt); |
1197 } else { |
1196 } else { |
1198 _general_index = 0; |
1197 _general_index = 0; |
1199 } |
1198 } |
1200 } |
1199 } |
1479 ResourceMark rm; |
1478 ResourceMark rm; |
1480 int loop_opts_cnt; |
1479 int loop_opts_cnt; |
1481 |
1480 |
1482 NOT_PRODUCT( verify_graph_edges(); ) |
1481 NOT_PRODUCT( verify_graph_edges(); ) |
1483 |
1482 |
1484 print_method("Start"); |
1483 print_method("After Parsing"); |
1485 |
1484 |
1486 { |
1485 { |
1487 // Iterative Global Value Numbering, including ideal transforms |
1486 // Iterative Global Value Numbering, including ideal transforms |
1488 // Initialize IterGVN with types and values from parse-time GVN |
1487 // Initialize IterGVN with types and values from parse-time GVN |
1489 PhaseIterGVN igvn(initial_gvn()); |
1488 PhaseIterGVN igvn(initial_gvn()); |
1686 TracePhase t2a("output", &_t_output, true); |
1685 TracePhase t2a("output", &_t_output, true); |
1687 NOT_PRODUCT( TraceTime t2b(NULL, &_t_codeGeneration, TimeCompiler, false); ) |
1686 NOT_PRODUCT( TraceTime t2b(NULL, &_t_codeGeneration, TimeCompiler, false); ) |
1688 Output(); |
1687 Output(); |
1689 } |
1688 } |
1690 |
1689 |
1691 print_method("End"); |
1690 print_method("Final Code"); |
1692 |
1691 |
1693 // He's dead, Jim. |
1692 // He's dead, Jim. |
1694 _cfg = (PhaseCFG*)0xdeadbeef; |
1693 _cfg = (PhaseCFG*)0xdeadbeef; |
1695 _regalloc = (PhaseChaitin*)0xdeadbeef; |
1694 _regalloc = (PhaseChaitin*)0xdeadbeef; |
1696 } |
1695 } |
2015 Node* r = C->root(); |
2014 Node* r = C->root(); |
2016 uint cnt = r->outcnt(); |
2015 uint cnt = r->outcnt(); |
2017 for (uint i = 0; i < cnt; i++) { |
2016 for (uint i = 0; i < cnt; i++) { |
2018 Node* m = r->raw_out(i); |
2017 Node* m = r->raw_out(i); |
2019 if (m!= NULL && m->Opcode() == Op_ConN && |
2018 if (m!= NULL && m->Opcode() == Op_ConN && |
2020 m->bottom_type()->is_narrowoop()->make_oopptr() == t) { |
2019 m->bottom_type()->make_ptr() == t) { |
2021 nn = m; |
2020 nn = m; |
2022 break; |
2021 break; |
2023 } |
2022 } |
2024 } |
2023 } |
2025 if (nn != NULL) { |
2024 if (nn != NULL) { |
2068 if (i >= in1->outcnt()) { |
2067 if (i >= in1->outcnt()) { |
2069 in2 = ConNode::make(C, TypeNarrowOop::NULL_PTR); |
2068 in2 = ConNode::make(C, TypeNarrowOop::NULL_PTR); |
2070 } |
2069 } |
2071 } |
2070 } |
2072 } else if (t->isa_oopptr()) { |
2071 } else if (t->isa_oopptr()) { |
2073 in2 = ConNode::make(C, t->is_oopptr()->make_narrowoop()); |
2072 in2 = ConNode::make(C, t->make_narrowoop()); |
2074 } |
2073 } |
2075 } |
2074 } |
2076 if( in2 != NULL ) { |
2075 if( in2 != NULL ) { |
2077 Node* cmpN = new (C, 3) CmpNNode(n->in(1)->in(1), in2); |
2076 Node* cmpN = new (C, 3) CmpNNode(n->in(1)->in(1), in2); |
2078 n->subsume_by( cmpN ); |
2077 n->subsume_by( cmpN ); |
2464 } |
2463 } |
2465 if (_failure_reason == NULL) { |
2464 if (_failure_reason == NULL) { |
2466 // Record the first failure reason. |
2465 // Record the first failure reason. |
2467 _failure_reason = reason; |
2466 _failure_reason = reason; |
2468 } |
2467 } |
|
2468 if (!C->failure_reason_is(C2Compiler::retry_no_subsuming_loads())) { |
|
2469 C->print_method(_failure_reason); |
|
2470 } |
2469 _root = NULL; // flush the graph, too |
2471 _root = NULL; // flush the graph, too |
2470 } |
2472 } |
2471 |
2473 |
2472 Compile::TracePhase::TracePhase(const char* name, elapsedTimer* accumulator, bool dolog) |
2474 Compile::TracePhase::TracePhase(const char* name, elapsedTimer* accumulator, bool dolog) |
2473 : TraceTime(NULL, accumulator, false NOT_PRODUCT( || TimeCompiler ), false) |
2475 : TraceTime(NULL, accumulator, false NOT_PRODUCT( || TimeCompiler ), false) |