comparison src/share/vm/opto/memnode.cpp @ 583:5d75ab5f6698

6807084: AutoBox elimination is broken with compressed oops Summary: Add checks for DecodeN nodes into AutoBox elimination code. Reviewed-by: never
author kvn
date Wed, 18 Feb 2009 13:53:42 -0800
parents dca06e7f503d
children 98cb887364d3
comparison
equal deleted inserted replaced
570:dca06e7f503d 583:5d75ab5f6698
1064 allocation_index = i; 1064 allocation_index = i;
1065 load_index = 3 - allocation_index; 1065 load_index = 3 - allocation_index;
1066 break; 1066 break;
1067 } 1067 }
1068 } 1068 }
1069 LoadNode* load = NULL; 1069 bool has_load = ( allocation != NULL &&
1070 if (allocation != NULL && base->in(load_index)->is_Load()) { 1070 (base->in(load_index)->is_Load() ||
1071 load = base->in(load_index)->as_Load(); 1071 base->in(load_index)->is_DecodeN() &&
1072 } 1072 base->in(load_index)->in(1)->is_Load()) );
1073 if (load != NULL && in(Memory)->is_Phi() && in(Memory)->in(0) == base->in(0)) { 1073 if (has_load && in(Memory)->is_Phi() && in(Memory)->in(0) == base->in(0)) {
1074 // Push the loads from the phi that comes from valueOf up 1074 // Push the loads from the phi that comes from valueOf up
1075 // through it to allow elimination of the loads and the recovery 1075 // through it to allow elimination of the loads and the recovery
1076 // of the original value. 1076 // of the original value.
1077 Node* mem_phi = in(Memory); 1077 Node* mem_phi = in(Memory);
1078 Node* offset = in(Address)->in(AddPNode::Offset); 1078 Node* offset = in(Address)->in(AddPNode::Offset);
1104 PhiNode* result = PhiNode::make_blank(region, this); 1104 PhiNode* result = PhiNode::make_blank(region, this);
1105 result->set_req(allocation_index, in1); 1105 result->set_req(allocation_index, in1);
1106 result->set_req(load_index, in2); 1106 result->set_req(load_index, in2);
1107 return result; 1107 return result;
1108 } 1108 }
1109 } else if (base->is_Load()) { 1109 } else if (base->is_Load() ||
1110 base->is_DecodeN() && base->in(1)->is_Load()) {
1111 if (base->is_DecodeN()) {
1112 // Get LoadN node which loads cached Integer object
1113 base = base->in(1);
1114 }
1110 // Eliminate the load of Integer.value for integers from the cache 1115 // Eliminate the load of Integer.value for integers from the cache
1111 // array by deriving the value from the index into the array. 1116 // array by deriving the value from the index into the array.
1112 // Capture the offset of the load and then reverse the computation. 1117 // Capture the offset of the load and then reverse the computation.
1113 Node* load_base = base->in(Address)->in(AddPNode::Base); 1118 Node* load_base = base->in(Address)->in(AddPNode::Base);
1119 if (load_base->is_DecodeN()) {
1120 // Get LoadN node which loads IntegerCache.cache field
1121 load_base = load_base->in(1);
1122 }
1114 if (load_base != NULL) { 1123 if (load_base != NULL) {
1115 Compile::AliasType* atp = phase->C->alias_type(load_base->adr_type()); 1124 Compile::AliasType* atp = phase->C->alias_type(load_base->adr_type());
1116 intptr_t cache_offset; 1125 intptr_t cache_offset;
1117 int shift = -1; 1126 int shift = -1;
1118 Node* cache = NULL; 1127 Node* cache = NULL;