comparison src/share/vm/opto/lcm.cpp @ 1151:1271af4ec18c

6912517: JIT bug compiles out (and stops running) code that needs to be run. Causes NPE. Summary: Add missing check that value is used in memory expression in instructions with embedded load. Reviewed-by: never, jrose
author kvn
date Thu, 07 Jan 2010 16:26:31 -0800
parents 97125851f396
children c18cbe5936b8 3657cb01ffc5
comparison
equal deleted inserted replaced
1150:f62a22282a47 1151:1271af4ec18c
118 case Op_LoadKlass: 118 case Op_LoadKlass:
119 case Op_LoadNKlass: 119 case Op_LoadNKlass:
120 case Op_LoadRange: 120 case Op_LoadRange:
121 case Op_LoadD_unaligned: 121 case Op_LoadD_unaligned:
122 case Op_LoadL_unaligned: 122 case Op_LoadL_unaligned:
123 assert(mach->in(2) == val, "should be address");
123 break; 124 break;
124 case Op_StoreB: 125 case Op_StoreB:
125 case Op_StoreC: 126 case Op_StoreC:
126 case Op_StoreCM: 127 case Op_StoreCM:
127 case Op_StoreD: 128 case Op_StoreD:
144 // embedded loads 145 // embedded loads
145 continue; 146 continue;
146 default: // Also check for embedded loads 147 default: // Also check for embedded loads
147 if( !mach->needs_anti_dependence_check() ) 148 if( !mach->needs_anti_dependence_check() )
148 continue; // Not an memory op; skip it 149 continue; // Not an memory op; skip it
150 {
151 // Check that value is used in memory address.
152 Node* base;
153 Node* index;
154 const MachOper* oper = mach->memory_inputs(base, index);
155 if (oper == NULL || oper == (MachOper*)-1) {
156 continue; // Not an memory op; skip it
157 }
158 if (val == base ||
159 val == index && val->bottom_type()->isa_narrowoop()) {
160 break; // Found it
161 } else {
162 continue; // Skip it
163 }
164 }
149 break; 165 break;
150 } 166 }
151 // check if the offset is not too high for implicit exception 167 // check if the offset is not too high for implicit exception
152 { 168 {
153 intptr_t offset = 0; 169 intptr_t offset = 0;