Mercurial > hg > truffle
comparison src/share/vm/opto/graphKit.cpp @ 372:be41fa651400
Merge
author | rasbold |
---|---|
date | Tue, 30 Sep 2008 15:53:55 -0700 |
parents | 5f44674206d3 194b8e3a2fc4 |
children | 82a980778b92 1b9fc6e3171b |
comparison
equal
deleted
inserted
replaced
365:5f44674206d3 | 372:be41fa651400 |
---|---|
585 _sp = kit->sp(); | 585 _sp = kit->sp(); |
586 kit->set_map(clone_map ? kit->clone_map() : NULL); | 586 kit->set_map(clone_map ? kit->clone_map() : NULL); |
587 #ifdef ASSERT | 587 #ifdef ASSERT |
588 _bci = kit->bci(); | 588 _bci = kit->bci(); |
589 Parse* parser = kit->is_Parse(); | 589 Parse* parser = kit->is_Parse(); |
590 int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->pre_order(); | 590 int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->rpo(); |
591 _block = block; | 591 _block = block; |
592 #endif | 592 #endif |
593 } | 593 } |
594 PreserveJVMState::~PreserveJVMState() { | 594 PreserveJVMState::~PreserveJVMState() { |
595 GraphKit* kit = _kit; | 595 GraphKit* kit = _kit; |
596 #ifdef ASSERT | 596 #ifdef ASSERT |
597 assert(kit->bci() == _bci, "bci must not shift"); | 597 assert(kit->bci() == _bci, "bci must not shift"); |
598 Parse* parser = kit->is_Parse(); | 598 Parse* parser = kit->is_Parse(); |
599 int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->pre_order(); | 599 int block = (parser == NULL || parser->block() == NULL) ? -1 : parser->block()->rpo(); |
600 assert(block == _block, "block must not shift"); | 600 assert(block == _block, "block must not shift"); |
601 #endif | 601 #endif |
602 kit->set_map(_map); | 602 kit->set_map(_map); |
603 kit->set_sp(_sp); | 603 kit->set_sp(_sp); |
604 } | 604 } |
1047 } | 1047 } |
1048 | 1048 |
1049 //-------------------------load_array_length----------------------------------- | 1049 //-------------------------load_array_length----------------------------------- |
1050 Node* GraphKit::load_array_length(Node* array) { | 1050 Node* GraphKit::load_array_length(Node* array) { |
1051 // Special-case a fresh allocation to avoid building nodes: | 1051 // Special-case a fresh allocation to avoid building nodes: |
1052 Node* alen = AllocateArrayNode::Ideal_length(array, &_gvn); | 1052 AllocateArrayNode* alloc = AllocateArrayNode::Ideal_array_allocation(array, &_gvn); |
1053 if (alen != NULL) return alen; | 1053 Node *alen; |
1054 Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes()); | 1054 if (alloc == NULL) { |
1055 return _gvn.transform( new (C, 3) LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS)); | 1055 Node *r_adr = basic_plus_adr(array, arrayOopDesc::length_offset_in_bytes()); |
1056 alen = _gvn.transform( new (C, 3) LoadRangeNode(0, immutable_memory(), r_adr, TypeInt::POS)); | |
1057 } else { | |
1058 alen = alloc->Ideal_length(); | |
1059 Node* ccast = alloc->make_ideal_length(_gvn.type(array)->is_aryptr(), &_gvn); | |
1060 if (ccast != alen) { | |
1061 alen = _gvn.transform(ccast); | |
1062 } | |
1063 } | |
1064 return alen; | |
1056 } | 1065 } |
1057 | 1066 |
1058 //------------------------------do_null_check---------------------------------- | 1067 //------------------------------do_null_check---------------------------------- |
1059 // Helper function to do a NULL pointer check. Returned value is | 1068 // Helper function to do a NULL pointer check. Returned value is |
1060 // the incoming address with NULL casted away. You are allowed to use the | 1069 // the incoming address with NULL casted away. You are allowed to use the |
2845 javaoop = _gvn.transform(javaoop); | 2854 javaoop = _gvn.transform(javaoop); |
2846 C->set_recent_alloc(control(), javaoop); | 2855 C->set_recent_alloc(control(), javaoop); |
2847 assert(just_allocated_object(control()) == javaoop, "just allocated"); | 2856 assert(just_allocated_object(control()) == javaoop, "just allocated"); |
2848 | 2857 |
2849 #ifdef ASSERT | 2858 #ifdef ASSERT |
2850 { // Verify that the AllocateNode::Ideal_foo recognizers work: | 2859 { // Verify that the AllocateNode::Ideal_allocation recognizers work: |
2851 Node* kn = alloc->in(AllocateNode::KlassNode); | 2860 assert(AllocateNode::Ideal_allocation(rawoop, &_gvn) == alloc, |
2852 Node* ln = alloc->in(AllocateNode::ALength); | 2861 "Ideal_allocation works"); |
2853 assert(AllocateNode::Ideal_klass(rawoop, &_gvn) == kn, | 2862 assert(AllocateNode::Ideal_allocation(javaoop, &_gvn) == alloc, |
2854 "Ideal_klass works"); | 2863 "Ideal_allocation works"); |
2855 assert(AllocateNode::Ideal_klass(javaoop, &_gvn) == kn, | |
2856 "Ideal_klass works"); | |
2857 if (alloc->is_AllocateArray()) { | 2864 if (alloc->is_AllocateArray()) { |
2858 assert(AllocateArrayNode::Ideal_length(rawoop, &_gvn) == ln, | 2865 assert(AllocateArrayNode::Ideal_array_allocation(rawoop, &_gvn) == alloc->as_AllocateArray(), |
2859 "Ideal_length works"); | 2866 "Ideal_allocation works"); |
2860 assert(AllocateArrayNode::Ideal_length(javaoop, &_gvn) == ln, | 2867 assert(AllocateArrayNode::Ideal_array_allocation(javaoop, &_gvn) == alloc->as_AllocateArray(), |
2861 "Ideal_length works"); | 2868 "Ideal_allocation works"); |
2862 } else { | 2869 } else { |
2863 assert(ln->is_top(), "no length, please"); | 2870 assert(alloc->in(AllocateNode::ALength)->is_top(), "no length, please"); |
2864 } | 2871 } |
2865 } | 2872 } |
2866 #endif //ASSERT | 2873 #endif //ASSERT |
2867 | 2874 |
2868 return javaoop; | 2875 return javaoop; |
3107 // Cast to correct type. Note that the klass_node may be constant or not, | 3114 // Cast to correct type. Note that the klass_node may be constant or not, |
3108 // and in the latter case the actual array type will be inexact also. | 3115 // and in the latter case the actual array type will be inexact also. |
3109 // (This happens via a non-constant argument to inline_native_newArray.) | 3116 // (This happens via a non-constant argument to inline_native_newArray.) |
3110 // In any case, the value of klass_node provides the desired array type. | 3117 // In any case, the value of klass_node provides the desired array type. |
3111 const TypeInt* length_type = _gvn.find_int_type(length); | 3118 const TypeInt* length_type = _gvn.find_int_type(length); |
3112 const TypeInt* narrow_length_type = NULL; | |
3113 const TypeOopPtr* ary_type = _gvn.type(klass_node)->is_klassptr()->as_instance_type(); | 3119 const TypeOopPtr* ary_type = _gvn.type(klass_node)->is_klassptr()->as_instance_type(); |
3114 if (ary_type->isa_aryptr() && length_type != NULL) { | 3120 if (ary_type->isa_aryptr() && length_type != NULL) { |
3115 // Try to get a better type than POS for the size | 3121 // Try to get a better type than POS for the size |
3116 ary_type = ary_type->is_aryptr()->cast_to_size(length_type); | 3122 ary_type = ary_type->is_aryptr()->cast_to_size(length_type); |
3117 narrow_length_type = ary_type->is_aryptr()->size(); | |
3118 if (narrow_length_type == length_type) | |
3119 narrow_length_type = NULL; | |
3120 } | 3123 } |
3121 | 3124 |
3122 Node* javaoop = set_output_for_allocation(alloc, ary_type, raw_mem_only); | 3125 Node* javaoop = set_output_for_allocation(alloc, ary_type, raw_mem_only); |
3123 | 3126 |
3124 // Cast length on remaining path to be positive: | 3127 // Cast length on remaining path to be as narrow as possible |
3125 if (narrow_length_type != NULL) { | 3128 if (map()->find_edge(length) >= 0) { |
3126 Node* ccast = new (C, 2) CastIINode(length, narrow_length_type); | 3129 Node* ccast = alloc->make_ideal_length(ary_type, &_gvn); |
3127 ccast->set_req(0, control()); | 3130 if (ccast != length) { |
3128 _gvn.set_type_bottom(ccast); | 3131 _gvn.set_type_bottom(ccast); |
3129 record_for_igvn(ccast); | 3132 record_for_igvn(ccast); |
3130 if (map()->find_edge(length) >= 0) { | |
3131 replace_in_map(length, ccast); | 3133 replace_in_map(length, ccast); |
3132 } | 3134 } |
3133 } | 3135 } |
3134 | 3136 |
3135 return javaoop; | 3137 return javaoop; |